@nyris/nyris-webapp 0.3.57 → 0.3.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/asset-manifest.json +15 -16
- package/build/index.html +1 -1
- package/build/js/settings.example.js +1 -0
- package/build/static/css/main.cb6e2cfd.css +4 -0
- package/build/static/css/main.cb6e2cfd.css.map +1 -0
- package/build/static/js/main.a1e24447.js +3 -0
- package/build/static/js/{main.5143aa56.js.LICENSE.txt → main.a1e24447.js.LICENSE.txt} +55 -0
- package/build/static/js/main.a1e24447.js.map +1 -0
- package/build/static/media/camera_simple.bff4194954bbb5f4bc33bd99014a93e8.svg +3 -0
- package/build/static/media/collpase.50dae91fff891c46b10dfc281344d0ef.svg +6 -0
- package/build/static/media/crop.0676ebbbdc1375ed67e32bba890ce941.svg +3 -0
- package/build/static/media/{download.8007f7c72e2080a9ffa96fa63d480dcf.svg → download.a8452bc23334e9f8e53fe1225742d216.svg} +1 -1
- package/build/static/media/gallery.15d1f3308921480a8c9d96d9a77c9966.svg +3 -0
- package/build/static/media/{logout.b544fcd2969edf431a1e998333119834.svg → logout.bab56bd407f25eb34d6eff401a436ce1.svg} +1 -1
- package/build/static/media/next-arrow.b13263d05d107ceb5e99bc4fabb41279.svg +3 -0
- package/build/static/media/plus.329672cb2feb55345490589e91481b88.svg +3 -0
- package/package.json +8 -5
- package/public/index.html +0 -3
- package/public/js/settings.example.js +1 -0
- package/src/Router.tsx +2 -2
- package/src/Store/Store.ts +2 -0
- package/src/Store/requestStore.ts +70 -0
- package/src/Store/resultStore.ts +25 -0
- package/src/Store/search/Search.ts +2 -33
- package/src/Store/search/search.initialState.ts +1 -4
- package/src/Store/search/types.ts +0 -5
- package/src/common/assets/icons/arrow_enter.svg +3 -0
- package/src/common/assets/icons/camera_simple.svg +3 -0
- package/src/common/assets/icons/collpase.svg +6 -0
- package/src/common/assets/icons/crop.svg +3 -0
- package/src/common/assets/icons/download.svg +1 -1
- package/src/common/assets/icons/gallery.svg +3 -0
- package/src/common/assets/icons/logout.svg +1 -1
- package/src/common/assets/icons/next-arrow.svg +3 -0
- package/src/common/assets/icons/plus.svg +3 -0
- package/src/components/CadenasWebViewer.tsx +1 -1
- package/src/components/DragDropFile.tsx +17 -77
- package/src/components/Experience-visual-search/ExperienceVisualSearch.tsx +47 -71
- package/src/components/Feedback.tsx +23 -9
- package/src/components/GoBackButton.tsx +15 -18
- package/src/components/HeaderMobile.tsx +342 -246
- package/src/components/ImageCaptureHelpModal.tsx +63 -65
- package/src/components/ImagePreview.tsx +564 -0
- package/src/components/Inquiry/InquiryBanner.tsx +1 -1
- package/src/components/Inquiry/InquiryModal.tsx +4 -7
- package/src/components/Layout.tsx +9 -18
- package/src/components/MobileLayout.tsx +51 -0
- package/src/components/MobilePostFilter.tsx +9 -3
- package/src/components/PanelResult/PostFilterAlgolia.tsx +4 -32
- package/src/components/PanelResult/expandable-panel.tsx +3 -16
- package/src/components/PanelResult/virtual-state-results.ts +17 -22
- package/src/components/ProductDetailView.tsx +1 -1
- package/src/components/SidePanel.tsx +7 -97
- package/src/components/UploadDisclaimer.tsx +85 -0
- package/src/components/appMobile.scss +2 -2
- package/src/components/common.scss +57 -27
- package/src/components/drawer/cameraCustom.tsx +389 -231
- package/src/components/icon-label/icon-label.tsx +1 -1
- package/src/components/input/inputSearch.tsx +197 -338
- package/src/components/pre-filter/index.tsx +70 -72
- package/src/components/results/ItemResult.tsx +34 -17
- package/src/components/rfq/RfqBanner.tsx +1 -4
- package/src/components/rfq/RfqModal.tsx +10 -10
- package/src/hooks/useFilteredRegions.ts +1 -1
- package/src/hooks/useImageSearch.ts +189 -0
- package/src/hooks/useSearchOrRedirect.ts +84 -0
- package/src/index.css +4 -0
- package/src/page/landingPage/Home.tsx +49 -0
- package/src/page/landingPage/{AppMD.tsx → HomeDesktop.tsx} +7 -34
- package/src/page/landingPage/{AppMobile.tsx → HomeMobile.tsx} +8 -37
- package/src/page/landingPage/common.scss +9 -1
- package/src/page/result/index.tsx +118 -232
- package/src/services/Feedback.ts +4 -5
- package/src/services/image.ts +19 -0
- package/src/types.ts +9 -7
- package/src/utils.ts +44 -0
- package/tailwind.config.js +54 -0
- package/build/static/css/main.67965609.css +0 -2
- package/build/static/css/main.67965609.css.map +0 -1
- package/build/static/js/main.5143aa56.js +0 -3
- package/build/static/js/main.5143aa56.js.map +0 -1
- package/build/static/media/arrow_down.f417689ce292978a8292a7f00407fdd5.svg +0 -3
- package/build/static/media/arrow_left.73d03a534eaf9b99ab196e0fb67da602.svg +0 -3
- package/build/static/media/arrow_right.59a4594a3a1657037537dbae1eee0251.svg +0 -3
- package/build/static/media/arrow_up.85dbe70bc51ec32c8894a06499330f14.svg +0 -3
- package/build/static/media/home.9ffb65a9c0be8fc5a502ba05cf5f719c.svg +0 -3
- package/build/static/media/icon_camera_mobile.6772053c4dfef487255649d2a05cc9d4.svg +0 -3
- package/build/static/media/reverse_camera.cee0200b151941cc83c182167a85d667.svg +0 -5
- package/src/App.tsx +0 -18
- package/src/components/AppMobile.tsx +0 -117
- package/src/components/FooterMobile.tsx +0 -230
- package/src/components/ImagePreviewMobile.tsx +0 -237
- /package/build/static/media/{add.2b72cedb98c4c89c954266d2356c166c.svg → add-rounded.2b72cedb98c4c89c954266d2356c166c.svg} +0 -0
- /package/src/common/assets/icons/{add.svg → add-rounded.svg} +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useHistory } from 'react-router-dom';
|
|
4
|
+
|
|
5
|
+
import HeaderMobile from './HeaderMobile';
|
|
6
|
+
|
|
7
|
+
function AppMobile({ children }: { children: ReactNode }) {
|
|
8
|
+
const history = useHistory();
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<>
|
|
12
|
+
<div className="wrap-mobile">
|
|
13
|
+
<div className="box-header-mobile-main">
|
|
14
|
+
<HeaderMobile />
|
|
15
|
+
</div>
|
|
16
|
+
<div
|
|
17
|
+
style={{
|
|
18
|
+
display: 'flex',
|
|
19
|
+
flexGrow: 1,
|
|
20
|
+
flexDirection: 'column',
|
|
21
|
+
overflowY: 'auto',
|
|
22
|
+
overflowX: 'hidden',
|
|
23
|
+
height: '100%',
|
|
24
|
+
backgroundColor: '#fff',
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
{children}
|
|
28
|
+
</div>
|
|
29
|
+
{history.location?.pathname === '/' && (
|
|
30
|
+
<footer className="h-11 w-full flex justify-center items-center bg-white">
|
|
31
|
+
<a
|
|
32
|
+
href={'https://www.nyris.io'}
|
|
33
|
+
target="_blank"
|
|
34
|
+
rel="noreferrer"
|
|
35
|
+
className="text-[#AAABB5] md:text-[#2B2C46]"
|
|
36
|
+
>
|
|
37
|
+
<p className="text-xs font-normal text-[#AAABB5] inline">
|
|
38
|
+
Powered by
|
|
39
|
+
</p>
|
|
40
|
+
<p className="text-xs font-bold text-[#AAABB5] inline pl-0.5">
|
|
41
|
+
nyris®
|
|
42
|
+
</p>
|
|
43
|
+
</a>
|
|
44
|
+
</footer>
|
|
45
|
+
)}
|
|
46
|
+
</div>
|
|
47
|
+
</>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default AppMobile;
|
|
@@ -9,19 +9,25 @@ import { useAppSelector } from 'Store/Store';
|
|
|
9
9
|
interface Props {
|
|
10
10
|
allSearchResults: any;
|
|
11
11
|
onApply: any;
|
|
12
|
+
isOpenFilter: boolean;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
function MobilePostFilter(props: Props) {
|
|
15
16
|
const settings = useAppSelector(state => state.settings);
|
|
17
|
+
const { isOpenFilter, allSearchResults, onApply } = props;
|
|
18
|
+
|
|
16
19
|
return (
|
|
17
20
|
<>
|
|
18
21
|
{settings.algolia.enabled && (
|
|
19
22
|
<PostFilterPanelAlgolia
|
|
20
|
-
disjunctiveFacets={
|
|
21
|
-
onApply={
|
|
23
|
+
disjunctiveFacets={allSearchResults?.disjunctiveFacets}
|
|
24
|
+
onApply={onApply}
|
|
22
25
|
/>
|
|
23
26
|
)}
|
|
24
|
-
|
|
27
|
+
|
|
28
|
+
{!settings.algolia.enabled && isOpenFilter && (
|
|
29
|
+
<PostFilterPanel onApply={onApply} />
|
|
30
|
+
)}
|
|
25
31
|
</>
|
|
26
32
|
);
|
|
27
33
|
}
|
|
@@ -3,10 +3,7 @@ import { DynamicWidgetsCT } from 'components/dynamic-widgets/dynamic-widgets';
|
|
|
3
3
|
import IconLabel from 'components/icon-label/icon-label';
|
|
4
4
|
import { atom, useAtom } from 'jotai';
|
|
5
5
|
import React, { useCallback, useEffect, useMemo } from 'react';
|
|
6
|
-
import type {
|
|
7
|
-
CurrentRefinementsProvided,
|
|
8
|
-
SearchResults,
|
|
9
|
-
} from 'react-instantsearch-core';
|
|
6
|
+
import type { CurrentRefinementsProvided } from 'react-instantsearch-core';
|
|
10
7
|
import { RefinementList } from 'react-instantsearch-dom';
|
|
11
8
|
import { useMediaQuery } from 'react-responsive';
|
|
12
9
|
import { useHistory } from 'react-router-dom';
|
|
@@ -30,33 +27,6 @@ export type Panels = {
|
|
|
30
27
|
[key: string]: boolean;
|
|
31
28
|
};
|
|
32
29
|
|
|
33
|
-
export function useHasRefinements(
|
|
34
|
-
searchResults: SearchResults,
|
|
35
|
-
attributes: string[] = [],
|
|
36
|
-
) {
|
|
37
|
-
const facets = useMemo(() => {
|
|
38
|
-
const disjunctiveFacets = searchResults?.disjunctiveFacets || [];
|
|
39
|
-
const hierarchicalFacets = searchResults?.hierarchicalFacets || [];
|
|
40
|
-
return [...disjunctiveFacets, ...hierarchicalFacets];
|
|
41
|
-
}, [searchResults]);
|
|
42
|
-
|
|
43
|
-
const hasRefinements = useMemo(() => {
|
|
44
|
-
let found = !attributes.length;
|
|
45
|
-
|
|
46
|
-
facets.forEach(facet => {
|
|
47
|
-
attributes?.forEach(attribute => {
|
|
48
|
-
if (facet.name === attribute && facet.data) {
|
|
49
|
-
found = true;
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
return found;
|
|
55
|
-
}, [facets, attributes]);
|
|
56
|
-
|
|
57
|
-
return hasRefinements;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
30
|
function togglePanels(panels: Panels, val: boolean) {
|
|
61
31
|
return Object.keys(panels).reduce(
|
|
62
32
|
(acc, panelKey) => ({ ...acc, [panelKey]: val }),
|
|
@@ -229,7 +199,9 @@ export default function PostFilterPanelAlgolia({
|
|
|
229
199
|
}}
|
|
230
200
|
>
|
|
231
201
|
<Button
|
|
232
|
-
onClick={
|
|
202
|
+
onClick={() => {
|
|
203
|
+
onApply();
|
|
204
|
+
}}
|
|
233
205
|
style={{
|
|
234
206
|
width: '32px',
|
|
235
207
|
height: '32px',
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import { Button } from '@material-ui/core';
|
|
2
2
|
import { ReactComponent as RemoveIcon } from 'common/assets/icons/minus.svg';
|
|
3
|
-
import { ReactComponent as AddIcon } from 'common/assets/icons/add.svg';
|
|
3
|
+
import { ReactComponent as AddIcon } from 'common/assets/icons/add-rounded.svg';
|
|
4
4
|
import classNames from 'classnames';
|
|
5
5
|
import { Collapse } from 'components/collapse/collapse';
|
|
6
|
-
import { useAtomValue } from 'jotai/utils';
|
|
7
6
|
import type { MouseEventHandler } from 'react';
|
|
8
7
|
import React, { memo } from 'react';
|
|
9
|
-
import type {
|
|
10
|
-
CurrentRefinementsProvided,
|
|
11
|
-
SearchResults,
|
|
12
|
-
} from 'react-instantsearch-core';
|
|
8
|
+
import type { CurrentRefinementsProvided } from 'react-instantsearch-core';
|
|
13
9
|
import { connectCurrentRefinements } from 'react-instantsearch-dom';
|
|
14
10
|
import { useMediaQuery } from 'react-responsive';
|
|
15
|
-
import { useHasRefinements } from './PostFilterAlgolia';
|
|
16
|
-
import { searchResultsAtom } from './virtual-state-results';
|
|
17
11
|
|
|
18
12
|
export type ExpandablePanelProps = CurrentRefinementsProvided & {
|
|
19
13
|
children: React.ReactNode;
|
|
@@ -34,19 +28,12 @@ function ExpandablePanelComponent({
|
|
|
34
28
|
items,
|
|
35
29
|
onToggle,
|
|
36
30
|
}: ExpandablePanelProps) {
|
|
37
|
-
const searchResults = useAtomValue(searchResultsAtom) as SearchResults;
|
|
38
|
-
const hasRefinements = useHasRefinements(searchResults, attributes);
|
|
39
31
|
const isMobile = useMediaQuery({ query: '(max-width: 776px)' });
|
|
40
32
|
|
|
41
33
|
return (
|
|
42
34
|
<div>
|
|
43
35
|
<div
|
|
44
|
-
className={classNames(
|
|
45
|
-
{
|
|
46
|
-
hidden: !hasRefinements,
|
|
47
|
-
},
|
|
48
|
-
className,
|
|
49
|
-
)}
|
|
36
|
+
className={classNames(className)}
|
|
50
37
|
style={{
|
|
51
38
|
borderTop: !isMobile ? '1px solid #d3d4d8' : '',
|
|
52
39
|
}}
|
|
@@ -1,44 +1,39 @@
|
|
|
1
|
-
import { atom } from 'jotai'
|
|
2
|
-
import { selectAtom, useUpdateAtom } from 'jotai/utils'
|
|
3
|
-
import { memo, useEffect } from 'react'
|
|
4
|
-
import isEqual from 'react-fast-compare'
|
|
5
|
-
import type { StateResultsProvided } from 'react-instantsearch-core'
|
|
6
|
-
import { connectStateResults } from 'react-instantsearch-dom'
|
|
1
|
+
import { atom } from 'jotai';
|
|
2
|
+
import { selectAtom, useUpdateAtom } from 'jotai/utils';
|
|
3
|
+
import { memo, useEffect } from 'react';
|
|
4
|
+
import isEqual from 'react-fast-compare';
|
|
5
|
+
import type { StateResultsProvided } from 'react-instantsearch-core';
|
|
6
|
+
import { connectStateResults } from 'react-instantsearch-dom';
|
|
7
7
|
|
|
8
|
-
export type VirtualStateResultsProps = StateResultsProvided
|
|
8
|
+
export type VirtualStateResultsProps = StateResultsProvided;
|
|
9
9
|
|
|
10
10
|
export type VirtualStateResultsAtomValue = Partial<
|
|
11
11
|
Pick<VirtualStateResultsProps, 'isSearchStalled' | 'searchResults'>
|
|
12
|
-
|
|
12
|
+
>;
|
|
13
13
|
|
|
14
14
|
export const stateResultsAtom = atom<VirtualStateResultsAtomValue>({
|
|
15
15
|
searchResults: undefined,
|
|
16
16
|
isSearchStalled: undefined,
|
|
17
|
-
})
|
|
17
|
+
});
|
|
18
18
|
|
|
19
|
-
export const searchResultsAtom = selectAtom(
|
|
20
|
-
stateResultsAtom,
|
|
21
|
-
({ searchResults }) => searchResults,
|
|
22
|
-
isEqual
|
|
23
|
-
)
|
|
24
19
|
export const isSearchStalledAtom = selectAtom(
|
|
25
20
|
stateResultsAtom,
|
|
26
|
-
({ isSearchStalled }) => isSearchStalled
|
|
27
|
-
)
|
|
21
|
+
({ isSearchStalled }) => isSearchStalled,
|
|
22
|
+
);
|
|
28
23
|
|
|
29
24
|
function VirtualStateResultsComponent({
|
|
30
25
|
searchResults,
|
|
31
26
|
isSearchStalled,
|
|
32
27
|
}: VirtualStateResultsProps) {
|
|
33
|
-
const setStateResults = useUpdateAtom(stateResultsAtom)
|
|
28
|
+
const setStateResults = useUpdateAtom(stateResultsAtom);
|
|
34
29
|
|
|
35
30
|
useEffect(() => {
|
|
36
|
-
setStateResults({ searchResults, isSearchStalled })
|
|
37
|
-
}, [setStateResults, searchResults, isSearchStalled])
|
|
31
|
+
setStateResults({ searchResults, isSearchStalled });
|
|
32
|
+
}, [setStateResults, searchResults, isSearchStalled]);
|
|
38
33
|
|
|
39
|
-
return null
|
|
34
|
+
return null;
|
|
40
35
|
}
|
|
41
36
|
|
|
42
37
|
export const VirtualStateResults = connectStateResults(
|
|
43
|
-
memo(VirtualStateResultsComponent, isEqual)
|
|
44
|
-
)
|
|
38
|
+
memo(VirtualStateResultsComponent, isEqual),
|
|
39
|
+
);
|
|
@@ -1,40 +1,20 @@
|
|
|
1
|
-
import { Button, Typography } from '@material-ui/core';
|
|
2
|
-
import { RectCoords } from '@nyris/nyris-api';
|
|
3
|
-
import { Preview } from '@nyris/nyris-react-components';
|
|
4
|
-
import React, { useState } from 'react';
|
|
5
1
|
import PostFilterPanel from './PanelResult/PostFilter';
|
|
6
2
|
import PostFilterPanelAlgolia from './PanelResult/PostFilterAlgolia';
|
|
7
3
|
|
|
8
|
-
import { useTranslation } from 'react-i18next';
|
|
9
4
|
import { useAppSelector } from 'Store/Store';
|
|
10
|
-
import { ReactComponent as KeyboardArrowRightOutlinedIcon } from 'common/assets/icons/arrow_right.svg';
|
|
11
|
-
import { ReactComponent as KeyboardArrowLeftOutlinedIcon } from 'common/assets/icons/arrow_left.svg';
|
|
12
5
|
|
|
13
|
-
import
|
|
14
|
-
import { ReactComponent as IconInfo } from 'common/assets/icons/info-tooltip.svg';
|
|
6
|
+
import ImagePreview from './ImagePreview';
|
|
15
7
|
|
|
16
8
|
function SidePanel({
|
|
17
|
-
setImageSelection,
|
|
18
|
-
imageSelection,
|
|
19
|
-
debouncedOnImageSelectionChange,
|
|
20
|
-
filteredRegions,
|
|
21
|
-
showAdjustInfoBasedOnConfidence,
|
|
22
9
|
showAdjustInfo,
|
|
23
10
|
showPostFilter,
|
|
24
11
|
disjunctiveFacets,
|
|
25
12
|
}: {
|
|
26
|
-
setImageSelection: any;
|
|
27
|
-
imageSelection: any;
|
|
28
|
-
debouncedOnImageSelectionChange: any;
|
|
29
|
-
filteredRegions: any;
|
|
30
|
-
showAdjustInfoBasedOnConfidence: any;
|
|
31
13
|
showAdjustInfo: any;
|
|
32
14
|
showPostFilter: any;
|
|
33
15
|
allSearchResults: any;
|
|
34
16
|
disjunctiveFacets: any;
|
|
35
17
|
}) {
|
|
36
|
-
const { t } = useTranslation();
|
|
37
|
-
const [toggleColLeft, setToggleColLeft] = useState<boolean>(false);
|
|
38
18
|
const stateGlobal = useAppSelector(state => state);
|
|
39
19
|
const { search, settings } = stateGlobal;
|
|
40
20
|
|
|
@@ -42,35 +22,13 @@ function SidePanel({
|
|
|
42
22
|
|
|
43
23
|
return (
|
|
44
24
|
<div
|
|
45
|
-
className={`wrap-main-col-left
|
|
25
|
+
className={`wrap-main-col-left`}
|
|
46
26
|
style={{
|
|
47
27
|
display: 'flex',
|
|
48
28
|
flexDirection: 'column',
|
|
49
29
|
justifyContent: 'space-between',
|
|
50
30
|
}}
|
|
51
31
|
>
|
|
52
|
-
<div
|
|
53
|
-
className="box-toggle-coloumn"
|
|
54
|
-
style={{
|
|
55
|
-
right: '0px',
|
|
56
|
-
}}
|
|
57
|
-
>
|
|
58
|
-
<Button
|
|
59
|
-
style={{
|
|
60
|
-
color: '#55566b',
|
|
61
|
-
height: '32px',
|
|
62
|
-
}}
|
|
63
|
-
onClick={() => {
|
|
64
|
-
setToggleColLeft(!toggleColLeft);
|
|
65
|
-
}}
|
|
66
|
-
>
|
|
67
|
-
{toggleColLeft ? (
|
|
68
|
-
<KeyboardArrowRightOutlinedIcon />
|
|
69
|
-
) : (
|
|
70
|
-
<KeyboardArrowLeftOutlinedIcon />
|
|
71
|
-
)}
|
|
72
|
-
</Button>
|
|
73
|
-
</div>
|
|
74
32
|
<div>
|
|
75
33
|
{settings.preview && requestImage && (
|
|
76
34
|
<div className="col-left">
|
|
@@ -79,70 +37,22 @@ function SidePanel({
|
|
|
79
37
|
className="preview-item"
|
|
80
38
|
style={{
|
|
81
39
|
backgroundColor: 'white',
|
|
82
|
-
paddingTop: '32px',
|
|
83
40
|
width: '100%',
|
|
84
41
|
}}
|
|
85
42
|
>
|
|
86
43
|
<div
|
|
87
44
|
style={{
|
|
88
|
-
display: 'flex',
|
|
89
|
-
justifyContent: 'center',
|
|
90
|
-
backgroundColor: '#F3F3F5',
|
|
91
45
|
width: '100%',
|
|
92
|
-
paddingTop: '16px',
|
|
93
|
-
paddingBottom: '16px',
|
|
94
46
|
}}
|
|
95
47
|
>
|
|
96
|
-
<
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
>
|
|
102
|
-
<Preview
|
|
103
|
-
key={requestImage?.id}
|
|
104
|
-
onSelectionChange={(r: RectCoords) => {
|
|
105
|
-
debouncedOnImageSelectionChange(r);
|
|
106
|
-
}}
|
|
107
|
-
image={requestImage?.canvas}
|
|
108
|
-
selection={imageSelection || DEFAULT_REGION}
|
|
109
|
-
regions={filteredRegions}
|
|
110
|
-
dotColor={'#FBD914'}
|
|
111
|
-
minCropWidth={30}
|
|
112
|
-
minCropHeight={30}
|
|
113
|
-
rounded={true}
|
|
114
|
-
/>
|
|
115
|
-
</div>
|
|
48
|
+
<ImagePreview
|
|
49
|
+
showAdjustInfo={showAdjustInfo}
|
|
50
|
+
isExpanded={true}
|
|
51
|
+
isCameraUploadEnabled={false}
|
|
52
|
+
/>
|
|
116
53
|
</div>
|
|
117
54
|
</div>
|
|
118
55
|
</div>
|
|
119
|
-
{(showAdjustInfoBasedOnConfidence || showAdjustInfo) && (
|
|
120
|
-
<div
|
|
121
|
-
style={{
|
|
122
|
-
alignItems: 'center',
|
|
123
|
-
backgroundColor: '#3E36DC',
|
|
124
|
-
display: 'flex',
|
|
125
|
-
columnGap: '6px',
|
|
126
|
-
padding: '5px',
|
|
127
|
-
marginTop: 'auto',
|
|
128
|
-
position: 'absolute',
|
|
129
|
-
bottom: 0,
|
|
130
|
-
borderRadius: '16px',
|
|
131
|
-
}}
|
|
132
|
-
>
|
|
133
|
-
<IconInfo color="white" />
|
|
134
|
-
<Typography
|
|
135
|
-
style={{
|
|
136
|
-
fontSize: 10,
|
|
137
|
-
color: '#fff',
|
|
138
|
-
}}
|
|
139
|
-
>
|
|
140
|
-
{showAdjustInfo
|
|
141
|
-
? t('Crop the image for better results')
|
|
142
|
-
: 'Crop the image for better results'}
|
|
143
|
-
</Typography>
|
|
144
|
-
</div>
|
|
145
|
-
)}
|
|
146
56
|
</div>
|
|
147
57
|
)}
|
|
148
58
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { createPortal } from 'react-dom';
|
|
3
|
+
|
|
4
|
+
import { ReactComponent as CloseIcon } from 'common/assets/icons/close.svg';
|
|
5
|
+
import { makeFileHandler } from '@nyris/nyris-react-components';
|
|
6
|
+
|
|
7
|
+
function UploadDisclaimer({
|
|
8
|
+
onClose,
|
|
9
|
+
onContinue,
|
|
10
|
+
isMobile,
|
|
11
|
+
}: {
|
|
12
|
+
onClose: any;
|
|
13
|
+
onContinue: any;
|
|
14
|
+
isMobile: boolean;
|
|
15
|
+
}) {
|
|
16
|
+
const [dontShowAgain, setDontShowAgain] = useState(false);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
{createPortal(
|
|
21
|
+
<div className="fixed top-0 left-0 right-0 bottom-0 flex items-center justify-center bg-black/50 w-screen h-screen z-[9999]">
|
|
22
|
+
<div className="bg-white w-80">
|
|
23
|
+
<div className="p-4">
|
|
24
|
+
<div className="flex justify-between items-center">
|
|
25
|
+
<div className="font-bold text-xl">Replace Current Data?</div>
|
|
26
|
+
<CloseIcon
|
|
27
|
+
className="cursor-pointer"
|
|
28
|
+
width={12}
|
|
29
|
+
height={12}
|
|
30
|
+
onClick={onClose}
|
|
31
|
+
/>
|
|
32
|
+
</div>
|
|
33
|
+
<p className="text-sm mt-4">
|
|
34
|
+
Uploading a new image will overwrite your current search
|
|
35
|
+
parameters, text, and results. Are you sure you want to proceed?
|
|
36
|
+
</p>
|
|
37
|
+
<div className="mt-4 gap-x-2 flex">
|
|
38
|
+
<input
|
|
39
|
+
type="checkbox"
|
|
40
|
+
className="w-4"
|
|
41
|
+
onChange={e => {
|
|
42
|
+
setDontShowAgain(e.target.checked);
|
|
43
|
+
}}
|
|
44
|
+
/>
|
|
45
|
+
Don't show this again
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<div className="flex">
|
|
49
|
+
<button
|
|
50
|
+
className="w-1/2 h-16 p-4 text-start text-sm text-white bg-[#2B2C46]"
|
|
51
|
+
onClick={() => onClose()}
|
|
52
|
+
>
|
|
53
|
+
Cancel
|
|
54
|
+
</button>
|
|
55
|
+
<label
|
|
56
|
+
className="w-1/2 h-16 p-4 text-start text-sm text-white bg-[#E31B5D] cursor-pointer"
|
|
57
|
+
htmlFor={!isMobile ? 'nyris__upload-photo' : ''}
|
|
58
|
+
onClick={() => {
|
|
59
|
+
if (isMobile) {
|
|
60
|
+
onContinue({ dontShowAgain });
|
|
61
|
+
}
|
|
62
|
+
}}
|
|
63
|
+
>
|
|
64
|
+
Continue
|
|
65
|
+
</label>
|
|
66
|
+
<input
|
|
67
|
+
type="file"
|
|
68
|
+
name="take-picture"
|
|
69
|
+
id="nyris__upload-photo"
|
|
70
|
+
accept="image/jpeg,image/png,image/webp"
|
|
71
|
+
onChange={makeFileHandler(file =>
|
|
72
|
+
onContinue({ file, dontShowAgain }),
|
|
73
|
+
)}
|
|
74
|
+
style={{ display: 'none' }}
|
|
75
|
+
/>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>,
|
|
79
|
+
document.body,
|
|
80
|
+
)}
|
|
81
|
+
</>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export default UploadDisclaimer;
|
|
@@ -479,8 +479,8 @@
|
|
|
479
479
|
.modal-togggle-cam {
|
|
480
480
|
.wrap-camera {
|
|
481
481
|
position: relative;
|
|
482
|
-
height: 100vh;
|
|
483
|
-
height: calc(var(--vh, 1vh) * 100);
|
|
482
|
+
// height: 100vh;
|
|
483
|
+
// height: calc(var(--vh, 1vh) * 100);
|
|
484
484
|
display: flex;
|
|
485
485
|
justify-content: center;
|
|
486
486
|
align-items: center;
|
|
@@ -142,42 +142,49 @@
|
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
.feedback-floating {
|
|
145
|
+
position: fixed;
|
|
145
146
|
height: fit-content;
|
|
146
147
|
right: 18px;
|
|
147
|
-
position: absolute;
|
|
148
148
|
z-index: 201;
|
|
149
149
|
display: flex;
|
|
150
150
|
justify-content: flex-end;
|
|
151
|
+
bottom: 40px;
|
|
151
152
|
|
|
152
153
|
.feedback-section {
|
|
153
|
-
|
|
154
|
-
|
|
154
|
+
backdrop-filter: blur(2px);
|
|
155
|
+
border-radius: 24px;
|
|
156
|
+
min-width: 332px;
|
|
157
|
+
min-height: 48px;
|
|
158
|
+
|
|
155
159
|
@media screen and (max-width: 776px) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
bottom: 125px;
|
|
159
|
-
|
|
160
|
+
min-width: 300px;
|
|
161
|
+
min-height: 40px;
|
|
160
162
|
}
|
|
163
|
+
|
|
161
164
|
}
|
|
162
165
|
|
|
163
166
|
@media screen and (max-width: 776px) {
|
|
167
|
+
display: flex;
|
|
168
|
+
width: 100%;
|
|
169
|
+
justify-content: center;
|
|
164
170
|
margin-left: 0px;
|
|
165
171
|
height: fit-content !important;
|
|
166
|
-
|
|
167
|
-
|
|
172
|
+
bottom: 80px;
|
|
173
|
+
right: auto;
|
|
174
|
+
|
|
168
175
|
}
|
|
169
176
|
}
|
|
170
177
|
|
|
171
178
|
|
|
172
179
|
.feedback-wrapper {
|
|
173
|
-
background-color: #
|
|
180
|
+
// background-color: #e4e3ffed;
|
|
174
181
|
mix-blend-mode: multiply;
|
|
175
182
|
border-radius: 24px;
|
|
176
183
|
display: flex;
|
|
177
184
|
justify-content: center;
|
|
178
185
|
align-items: center;
|
|
179
|
-
padding-left:
|
|
180
|
-
padding-right:
|
|
186
|
+
padding-left: 24px;
|
|
187
|
+
padding-right: 8px;
|
|
181
188
|
padding-top: 8px;
|
|
182
189
|
padding-bottom: 8px;
|
|
183
190
|
width: fit-content;
|
|
@@ -188,14 +195,11 @@
|
|
|
188
195
|
flex-shrink: 0;
|
|
189
196
|
color: #2B2C46;
|
|
190
197
|
|
|
191
|
-
&:hover{
|
|
192
|
-
background-color: rgb(211, 209, 255, 0.97);
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
|
|
196
198
|
@media screen and (max-width: 776px) {
|
|
197
|
-
padding-left:
|
|
198
|
-
padding-right:
|
|
199
|
+
padding-left: 16px;
|
|
200
|
+
padding-right: 4px;
|
|
201
|
+
padding-right: 6px;
|
|
202
|
+
padding-top: 6px;
|
|
199
203
|
}
|
|
200
204
|
|
|
201
205
|
p{
|
|
@@ -207,13 +211,39 @@
|
|
|
207
211
|
}
|
|
208
212
|
|
|
209
213
|
.feedback-icon-wrapper {
|
|
210
|
-
width:
|
|
211
|
-
height:
|
|
214
|
+
min-width: 32px;
|
|
215
|
+
min-height: 32px;
|
|
212
216
|
border-radius: 100%;
|
|
213
217
|
display: flex;
|
|
214
218
|
justify-content: center;
|
|
215
219
|
align-items: center;
|
|
216
220
|
|
|
221
|
+
@media screen and (max-width: 776px) {
|
|
222
|
+
min-width: 28px;
|
|
223
|
+
min-height: 28px;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
&-close {
|
|
227
|
+
min-width: 32px;
|
|
228
|
+
min-height: 32px;
|
|
229
|
+
border-radius: 100%;
|
|
230
|
+
display: flex;
|
|
231
|
+
justify-content: center;
|
|
232
|
+
align-items: center;
|
|
233
|
+
|
|
234
|
+
@media screen and (max-width: 776px) {
|
|
235
|
+
min-width: 28px;
|
|
236
|
+
min-height: 28px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
&:hover {
|
|
240
|
+
background-color: #D3D1FF;
|
|
241
|
+
cursor: pointer;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
217
247
|
&:hover {
|
|
218
248
|
background-color: #FFF;
|
|
219
249
|
box-shadow: 0px 0px 7.04px 0px rgba(0, 0, 0, 0.10);
|
|
@@ -244,17 +274,17 @@
|
|
|
244
274
|
font-weight: 600;
|
|
245
275
|
color: #fff;
|
|
246
276
|
background-color: #2B2C46;
|
|
247
|
-
width:
|
|
248
|
-
|
|
249
|
-
padding-bottom: 16px;
|
|
277
|
+
width: 100%;
|
|
278
|
+
height: 100%;
|
|
250
279
|
text-align: center;
|
|
251
280
|
border-radius: 26px;
|
|
281
|
+
display: flex;
|
|
282
|
+
justify-content: center;
|
|
283
|
+
align-items: center;
|
|
252
284
|
|
|
253
285
|
@media screen and (max-width: 776px) {
|
|
254
286
|
font-size: 12px;
|
|
255
|
-
|
|
256
|
-
padding-bottom: 8px;
|
|
257
|
-
width: 264px;
|
|
287
|
+
|
|
258
288
|
}
|
|
259
289
|
}
|
|
260
290
|
|