@nyris/nyris-webapp 0.2.5 → 0.3.2

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.
Files changed (199) hide show
  1. package/build/asset-manifest.json +32 -18
  2. package/build/index.html +1 -1
  3. package/build/js/test.js +62 -0
  4. package/build/{precache-manifest.497998bf0df450969bab5608621be10a.js → precache-manifest.8f85a4fff2063a7498a608ec69549bb1.js} +89 -13
  5. package/build/service-worker.js +1 -1
  6. package/build/static/css/2.8285176a.chunk.css +2 -0
  7. package/build/static/css/2.8285176a.chunk.css.map +1 -0
  8. package/build/static/css/main.6676fe1f.chunk.css +2 -0
  9. package/build/static/css/main.6676fe1f.chunk.css.map +1 -0
  10. package/build/static/js/2.efc0ab83.chunk.js +3 -0
  11. package/build/static/js/2.efc0ab83.chunk.js.LICENSE.txt +133 -0
  12. package/build/static/js/2.efc0ab83.chunk.js.map +1 -0
  13. package/build/static/js/main.3bfed050.chunk.js +2 -0
  14. package/build/static/js/main.3bfed050.chunk.js.map +1 -0
  15. package/build/static/js/{runtime-main.f5553a9b.js → runtime-main.b418ff16.js} +1 -1
  16. package/build/static/js/{runtime-main.f5553a9b.js.map → runtime-main.b418ff16.js.map} +1 -1
  17. package/build/static/media/Fill.37094b44.svg +3 -0
  18. package/build/static/media/Montserrat-Bold.5a052e98.otf +0 -0
  19. package/build/static/media/Montserrat-Light.21789e89.otf +0 -0
  20. package/build/static/media/Montserrat-Medium.a53e0373.otf +0 -0
  21. package/build/static/media/Montserrat-Regular.71cdc681.otf +0 -0
  22. package/build/static/media/Montserrat-SemiBold.f613d915.otf +0 -0
  23. package/build/static/media/Rectangle.4dd8b747.png +0 -0
  24. package/build/static/media/admin.9529c7f6.svg +3 -0
  25. package/build/static/media/bg-support-page.6ac55268.svg +9 -0
  26. package/build/static/media/book_mark.8e294c0b.svg +3 -0
  27. package/build/static/media/icon_dislike.94607ca6.svg +3 -0
  28. package/build/static/media/icon_like.a4fb1b18.svg +3 -0
  29. package/build/static/media/icon_modal_image.3068d0ea.svg +21 -0
  30. package/build/static/media/icon_search_image.c2c728c0.svg +3 -0
  31. package/build/static/media/nyris_logo.22d8f250.svg +3 -0
  32. package/build/static/media/reload_icon.4b579a74.svg +3 -0
  33. package/build/static/media/save_search.bebaeebf.svg +3 -0
  34. package/build/static/media/support.289c3a3c.svg +3 -0
  35. package/build/static/media/translate_icon.f0492297.svg +3 -0
  36. package/package.json +30 -6
  37. package/public/js/test.js +62 -0
  38. package/src/App.css +27 -11
  39. package/src/App.tsx +19 -235
  40. package/src/Router.tsx +97 -0
  41. package/src/Store/Auth.ts +44 -0
  42. package/src/Store/Nyris.ts +77 -0
  43. package/src/Store/Search.ts +269 -0
  44. package/src/Store/Store.ts +46 -0
  45. package/src/Store/common.d.ts +10 -0
  46. package/src/{epics → Store/epics}/feedback.ts +0 -0
  47. package/src/{epics → Store/epics}/types.ts +1 -1
  48. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Bold.otf +0 -0
  49. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Light.otf +0 -0
  50. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Medium.otf +0 -0
  51. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Regular.otf +0 -0
  52. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-SemiBold.otf +0 -0
  53. package/src/{fonts → common/assets/fonts}/roboto-bold-webfont.woff +0 -0
  54. package/src/{fonts → common/assets/fonts}/roboto-bold-webfont.woff2 +0 -0
  55. package/src/{fonts → common/assets/fonts}/roboto-italic-webfont.woff +0 -0
  56. package/src/{fonts → common/assets/fonts}/roboto-italic-webfont.woff2 +0 -0
  57. package/src/{fonts → common/assets/fonts}/roboto-regular-webfont.woff +0 -0
  58. package/src/{fonts → common/assets/fonts}/roboto-regular-webfont.woff2 +0 -0
  59. package/src/{fonts → common/assets/fonts}/robotocondensed-bold-webfont.woff +0 -0
  60. package/src/{fonts → common/assets/fonts}/robotocondensed-bold-webfont.woff2 +0 -0
  61. package/src/{fonts → common/assets/fonts}/robotocondensed-bolditalic-webfont.woff +0 -0
  62. package/src/{fonts → common/assets/fonts}/robotocondensed-bolditalic-webfont.woff2 +0 -0
  63. package/src/common/assets/icons/Fill.png +0 -0
  64. package/src/common/assets/icons/Fill.svg +3 -0
  65. package/src/common/assets/icons/Icon_wechat.png +0 -0
  66. package/src/common/assets/icons/Icon_whatsapp.png +0 -0
  67. package/src/common/assets/icons/admin.png +0 -0
  68. package/src/common/assets/icons/admin.svg +3 -0
  69. package/src/common/assets/icons/book_mark.png +0 -0
  70. package/src/common/assets/icons/book_mark.svg +3 -0
  71. package/src/common/assets/icons/icon_barcode.png +0 -0
  72. package/src/common/assets/icons/icon_camera.png +0 -0
  73. package/src/common/assets/icons/icon_dislike.svg +3 -0
  74. package/src/common/assets/icons/icon_disslike.png +0 -0
  75. package/src/common/assets/icons/icon_email.png +0 -0
  76. package/src/common/assets/icons/icon_like.png +0 -0
  77. package/src/common/assets/icons/icon_like.svg +3 -0
  78. package/src/common/assets/icons/icon_modal_image.png +0 -0
  79. package/src/common/assets/icons/icon_modal_image.svg +21 -0
  80. package/src/common/assets/icons/icon_picture.png +0 -0
  81. package/src/common/assets/icons/icon_search_image.png +0 -0
  82. package/src/common/assets/icons/icon_search_image.svg +3 -0
  83. package/src/common/assets/icons/nyris_logo.svg +3 -0
  84. package/src/common/assets/icons/reload_icon.png +0 -0
  85. package/src/common/assets/icons/reload_icon.svg +3 -0
  86. package/src/common/assets/icons/save_search.png +0 -0
  87. package/src/common/assets/icons/save_search.svg +3 -0
  88. package/src/common/assets/icons/setting_search_icon.png +0 -0
  89. package/src/common/assets/icons/support.png +0 -0
  90. package/src/common/assets/icons/support.svg +3 -0
  91. package/src/common/assets/icons/translate_icon.png +0 -0
  92. package/src/common/assets/icons/translate_icon.svg +3 -0
  93. package/src/common/assets/icons/view_off.png +0 -0
  94. package/src/common/assets/images/Rectangle.png +0 -0
  95. package/src/common/assets/images/bg-support-page.svg +9 -0
  96. package/src/{images → common/assets/images}/fav/android-icon-192x192.png +0 -0
  97. package/src/{images → common/assets/images}/fav/apple-icon-114x114.png +0 -0
  98. package/src/{images → common/assets/images}/fav/apple-icon-120x120.png +0 -0
  99. package/src/{images → common/assets/images}/fav/apple-icon-144x144.png +0 -0
  100. package/src/{images → common/assets/images}/fav/apple-icon-152x152.png +0 -0
  101. package/src/{images → common/assets/images}/fav/apple-icon-180x180.png +0 -0
  102. package/src/{images → common/assets/images}/fav/apple-icon-57x57.png +0 -0
  103. package/src/{images → common/assets/images}/fav/apple-icon-60x60.png +0 -0
  104. package/src/{images → common/assets/images}/fav/apple-icon-72x72.png +0 -0
  105. package/src/{images → common/assets/images}/fav/apple-icon-76x76.png +0 -0
  106. package/src/{images → common/assets/images}/fav/browserconfig.xml +0 -0
  107. package/src/{images → common/assets/images}/fav/favicon-16x16.png +0 -0
  108. package/src/{images → common/assets/images}/fav/favicon-32x32.png +0 -0
  109. package/src/{images → common/assets/images}/fav/favicon-96x96.png +0 -0
  110. package/src/{images → common/assets/images}/fav/manifest.json +0 -0
  111. package/src/{images → common/assets/images}/ic_cam.png +0 -0
  112. package/src/{images → common/assets/images}/ic_cam.svg +0 -0
  113. package/src/{images → common/assets/images}/ic_cam_large.png +0 -0
  114. package/src/{images → common/assets/images}/ic_cam_large.svg +0 -0
  115. package/src/{images → common/assets/images}/ic_cam_large_noimage.png +0 -0
  116. package/src/{images → common/assets/images}/ic_close_feedback.png +0 -0
  117. package/src/{images → common/assets/images}/ic_close_feedback.svg +0 -0
  118. package/src/{images → common/assets/images}/ic_shopNow.png +0 -0
  119. package/src/{images → common/assets/images}/ic_shopNow.svg +0 -0
  120. package/src/{images → common/assets/images}/ic_shopNowLight.png +0 -0
  121. package/src/{images → common/assets/images}/ic_shopNowLight.svg +0 -0
  122. package/src/common/assets/images/image_test.png +0 -0
  123. package/src/{images → common/assets/images}/nyris_logo.png +0 -0
  124. package/src/{images → common/assets/images}/rewe.svg +0 -0
  125. package/src/{images → common/assets/images}/sectionTransBack.png +0 -0
  126. package/src/{images → common/assets/images}/sectionTransBack.svg +0 -0
  127. package/src/{images → common/assets/images}/sectionTransTop.png +0 -0
  128. package/src/{images → common/assets/images}/sectionTransTop.svg +0 -0
  129. package/src/components/DetailItem.tsx +175 -0
  130. package/src/components/DragDropFile.tsx +188 -0
  131. package/src/components/ExampleImages.tsx +32 -17
  132. package/src/components/Feedback.tsx +87 -48
  133. package/src/components/FilterComponent.tsx +33 -0
  134. package/src/components/Footer.tsx +29 -0
  135. package/src/components/FooterMD.tsx +54 -0
  136. package/src/components/FooterNewVersion.tsx +12 -0
  137. package/src/components/FooterResult.tsx +47 -0
  138. package/src/components/Header.tsx +35 -0
  139. package/src/components/HeaderMd.tsx +39 -0
  140. package/src/components/HeaderNewVersion.tsx +92 -0
  141. package/src/components/Layout.tsx +46 -0
  142. package/src/components/LoadingScreen/index.tsx +29 -0
  143. package/src/components/Navigation.tsx +34 -0
  144. package/src/components/Panigation/Pagination.tsx +140 -0
  145. package/src/components/Panigation/cx.js +3 -0
  146. package/src/components/Panigation/isModifierClick.js +10 -0
  147. package/src/components/Result.tsx +186 -113
  148. package/src/components/Saved/AllItem.tsx +32 -0
  149. package/src/components/Saved/Category.tsx +16 -0
  150. package/src/components/carousel/DefaultCarousel.tsx +48 -0
  151. package/src/components/common.d.ts +9 -0
  152. package/src/components/common.scss +54 -0
  153. package/src/components/default-select.tsx +44 -0
  154. package/src/components/hitItem/hits.tsx +50 -0
  155. package/src/components/hitItem/infinitiHits.tsx +33 -0
  156. package/src/components/input/inputSearch.tsx +77 -0
  157. package/src/components/modal/DefaultModal.tsx +28 -0
  158. package/src/components/preview/preview.tsx +433 -0
  159. package/src/components/results/ItemResult.tsx +155 -0
  160. package/src/components/search/ListSearch.tsx +209 -0
  161. package/src/defaults.ts +4 -3
  162. package/src/index.css +577 -306
  163. package/src/index.tsx +39 -187
  164. package/src/modules/LandingPage/common.scss +1304 -0
  165. package/src/modules/LandingPage/indexApp.tsx +474 -0
  166. package/src/modules/LandingPage/indexAppMD.tsx +494 -0
  167. package/src/modules/LandingPage/indexNewVersion.tsx +117 -0
  168. package/src/page/Auth/login.tsx +7 -0
  169. package/src/page/Exception/404.tsx +11 -0
  170. package/src/page/History/index.tsx +76 -0
  171. package/src/page/Profile/index.tsx +87 -0
  172. package/src/page/Saved/MockData.ts +223 -0
  173. package/src/page/Saved/index.tsx +166 -0
  174. package/src/page/Support/index.tsx +160 -0
  175. package/src/page/result/MockData.ts +36 -0
  176. package/src/page/result/index.tsx +473 -0
  177. package/src/services/Feedback.ts +65 -0
  178. package/src/services/findByImage.ts +24 -0
  179. package/src/services/findRegionsCustom.ts +212 -0
  180. package/src/services/image.ts +110 -0
  181. package/src/services/nyris.ts +123 -0
  182. package/src/services/session.ts +20 -0
  183. package/src/services/types.ts +96 -0
  184. package/src/types.ts +43 -3
  185. package/tsconfig.json +3 -8
  186. package/build/static/css/2.43a1c8b7.chunk.css +0 -2
  187. package/build/static/css/2.43a1c8b7.chunk.css.map +0 -1
  188. package/build/static/css/main.f6ed5f12.chunk.css +0 -2
  189. package/build/static/css/main.f6ed5f12.chunk.css.map +0 -1
  190. package/build/static/js/2.a591d52a.chunk.js +0 -3
  191. package/build/static/js/2.a591d52a.chunk.js.LICENSE.txt +0 -79
  192. package/build/static/js/2.a591d52a.chunk.js.map +0 -1
  193. package/build/static/js/main.28bb3581.chunk.js +0 -2
  194. package/build/static/js/main.28bb3581.chunk.js.map +0 -1
  195. package/src/AppMD.tsx +0 -320
  196. package/src/actions/nyrisAppActions.ts +0 -76
  197. package/src/actions/searchActions.ts +0 -143
  198. package/src/epics/index.ts +0 -149
  199. package/src/epics/search.ts +0 -114
@@ -0,0 +1,473 @@
1
+ import {
2
+ Box,
3
+ Button,
4
+ IconButton,
5
+ InputBase,
6
+ Paper,
7
+ Typography,
8
+ } from "@material-ui/core";
9
+ import React, { useEffect, useState } from "react";
10
+ import IconWhatsApp from "common/assets/icons/Icon_whatsapp.png";
11
+ import IconEmail from "common/assets/icons/icon_email.png";
12
+ import IconWeChat from "common/assets/icons/Icon_wechat.png";
13
+ // import FilterComponent from "components/FilterComponent";
14
+ // import {
15
+ // dataFieldFive,
16
+ // dataFieldFour,
17
+ // dataFieldOne,
18
+ // dataFieldSix,
19
+ // dataFieldThree,
20
+ // dataFieldTow,
21
+ // } from "./MockData";
22
+ import ItemResult from "components/results/ItemResult";
23
+ import { useAppDispatch, useAppSelector } from "Store/Store";
24
+ import { debounce } from "lodash";
25
+ import KeyboardArrowRightOutlinedIcon from "@material-ui/icons/KeyboardArrowRightOutlined";
26
+ import KeyboardArrowLeftOutlinedIcon from "@material-ui/icons/KeyboardArrowLeftOutlined";
27
+ import FooterResult from "components/FooterResult";
28
+ import DefaultModal from "components/modal/DefaultModal";
29
+ import CloseOutlinedIcon from "@material-ui/icons/CloseOutlined";
30
+ import DetailItem from "components/DetailItem";
31
+ import FileCopyOutlinedIcon from "@material-ui/icons/FileCopyOutlined";
32
+ import { RectCoords } from "@nyris/nyris-api";
33
+ import {
34
+ loadFile,
35
+ loadingActionResults,
36
+ searchFileImageNonRegion,
37
+ selectionChanged,
38
+ updateResultChangePosition,
39
+ } from "Store/Search";
40
+ import { showFeedback, showResults } from "Store/Nyris";
41
+ import algoliasearch from "algoliasearch/lite";
42
+ import {
43
+ InstantSearch,
44
+ Hits,
45
+ Pagination,
46
+ Configure,
47
+ } from "react-instantsearch-dom";
48
+ import CustomSearchBox from "components/input/inputSearch";
49
+ import { feedbackClickEpic } from "services/Feedback";
50
+ import {
51
+ searchImageByPosition,
52
+ serviceImage,
53
+ serviceImageNonRegion,
54
+ } from "services/image";
55
+ import Preview from "components/preview/preview";
56
+ import NyrisAPI from "@nyris/nyris-api";
57
+ import LoadingScreenCustom from "components/LoadingScreen";
58
+
59
+ interface Props {}
60
+
61
+ function ResultComponent(props: Props) {
62
+ const dispatch = useAppDispatch();
63
+ const StateGlobal = useAppSelector((state) => state);
64
+ const [showColLeft, setToggleShowColLeft] = useState<boolean>(false);
65
+ const [showImageCanvas, setShowImageCanvas] = useState<boolean>(true);
66
+ const [isOpenModalImage, setOpenModalImage] = useState<boolean>(false);
67
+ const [numberResult, setNumberResult] = useState<number>(0);
68
+ const [isOpenModalShare, setOpenModalShare] = useState<boolean>(false);
69
+ const { search, settings }: any = StateGlobal;
70
+ const { results, requestImage, regions, selectedRegion }: any = search;
71
+ const { valueTextSearch } = search;
72
+ const [dataResult, setDataResult] = useState<any[]>([]);
73
+ const [dataImageModal, setDataImageModal] = useState<any>();
74
+ const [searchStateInput, setSearchStateInput] = useState<any>({});
75
+ const apiNyris = new NyrisAPI(settings);
76
+ const [isLoading, setLoading] = useState<any>(false);
77
+ const { apiKeyAlgolia, appIdAlgolia, indexNameAlgolia } = settings;
78
+ const searchClient = algoliasearch(appIdAlgolia, apiKeyAlgolia);
79
+ const index = searchClient.initIndex(indexNameAlgolia);
80
+
81
+ useEffect(() => {
82
+ if (!valueTextSearch) {
83
+ return;
84
+ }
85
+ setSearchStateInput(valueTextSearch);
86
+ }, [valueTextSearch]);
87
+
88
+ useEffect(() => {
89
+ if (results?.length === 0) {
90
+ setDataResult([]);
91
+ return;
92
+ }
93
+ setDataResult(results);
94
+ }, [results]);
95
+
96
+ useEffect(() => {
97
+ if (!showColLeft) {
98
+ return setShowImageCanvas(true);
99
+ }
100
+ return setShowImageCanvas(false);
101
+ }, [showColLeft]);
102
+
103
+ // TODO: hanlder modal:
104
+ const handlerToggleModal = (item: any) => {
105
+ setDataImageModal(item);
106
+ return setOpenModalImage(true);
107
+ };
108
+
109
+ const onNextItem = () => {
110
+ if (numberResult === results.length) {
111
+ return;
112
+ }
113
+ setNumberResult(numberResult + 1);
114
+ };
115
+
116
+ const onPrevItem = () => {
117
+ if (numberResult === 0) {
118
+ return;
119
+ }
120
+ setNumberResult(numberResult - 1);
121
+ };
122
+
123
+ // TODO: rectCoords
124
+
125
+ const debounceRectCoords = (value: any) => handlerRectCoords(value);
126
+
127
+ const handlerRectCoords = debounce((value: any) => {
128
+ dispatch(selectionChanged(value));
129
+ setLoading(true);
130
+ return onSearchOffersForImage(value);
131
+ }, 500);
132
+
133
+ // TODO: Search offers for image:
134
+ const onSearchOffersForImage = (r: RectCoords) => {
135
+ if (!requestImage) {
136
+ return;
137
+ }
138
+ const { canvas }: any = requestImage;
139
+ if (settings.regions) {
140
+ searchImageByPosition(canvas, StateGlobal, r).then((res: any) => {
141
+ const payload = {
142
+ ...res,
143
+ requestImage: requestImage,
144
+ };
145
+ dispatch(updateResultChangePosition(payload));
146
+ setLoading(false);
147
+ return dispatch(showFeedback(""));
148
+ });
149
+ } else {
150
+ serviceImageNonRegion(canvas, StateGlobal, null).then((res: any) => {
151
+ const payload = {
152
+ ...res,
153
+ requestImage: requestImage,
154
+ };
155
+ dispatch(updateResultChangePosition(payload));
156
+ return dispatch(showFeedback(""));
157
+ });
158
+ }
159
+ };
160
+
161
+ // TODO: Search text
162
+ const searchTextByApiAndFilter = async (searchState: any) => {
163
+ try {
164
+ if (searchState?.query !== "") {
165
+ const data = await index.search(searchState.query, {});
166
+ const productIds = data.hits.map((hit: any) => hit.sku);
167
+ const eventData = {
168
+ query: data.query,
169
+ page: data.page,
170
+ product_ids: productIds,
171
+ };
172
+ const textSearchEvent: any = { event: "text-search", data: eventData };
173
+ await apiNyris.sendFeedback(
174
+ search?.sessionId,
175
+ search?.requestId,
176
+ textSearchEvent
177
+ );
178
+ }
179
+ } catch (error: any) {
180
+ console.log("searchTextByApi", error);
181
+ return;
182
+ }
183
+ };
184
+
185
+ // TODO: Handler like dislike
186
+ const sendFeedBackAction = async (type: string) => {
187
+ try {
188
+ const action = type === "like" ? true : false;
189
+ const payload: any = {
190
+ event: "feedback",
191
+ data: {
192
+ success: action,
193
+ },
194
+ };
195
+ await apiNyris.sendFeedback(
196
+ search?.sessionId,
197
+ search?.requestId,
198
+ payload
199
+ );
200
+ } catch (error) {}
201
+ };
202
+
203
+ // Search image with url or file
204
+ const getUrlToCanvasFile = (url: string, position?: number) => {
205
+ dispatch(showResults(""));
206
+ dispatch(loadingActionResults(""));
207
+ if (position) {
208
+ feedbackClickEpic(StateGlobal, position);
209
+ return;
210
+ }
211
+ if (settings.regions) {
212
+ serviceImage(url, StateGlobal).then((res: any) => {
213
+ dispatch(loadFile(res));
214
+ setLoading(false);
215
+ return dispatch(showFeedback(""));
216
+ });
217
+
218
+ return;
219
+ } else {
220
+ serviceImageNonRegion(url, StateGlobal, undefined).then((res) => {
221
+ dispatch(searchFileImageNonRegion(res));
222
+ });
223
+ return;
224
+ }
225
+ };
226
+
227
+ // Todo: item result.
228
+ const Hit = (hit: any) => {
229
+ return (
230
+ <ItemResult
231
+ dataItem={hit?.hit}
232
+ handlerToggleModal={() => {
233
+ handlerToggleModal(hit?.hit);
234
+ }}
235
+ handlerToggleModalShare={() => setOpenModalShare(true)}
236
+ indexItem={hit.__position}
237
+ isHover={false}
238
+ onSearchImage={(url: any) => {
239
+ setSearchStateInput({});
240
+ getUrlToCanvasFile(url);
241
+ setLoading(true);
242
+ }}
243
+ handlerFeedback={(value: string) => {
244
+ sendFeedBackAction(value);
245
+ }}
246
+ />
247
+ );
248
+ };
249
+
250
+ const nonEmptyFilter: any[] = !search?.requestImage
251
+ ? []
252
+ : ["sku:DOES_NOT_EXIST<score=1>"];
253
+ const filterSkus: any = search?.results
254
+ ? search?.results.map(
255
+ (f: any) => `sku:'${f.sku}'<score=${Math.round(100 * f.score)}>`
256
+ )
257
+ : "";
258
+ const filtersString = [...nonEmptyFilter, ...filterSkus].join(" OR ");
259
+ return (
260
+ <Box className={`wrap-main-result loading`}>
261
+ <>
262
+ {isLoading && (
263
+ <Box className="box-wrap-loading">
264
+ <Box className="loadingSpinCT">
265
+ <Box className="box-content-spin"></Box>
266
+ </Box>
267
+ </Box>
268
+ )}
269
+ <InstantSearch
270
+ indexName={indexNameAlgolia}
271
+ searchClient={searchClient}
272
+ searchState={searchStateInput}
273
+ onSearchStateChange={(state: any) => {
274
+ setSearchStateInput(state);
275
+ searchTextByApiAndFilter(state);
276
+ }}
277
+ >
278
+ <Configure filters={filtersString}></Configure>
279
+ <Box className="box-wrap-result-component">
280
+ <div className="box-search">
281
+ <Box>
282
+ <CustomSearchBox />
283
+ </Box>
284
+ {/* <Box className="box-filter">
285
+ <FilterComponent />
286
+ </Box> */}
287
+ </div>
288
+ <Box className="box-result">
289
+ <>
290
+ {settings.preview && requestImage && (
291
+ <Box className={`col-left ${showColLeft && "toggle"}`}>
292
+ <Box className="box-preview">
293
+ <Button
294
+ className="button-toggle"
295
+ onClick={() => {
296
+ setTimeout(() => {
297
+ setToggleShowColLeft(!showColLeft);
298
+ }, 500);
299
+ }}
300
+ >
301
+ {showColLeft ? (
302
+ <KeyboardArrowRightOutlinedIcon />
303
+ ) : (
304
+ <KeyboardArrowLeftOutlinedIcon />
305
+ )}
306
+ </Button>
307
+ {requestImage && showImageCanvas && (
308
+ <Box className="preview-item">
309
+ <Preview
310
+ key={requestImage?.id}
311
+ onSelectionChange={(r: RectCoords) => {
312
+ debounceRectCoords(r);
313
+ return;
314
+ }}
315
+ image={requestImage?.canvas}
316
+ initialRegion={
317
+ !selectedRegion
318
+ ? regions[0]
319
+ ? regions[0]
320
+ : { x1: 0, x2: 1, y1: 0, y2: 1 }
321
+ : selectedRegion
322
+ }
323
+ regions={regions}
324
+ maxWidth={400}
325
+ maxHeight={500}
326
+ dotColor="#FBD914"
327
+ />
328
+ </Box>
329
+ )}
330
+ </Box>
331
+ <Box className="box-title_col-left">
332
+ <Typography style={{ fontSize: 11, color: "#fff" }}>
333
+ Adjust the selection frame for better results.
334
+ </Typography>
335
+ </Box>
336
+ </Box>
337
+ )}
338
+
339
+ <Box
340
+ className={`col-right ${
341
+ settings.preview && "ml-auto mr-auto"
342
+ }`}
343
+ >
344
+ <Box
345
+ className={`box-item-result ${
346
+ requestImage && showImageCanvas
347
+ ? "mr-auto"
348
+ : "ml-auto mr-auto"
349
+ }`}
350
+ >
351
+ <LoadingScreenCustom>
352
+ <Hits hitComponent={Hit} />
353
+ </LoadingScreenCustom>
354
+ </Box>
355
+ </Box>
356
+ </>
357
+ </Box>
358
+ <Box>
359
+ <Box className="box-panigation">
360
+ <Pagination />
361
+ </Box>
362
+ <Box className="box-notify">
363
+ <FooterResult search={search} />
364
+ </Box>
365
+ </Box>
366
+
367
+ {/* TODO: Component modal image */}
368
+ <DefaultModal
369
+ openModal={isOpenModalImage}
370
+ handleClose={(e: any) => {
371
+ setOpenModalImage(false);
372
+ }}
373
+ >
374
+ <DetailItem
375
+ handlerCloseModal={() => {
376
+ setOpenModalImage(false);
377
+ }}
378
+ onPrevItem={onPrevItem}
379
+ onNextItem={onNextItem}
380
+ dataItem={dataImageModal}
381
+ results={dataResult}
382
+ onHandlerModalShare={() => setOpenModalShare(true)}
383
+ onSearchImage={(url: string) => {
384
+ setLoading(true);
385
+ getUrlToCanvasFile(url);
386
+ }}
387
+ />
388
+ </DefaultModal>
389
+
390
+ {/* TODO: Component modal share */}
391
+ <DefaultModal
392
+ openModal={isOpenModalShare}
393
+ handleClose={() => setOpenModalShare(false)}
394
+ >
395
+ <Box className="box-modal-default box-modal-share">
396
+ <Box
397
+ className="ml-auto"
398
+ style={{ width: "fit-content", marginRight: 5 }}
399
+ >
400
+ <Button
401
+ style={{ padding: 0 }}
402
+ onClick={() => setOpenModalShare(false)}
403
+ >
404
+ <CloseOutlinedIcon
405
+ style={{ fontSize: 12, color: "#55566B" }}
406
+ />
407
+ </Button>
408
+ </Box>
409
+ <Box className="box-content-box-share">
410
+ <Typography className="text-f12 text-gray text-bold">
411
+ Share
412
+ </Typography>
413
+ <Paper component="form" className="box-input">
414
+ <InputBase
415
+ className="text-f9 text-gray"
416
+ style={{ width: "100%" }}
417
+ value={"https://www.go..."}
418
+ />
419
+ <IconButton
420
+ color="secondary"
421
+ aria-label="directions"
422
+ style={{ padding: 0 }}
423
+ >
424
+ <FileCopyOutlinedIcon style={{ fontSize: 8 }} />
425
+ </IconButton>
426
+ </Paper>
427
+
428
+ <Box mt={1} className="box-media-share">
429
+ <Button style={{ padding: 0 }}>
430
+ <Box display={"flex"} alignItems={"center"}>
431
+ <img src={IconEmail} alt="icon_email" />
432
+ <Typography
433
+ className="text-f8 fw-500"
434
+ style={{ color: "#2B2C46", marginLeft: 5 }}
435
+ >
436
+ Share with e-Mail
437
+ </Typography>
438
+ </Box>
439
+ </Button>
440
+ <Button style={{ padding: 0 }}>
441
+ <Box display={"flex"} alignItems={"center"}>
442
+ <img src={IconWhatsApp} alt="icon_email" />
443
+ <Typography
444
+ className="text-f8 fw-500"
445
+ style={{ color: "#2B2C46", marginLeft: 5 }}
446
+ >
447
+ Share with WhatsApp
448
+ </Typography>
449
+ </Box>
450
+ </Button>
451
+ <Button style={{ padding: 0 }}>
452
+ <Box display={"flex"} alignItems={"center"}>
453
+ <img src={IconWeChat} alt="icon_email" />
454
+ <Typography
455
+ className="text-f8 fw-500"
456
+ style={{ color: "#2B2C46", marginLeft: 5 }}
457
+ >
458
+ Share with WeChat
459
+ </Typography>
460
+ </Box>
461
+ </Button>
462
+ </Box>
463
+ </Box>
464
+ </Box>
465
+ </DefaultModal>
466
+ </Box>
467
+ </InstantSearch>
468
+ </>
469
+ </Box>
470
+ );
471
+ }
472
+
473
+ export default ResultComponent;
@@ -0,0 +1,65 @@
1
+ import NyrisAPI from "@nyris/nyris-api";
2
+
3
+ export const feedbackSuccessEpic = async (state: any, success: boolean) => {
4
+ const { search, settings } = state;
5
+ try {
6
+ const api = new NyrisAPI(settings);
7
+ const sessionId = search.sessionId || search.requestId;
8
+ return await api.sendFeedback(sessionId, search.requestId, {
9
+ event: "feedback",
10
+ data: { success },
11
+ });
12
+ } catch (error) {
13
+ console.log("error feedbackSuccessEpic", error);
14
+ }
15
+ };
16
+
17
+ export const feedbackClickEpic = async (state: any, position: number) => {
18
+ try {
19
+ const { search, settings } = state;
20
+ const api = new NyrisAPI(settings);
21
+ const sessionId = search.sessionId || search.requestId;
22
+ if (sessionId && state.search.requestId) {
23
+ await api.sendFeedback(sessionId, state.search.requestId, {
24
+ event: "click",
25
+ data: { positions: [position] },
26
+ });
27
+ }
28
+ } catch (error) {
29
+ console.log("error feedbackClickEpic", feedbackClickEpic);
30
+ }
31
+ };
32
+
33
+ export const feedbackRegionEpic = async (state: any, region: any) => {
34
+ try {
35
+ const { search, settings } = state;
36
+ const api = new NyrisAPI(settings);
37
+ const sessionId = search.sessionId || search.requestId;
38
+ const { x1, x2, y1, y2 } = region;
39
+ if (sessionId && search.requestId) {
40
+ await api.sendFeedback(sessionId, search.requestId, {
41
+ event: "region",
42
+ data: { rect: { x: x1, y: y1, w: x2 - x1, h: y2 - y1 } },
43
+ });
44
+ }
45
+ } catch (error) {
46
+ console.log("error feedbackRegionEpic", error);
47
+ }
48
+ };
49
+
50
+ export const sendFeedbackByApi = async (
51
+ settings: any,
52
+ sessionId: any,
53
+ requestId: any,
54
+ payload: any
55
+ ) => {
56
+ const api = new NyrisAPI(settings);
57
+ try {
58
+ const dataByApi = await api
59
+ .sendFeedback(sessionId, requestId, payload)
60
+ .then((res) => {});
61
+ console.log("dataByApi", dataByApi);
62
+ } catch (error) {
63
+ console.log("error sendFeedbackByApi321", error);
64
+ }
65
+ };
@@ -0,0 +1,24 @@
1
+ import NyrisAPI from "@nyris/nyris-api";
2
+
3
+ export const findByImage = async (image: any, options: any, settings: any) => {
4
+
5
+ try {
6
+ const api = new NyrisAPI(settings);
7
+ const {
8
+ results,
9
+ duration,
10
+ requestId,
11
+ categoryPredictions,
12
+ codes,
13
+ } = await api.findByImage(image, options);
14
+ return {
15
+ results,
16
+ duration,
17
+ requestId,
18
+ categoryPredictions,
19
+ codes,
20
+ };
21
+ } catch (error) {
22
+ console.log("error findByImage", error);
23
+ }
24
+ };