@nyris/nyris-webapp 0.3.5 → 0.3.12

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 (206) hide show
  1. package/build/asset-manifest.json +18 -32
  2. package/build/index.html +1 -1
  3. package/build/{precache-manifest.bbb31f2ce7710d7eb3175b1b48241d24.js → precache-manifest.1b00dd5c15aa0815244681503d6fa9da.js} +13 -89
  4. package/build/service-worker.js +1 -1
  5. package/build/static/css/2.43a1c8b7.chunk.css +2 -0
  6. package/build/static/css/2.43a1c8b7.chunk.css.map +1 -0
  7. package/build/static/css/main.0c9239ba.chunk.css +2 -0
  8. package/build/static/css/main.0c9239ba.chunk.css.map +1 -0
  9. package/build/static/js/2.520bb6d6.chunk.js +3 -0
  10. package/build/static/js/2.520bb6d6.chunk.js.LICENSE.txt +79 -0
  11. package/build/static/js/2.520bb6d6.chunk.js.map +1 -0
  12. package/build/static/js/main.ef6a9744.chunk.js +2 -0
  13. package/build/static/js/main.ef6a9744.chunk.js.map +1 -0
  14. package/build/static/js/{runtime-main.b418ff16.js → runtime-main.f5553a9b.js} +1 -1
  15. package/build/static/js/{runtime-main.b418ff16.js.map → runtime-main.f5553a9b.js.map} +1 -1
  16. package/package.json +7 -30
  17. package/src/App.css +64 -20
  18. package/src/App.test.tsx +49 -0
  19. package/src/App.tsx +386 -15
  20. package/src/AppMD.tsx +320 -0
  21. package/src/actions/nyrisAppActions.ts +80 -0
  22. package/src/actions/searchActions.ts +323 -0
  23. package/src/components/CategoryFilter.tsx +16 -13
  24. package/src/components/Codes.tsx +20 -16
  25. package/src/components/ExampleImages.tsx +10 -15
  26. package/src/components/Feedback.tsx +12 -21
  27. package/src/components/FiltersList.tsx +122 -0
  28. package/src/components/Header.tsx +26 -29
  29. package/src/components/PredictedCategories.tsx +15 -12
  30. package/src/components/SelectedFiltersSummary.tsx +85 -0
  31. package/src/components/Sidebar.tsx +52 -0
  32. package/src/defaults.ts +3 -4
  33. package/src/epics/feedback.ts +59 -0
  34. package/src/epics/index.ts +223 -0
  35. package/src/epics/search.ts +239 -0
  36. package/src/epics/types.ts +12 -0
  37. package/src/{common/assets/fonts → fonts}/roboto-bold-webfont.woff +0 -0
  38. package/src/{common/assets/fonts → fonts}/roboto-bold-webfont.woff2 +0 -0
  39. package/src/{common/assets/fonts → fonts}/roboto-italic-webfont.woff +0 -0
  40. package/src/{common/assets/fonts → fonts}/roboto-italic-webfont.woff2 +0 -0
  41. package/src/{common/assets/fonts → fonts}/roboto-regular-webfont.woff +0 -0
  42. package/src/{common/assets/fonts → fonts}/roboto-regular-webfont.woff2 +0 -0
  43. package/src/{common/assets/fonts → fonts}/robotocondensed-bold-webfont.woff +0 -0
  44. package/src/{common/assets/fonts → fonts}/robotocondensed-bold-webfont.woff2 +0 -0
  45. package/src/{common/assets/fonts → fonts}/robotocondensed-bolditalic-webfont.woff +0 -0
  46. package/src/{common/assets/fonts → fonts}/robotocondensed-bolditalic-webfont.woff2 +0 -0
  47. package/src/{common/assets/images → images}/fav/android-icon-192x192.png +0 -0
  48. package/src/{common/assets/images → images}/fav/apple-icon-114x114.png +0 -0
  49. package/src/{common/assets/images → images}/fav/apple-icon-120x120.png +0 -0
  50. package/src/{common/assets/images → images}/fav/apple-icon-144x144.png +0 -0
  51. package/src/{common/assets/images → images}/fav/apple-icon-152x152.png +0 -0
  52. package/src/{common/assets/images → images}/fav/apple-icon-180x180.png +0 -0
  53. package/src/{common/assets/images → images}/fav/apple-icon-57x57.png +0 -0
  54. package/src/{common/assets/images → images}/fav/apple-icon-60x60.png +0 -0
  55. package/src/{common/assets/images → images}/fav/apple-icon-72x72.png +0 -0
  56. package/src/{common/assets/images → images}/fav/apple-icon-76x76.png +0 -0
  57. package/src/{common/assets/images → images}/fav/browserconfig.xml +0 -0
  58. package/src/{common/assets/images → images}/fav/favicon-16x16.png +0 -0
  59. package/src/{common/assets/images → images}/fav/favicon-32x32.png +0 -0
  60. package/src/{common/assets/images → images}/fav/favicon-96x96.png +0 -0
  61. package/src/{common/assets/images → images}/fav/manifest.json +0 -0
  62. package/src/{common/assets/images → images}/ic_cam.png +0 -0
  63. package/src/{common/assets/images → images}/ic_cam.svg +0 -0
  64. package/src/{common/assets/images → images}/ic_cam_large.png +0 -0
  65. package/src/{common/assets/images → images}/ic_cam_large.svg +0 -0
  66. package/src/{common/assets/images → images}/ic_cam_large_noimage.png +0 -0
  67. package/src/{common/assets/images → images}/ic_close_feedback.png +0 -0
  68. package/src/{common/assets/images → images}/ic_close_feedback.svg +0 -0
  69. package/src/{common/assets/images → images}/ic_shopNow.png +0 -0
  70. package/src/{common/assets/images → images}/ic_shopNow.svg +0 -0
  71. package/src/{common/assets/images → images}/ic_shopNowLight.png +0 -0
  72. package/src/{common/assets/images → images}/ic_shopNowLight.svg +0 -0
  73. package/src/{common/assets/images → images}/nyris_logo.png +0 -0
  74. package/src/{common/assets/images → images}/rewe.svg +0 -0
  75. package/src/{common/assets/images → images}/sectionTransBack.png +0 -0
  76. package/src/{common/assets/images → images}/sectionTransBack.svg +0 -0
  77. package/src/{common/assets/images → images}/sectionTransTop.png +0 -0
  78. package/src/{common/assets/images → images}/sectionTransTop.svg +0 -0
  79. package/src/index.css +502 -570
  80. package/src/index.tsx +170 -16
  81. package/src/types.ts +7 -51
  82. package/src/utils.ts +5 -0
  83. package/tsconfig.json +8 -3
  84. package/build/js/settings.example.js +0 -31
  85. package/build/js/test.js +0 -56
  86. package/build/static/css/2.8285176a.chunk.css +0 -2
  87. package/build/static/css/2.8285176a.chunk.css.map +0 -1
  88. package/build/static/css/main.6676fe1f.chunk.css +0 -2
  89. package/build/static/css/main.6676fe1f.chunk.css.map +0 -1
  90. package/build/static/js/2.4a55bc61.chunk.js +0 -3
  91. package/build/static/js/2.4a55bc61.chunk.js.LICENSE.txt +0 -124
  92. package/build/static/js/2.4a55bc61.chunk.js.map +0 -1
  93. package/build/static/js/main.2660f94a.chunk.js +0 -2
  94. package/build/static/js/main.2660f94a.chunk.js.map +0 -1
  95. package/build/static/media/Fill.37094b44.svg +0 -3
  96. package/build/static/media/Montserrat-Bold.5a052e98.otf +0 -0
  97. package/build/static/media/Montserrat-Light.21789e89.otf +0 -0
  98. package/build/static/media/Montserrat-Medium.a53e0373.otf +0 -0
  99. package/build/static/media/Montserrat-Regular.71cdc681.otf +0 -0
  100. package/build/static/media/Montserrat-SemiBold.f613d915.otf +0 -0
  101. package/build/static/media/Rectangle.4dd8b747.png +0 -0
  102. package/build/static/media/admin.9529c7f6.svg +0 -3
  103. package/build/static/media/bg-support-page.6ac55268.svg +0 -9
  104. package/build/static/media/book_mark.8e294c0b.svg +0 -3
  105. package/build/static/media/icon_dislike.94607ca6.svg +0 -3
  106. package/build/static/media/icon_like.a4fb1b18.svg +0 -3
  107. package/build/static/media/icon_modal_image.3068d0ea.svg +0 -21
  108. package/build/static/media/icon_search_image.c2c728c0.svg +0 -3
  109. package/build/static/media/nyris_logo.22d8f250.svg +0 -3
  110. package/build/static/media/reload_icon.4b579a74.svg +0 -3
  111. package/build/static/media/save_search.bebaeebf.svg +0 -3
  112. package/build/static/media/support.289c3a3c.svg +0 -3
  113. package/build/static/media/translate_icon.f0492297.svg +0 -3
  114. package/public/js/settings.example.js +0 -31
  115. package/public/js/test.js +0 -56
  116. package/src/Router.tsx +0 -97
  117. package/src/Store/Auth.ts +0 -44
  118. package/src/Store/Nyris.ts +0 -77
  119. package/src/Store/Search.ts +0 -243
  120. package/src/Store/Store.ts +0 -53
  121. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Bold.otf +0 -0
  122. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Light.otf +0 -0
  123. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Medium.otf +0 -0
  124. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Regular.otf +0 -0
  125. package/src/common/assets/fonts/Montserrat_OTF/Montserrat-SemiBold.otf +0 -0
  126. package/src/common/assets/icons/Fill.png +0 -0
  127. package/src/common/assets/icons/Fill.svg +0 -3
  128. package/src/common/assets/icons/Icon_wechat.png +0 -0
  129. package/src/common/assets/icons/Icon_whatsapp.png +0 -0
  130. package/src/common/assets/icons/admin.png +0 -0
  131. package/src/common/assets/icons/admin.svg +0 -3
  132. package/src/common/assets/icons/book_mark.png +0 -0
  133. package/src/common/assets/icons/book_mark.svg +0 -3
  134. package/src/common/assets/icons/icon_barcode.png +0 -0
  135. package/src/common/assets/icons/icon_camera.png +0 -0
  136. package/src/common/assets/icons/icon_dislike.svg +0 -3
  137. package/src/common/assets/icons/icon_disslike.png +0 -0
  138. package/src/common/assets/icons/icon_email.png +0 -0
  139. package/src/common/assets/icons/icon_like.png +0 -0
  140. package/src/common/assets/icons/icon_like.svg +0 -3
  141. package/src/common/assets/icons/icon_modal_image.png +0 -0
  142. package/src/common/assets/icons/icon_modal_image.svg +0 -21
  143. package/src/common/assets/icons/icon_picture.png +0 -0
  144. package/src/common/assets/icons/icon_search_image.png +0 -0
  145. package/src/common/assets/icons/icon_search_image.svg +0 -3
  146. package/src/common/assets/icons/nyris_logo.svg +0 -3
  147. package/src/common/assets/icons/reload_icon.png +0 -0
  148. package/src/common/assets/icons/reload_icon.svg +0 -3
  149. package/src/common/assets/icons/save_search.png +0 -0
  150. package/src/common/assets/icons/save_search.svg +0 -3
  151. package/src/common/assets/icons/setting_search_icon.png +0 -0
  152. package/src/common/assets/icons/support.png +0 -0
  153. package/src/common/assets/icons/support.svg +0 -3
  154. package/src/common/assets/icons/translate_icon.png +0 -0
  155. package/src/common/assets/icons/translate_icon.svg +0 -3
  156. package/src/common/assets/icons/view_off.png +0 -0
  157. package/src/common/assets/images/Rectangle.png +0 -0
  158. package/src/common/assets/images/bg-support-page.svg +0 -9
  159. package/src/common/assets/images/image_test.png +0 -0
  160. package/src/components/CustomHits/index.tsx +0 -57
  161. package/src/components/DetailItem.tsx +0 -175
  162. package/src/components/DragDropFile.tsx +0 -192
  163. package/src/components/FilterComponent.tsx +0 -33
  164. package/src/components/Footer.tsx +0 -29
  165. package/src/components/FooterMD.tsx +0 -54
  166. package/src/components/FooterNewVersion.tsx +0 -12
  167. package/src/components/FooterResult.tsx +0 -47
  168. package/src/components/HeaderMd.tsx +0 -38
  169. package/src/components/HeaderNewVersion.tsx +0 -92
  170. package/src/components/Layout.tsx +0 -46
  171. package/src/components/LoadingScreen/index.tsx +0 -29
  172. package/src/components/Navigation.tsx +0 -34
  173. package/src/components/Panigation/Pagination.tsx +0 -140
  174. package/src/components/Panigation/cx.js +0 -3
  175. package/src/components/Panigation/isModifierClick.js +0 -10
  176. package/src/components/Saved/AllItem.tsx +0 -32
  177. package/src/components/Saved/Category.tsx +0 -16
  178. package/src/components/carousel/DefaultCarousel.tsx +0 -48
  179. package/src/components/common.d.ts +0 -9
  180. package/src/components/common.scss +0 -54
  181. package/src/components/default-select.tsx +0 -44
  182. package/src/components/hitItem/hits.tsx +0 -50
  183. package/src/components/hitItem/infinitiHits.tsx +0 -33
  184. package/src/components/input/inputSearch.tsx +0 -77
  185. package/src/components/modal/DefaultModal.tsx +0 -28
  186. package/src/components/results/ItemResult.tsx +0 -155
  187. package/src/components/search/ListSearch.tsx +0 -209
  188. package/src/modules/LandingPage/App.tsx +0 -318
  189. package/src/modules/LandingPage/AppMD.tsx +0 -399
  190. package/src/modules/LandingPage/common.scss +0 -1304
  191. package/src/modules/LandingPage/index.tsx +0 -169
  192. package/src/modules/LandingPage/indexNewVersion.tsx +0 -110
  193. package/src/modules/LandingPage/propsType.ts +0 -43
  194. package/src/page/Auth/login.tsx +0 -7
  195. package/src/page/Exception/404.tsx +0 -11
  196. package/src/page/History/index.tsx +0 -76
  197. package/src/page/Profile/index.tsx +0 -87
  198. package/src/page/Saved/MockData.ts +0 -223
  199. package/src/page/Saved/index.tsx +0 -166
  200. package/src/page/Support/index.tsx +0 -160
  201. package/src/page/result/MockData.ts +0 -36
  202. package/src/page/result/index.tsx +0 -418
  203. package/src/services/Feedback.ts +0 -64
  204. package/src/services/image.ts +0 -40
  205. package/src/services/session.ts +0 -17
  206. package/src/services/types.ts +0 -50
@@ -0,0 +1,323 @@
1
+ import { CanvasWithId } from "../types";
2
+ import {
3
+ Code,
4
+ RectCoords,
5
+ Region,
6
+ selectFirstCenteredRegion,
7
+ Filter,
8
+ } from "@nyris/nyris-api";
9
+
10
+ export type ImageSourceType =
11
+ | { url: string }
12
+ | { file: File }
13
+ | { image: HTMLCanvasElement };
14
+
15
+ export type SearchAction =
16
+ | { type: "FEEDBACK_SUBMIT_POSITIVE" }
17
+ | { type: "FEEDBACK_SUBMIT_NEGATIVE" }
18
+ | { type: "IMAGE_LOADED"; image: CanvasWithId }
19
+ | { type: "REGION_REQUEST_START"; image: HTMLCanvasElement }
20
+ | { type: "REGION_REQUEST_SUCCEED"; regions: Region[] }
21
+ | { type: "REGION_REQUEST_FAIL"; reason: string; exception: any }
22
+ | {
23
+ type: "SEARCH_REQUEST_START";
24
+ image: HTMLCanvasElement;
25
+ normalizedRect?: RectCoords;
26
+ selectedFilters?: Filter[];
27
+ }
28
+ | { type: "SEARCH_REQUEST_START"; file: File }
29
+ | {
30
+ type: "SEARCH_REQUEST_SUCCEED";
31
+ results: any[];
32
+ requestId: string;
33
+ duration: number;
34
+ categoryPredictions: CategoryPrediction[];
35
+ codes: Code[];
36
+ }
37
+ | { type: "SEARCH_REQUEST_FAIL"; reason: string; exception?: any }
38
+ | { type: "REGION_CHANGED"; normalizedRect: RectCoords }
39
+ | ({ type: "LOAD_IMAGE" } & ImageSourceType)
40
+ | { type: "LOAD_FILE"; file: File }
41
+ | { type: "CAD_LOADED"; file: File }
42
+ | { type: "LOAD_FILTERS" }
43
+ | { type: "LOAD_FILTERS_SUCCESS"; filters: Filter[] }
44
+ | { type: "LOAD_FILTERS_FAIL"; reason: string; exception: any }
45
+ | { type: "ADD_TO_SELECTEDFILTERS"; key: string; value: string }
46
+ | { type: "REMOVE_FROM_SELECTEDFILTERS"; key: string; value: string }
47
+ | { type: "CLEAR_SELECTED_FILTERS" }
48
+ | { type: "SEARCH_FILTERS"; key: string; value: string }
49
+ | { type: "FILTER_CHANGED" }
50
+ | { type: "FILTER_CHANGED_FAIL" }
51
+ | { type: "CLEAR_REQUEST_IMAGE" }
52
+ | { type: "UPDATE_FILTERS"; key: string; values: string[] };
53
+
54
+ interface CategoryPrediction {
55
+ name: string;
56
+ score: number;
57
+ }
58
+
59
+ export interface SearchState {
60
+ results: any[];
61
+ duration?: number;
62
+ requestId?: string;
63
+ sessionId?: string;
64
+ regions: Region[];
65
+ selectedRegion: RectCoords;
66
+ fetchingRegions: boolean;
67
+ fetchingResults: boolean;
68
+ filterOptions: string[];
69
+ requestImage?: CanvasWithId;
70
+ requestCadFile?: File;
71
+ categoryPredictions: CategoryPrediction[];
72
+ codes: Code[];
73
+ errorMessage: string;
74
+ filters: Filter[];
75
+ selectedFilters: Map<string, string[]>;
76
+ }
77
+
78
+ const initialState: SearchState = {
79
+ results: [],
80
+ regions: [],
81
+ selectedRegion: { x1: 0.1, x2: 0.9, y1: 0.1, y2: 0.9 },
82
+ requestImage: undefined,
83
+ fetchingResults: false,
84
+ fetchingRegions: false,
85
+ filterOptions: [],
86
+ categoryPredictions: [],
87
+ codes: [],
88
+ errorMessage: "",
89
+ filters: [],
90
+ selectedFilters: new Map<string, string[]>(),
91
+ };
92
+
93
+ export const loadFile = (file: File): SearchAction => ({
94
+ type: "LOAD_FILE",
95
+ file,
96
+ });
97
+ export const loadUrl = (url: string): SearchAction => ({
98
+ type: "LOAD_IMAGE",
99
+ url,
100
+ });
101
+ export const loadCanvas = (image: HTMLCanvasElement): SearchAction => ({
102
+ type: "LOAD_IMAGE",
103
+ image,
104
+ });
105
+ export const imageLoaded = (
106
+ image: HTMLCanvasElement,
107
+ id: string
108
+ ): SearchAction => ({ type: "IMAGE_LOADED", image: { canvas: image, id: id } });
109
+ export const cadFileLoaded = (file: File, id: string): SearchAction => ({
110
+ type: "CAD_LOADED",
111
+ file,
112
+ });
113
+ export const selectionChanged = (normalizedRect: RectCoords): SearchAction => ({
114
+ type: "REGION_CHANGED",
115
+ normalizedRect,
116
+ });
117
+ export const searchRegions = (image: HTMLCanvasElement): SearchAction => ({
118
+ type: "REGION_REQUEST_START",
119
+ image,
120
+ });
121
+ export const searchOffersForImage = (
122
+ image: HTMLCanvasElement,
123
+ normalizedRect?: RectCoords
124
+ ): SearchAction => ({
125
+ type: "SEARCH_REQUEST_START",
126
+ image,
127
+ normalizedRect,
128
+ });
129
+ export const searchOffersForCad = (file: File): SearchAction => ({
130
+ type: "SEARCH_REQUEST_START",
131
+ file,
132
+ });
133
+ export const submitPositiveFeedback = (): SearchAction => ({
134
+ type: "FEEDBACK_SUBMIT_POSITIVE",
135
+ });
136
+ export const submitNegativeFeedback = (): SearchAction => ({
137
+ type: "FEEDBACK_SUBMIT_NEGATIVE",
138
+ });
139
+ export const loadFilters = (): SearchAction => ({ type: "LOAD_FILTERS" });
140
+ export const addToSelectedFilters = (
141
+ key: string,
142
+ value: string
143
+ ): SearchAction => ({ type: "ADD_TO_SELECTEDFILTERS", key, value });
144
+ export const removeFromSelectedFilters = (
145
+ key: string,
146
+ value: string
147
+ ): SearchAction => ({ type: "REMOVE_FROM_SELECTEDFILTERS", key, value });
148
+ export const clearAllSelectedFilters = () => ({
149
+ type: "CLEAR_SELECTED_FILTERS",
150
+ });
151
+ export const searchFilters = (key: string, value: string): SearchAction => ({
152
+ type: "SEARCH_FILTERS",
153
+ key,
154
+ value,
155
+ });
156
+ export const filterChanged = (): SearchAction => ({ type: "FILTER_CHANGED" });
157
+ export const clearRequestImage = (): SearchAction => ({
158
+ type: "CLEAR_REQUEST_IMAGE",
159
+ });
160
+
161
+ export const reducer = (
162
+ state: SearchState = initialState,
163
+ action: SearchAction
164
+ ) => {
165
+ switch (action.type) {
166
+ case "IMAGE_LOADED":
167
+ let { image } = action;
168
+ console.log("image", image);
169
+ return {
170
+ ...initialState,
171
+ requestImage: image,
172
+ selectedFilters: state.selectedFilters,
173
+ };
174
+ case "CAD_LOADED":
175
+ let { file } = action;
176
+ return {
177
+ ...initialState,
178
+ requestCadFile: file,
179
+ };
180
+ case "REGION_REQUEST_START":
181
+ return {
182
+ ...state,
183
+ fetchingRegions: true,
184
+ };
185
+ case "REGION_REQUEST_SUCCEED":
186
+ return {
187
+ ...state,
188
+ fetchingRegions: false,
189
+ regions: action.regions,
190
+ selectedRegion: selectFirstCenteredRegion(
191
+ action.regions,
192
+ 0.3,
193
+ state.selectedRegion
194
+ ),
195
+ };
196
+ case "REGION_REQUEST_FAIL":
197
+ return {
198
+ ...state,
199
+ fetchingRegions: false,
200
+ errorMessage: action.exception.response.data.detail,
201
+ };
202
+ case "SEARCH_REQUEST_START":
203
+ return {
204
+ ...state,
205
+ fetchingResults: true,
206
+ };
207
+ case "SEARCH_REQUEST_SUCCEED":
208
+ let { results, requestId, duration, categoryPredictions, codes } = action;
209
+ return {
210
+ ...state,
211
+ results,
212
+ requestId,
213
+ fetchingResults: false,
214
+ sessionId: state.sessionId || requestId,
215
+ categoryPredictions,
216
+ codes,
217
+ duration,
218
+ };
219
+ case "SEARCH_REQUEST_FAIL":
220
+ return {
221
+ ...state,
222
+ fetchingResults: false,
223
+ errorMessage: action.reason,
224
+ };
225
+ case "REGION_CHANGED":
226
+ return {
227
+ ...state,
228
+ selectedRegion: action.normalizedRect,
229
+ };
230
+ case "LOAD_FILTERS_SUCCESS":
231
+ return {
232
+ ...state,
233
+ filters: action.filters,
234
+ };
235
+ case "LOAD_FILTERS_FAIL":
236
+ return {
237
+ ...state,
238
+ errorMessage: action.exception.response.data.detail,
239
+ };
240
+ case "ADD_TO_SELECTEDFILTERS":
241
+ return {
242
+ ...state,
243
+ selectedFilters: ADDtoSelectedfilters(
244
+ state.selectedFilters,
245
+ action.key,
246
+ action.value
247
+ ),
248
+ };
249
+ case "REMOVE_FROM_SELECTEDFILTERS":
250
+ return {
251
+ ...state,
252
+ selectedFilters: RemoveFromSelectedFilters(
253
+ state.selectedFilters,
254
+ action.key,
255
+ action.value
256
+ ),
257
+ };
258
+ case "CLEAR_SELECTED_FILTERS":
259
+ return {
260
+ ...state,
261
+ selectedFilters: new Map<string, string[]>(),
262
+ };
263
+ case "CLEAR_REQUEST_IMAGE":
264
+ return {
265
+ ...state,
266
+ requestImage: undefined,
267
+ };
268
+ case "UPDATE_FILTERS":
269
+ return {
270
+ ...state,
271
+ filters: UpdateFilters(state.filters, action.key, action.values),
272
+ };
273
+ }
274
+ return state;
275
+ };
276
+
277
+ function ADDtoSelectedfilters(
278
+ selectedFilters: Map<string, string[]>,
279
+ key: string,
280
+ value: string
281
+ ): Map<string, string[]> {
282
+ if (selectedFilters) {
283
+ let values = selectedFilters.get(key);
284
+ if (values) {
285
+ values.push(value);
286
+ } else {
287
+ values = new Array<string>(value);
288
+ }
289
+ selectedFilters.set(key, values);
290
+ }
291
+ console.log(selectedFilters);
292
+ return selectedFilters;
293
+ }
294
+
295
+ function RemoveFromSelectedFilters(
296
+ selectedFilters: Map<string, string[]>,
297
+ key: string,
298
+ value: string
299
+ ): Map<string, string[]> {
300
+ if (selectedFilters) {
301
+ let values = selectedFilters.get(key);
302
+ if (values) {
303
+ values = values.filter((x) => x !== value);
304
+ selectedFilters.set(key, values);
305
+ }
306
+ }
307
+ console.log(selectedFilters);
308
+ return selectedFilters;
309
+ }
310
+
311
+ function UpdateFilters(filters: Filter[], key: string, values: string[]) {
312
+ console.log(filters);
313
+ console.log(key);
314
+ console.log(values);
315
+ console.log(filters.find((x) => x.key === key));
316
+ if (filters && filters.length > 0 && filters.find((x) => x.key === key)) {
317
+ let idx = filters.findIndex((x) => x.key === key);
318
+ filters[idx].values = values;
319
+ console.log(filters);
320
+ }
321
+
322
+ return filters;
323
+ }
@@ -1,17 +1,20 @@
1
- import React from 'react';
1
+ import React from "react";
2
2
 
3
-
4
- const CategoryFilter = ({cats}: {cats: string[]}) => {
5
- if (cats.length === 0) {
6
- return null;
7
- }
8
- return (
9
- <div id="catlist" style={{'textAlign': 'center'}}>
10
- {
11
- cats.map((s) => <a key={s} href="#top">{s}</a>) // TODO fix link
12
- }
13
- </div>
14
- );
3
+ const CategoryFilter = ({ cats }: { cats: string[] }) => {
4
+ if (cats.length === 0) {
5
+ return null;
6
+ }
7
+ return (
8
+ <div id="catlist" style={{ textAlign: "center" }}>
9
+ {
10
+ cats.map((s) => (
11
+ <a key={s} href="#top">
12
+ {s}
13
+ </a>
14
+ )) // TODO fix link
15
+ }
16
+ </div>
17
+ );
15
18
  };
16
19
 
17
20
  export default CategoryFilter;
@@ -1,20 +1,24 @@
1
- import React from 'react';
2
- import {Code} from '@nyris/nyris-api';
1
+ import React from "react";
2
+ import { Code } from "@nyris/nyris-api";
3
3
 
4
4
  interface Props {
5
- codes: Code[]
5
+ codes: Code[];
6
6
  }
7
- const Codes = ({codes}: Props) =>
8
- <>
9
- <div className="codes" style={{textAlign: 'center'}}>
10
- {codes.length > 0 && <span style={{fontSize: '0.8em'}}>Codes<br/> </span> }
11
- {codes.map((c, i) =>
12
- <small key={i} title={c.type}>
13
- {c.value}
14
- </small>)}
15
- </div>
16
- </>
17
- ;
18
-
19
-
7
+ const Codes = ({ codes }: Props) => (
8
+ <>
9
+ <div className="codes" style={{ textAlign: "center" }}>
10
+ {codes.length > 0 && (
11
+ <span style={{ fontSize: "0.8em" }}>
12
+ Codes
13
+ <br />{" "}
14
+ </span>
15
+ )}
16
+ {codes.map((c, i) => (
17
+ <small key={i} title={c.type}>
18
+ {c.value}
19
+ </small>
20
+ ))}
21
+ </div>
22
+ </>
23
+ );
20
24
  export default Codes;
@@ -1,4 +1,3 @@
1
- import { Typography } from "@material-ui/core";
2
1
  import React from "react";
3
2
 
4
3
  interface ExampleImagesProps {
@@ -15,21 +14,17 @@ const ExampleImages: React.FC<ExampleImagesProps> = ({
15
14
  }
16
15
  return (
17
16
  <section className="useExampleImg">
18
- <Typography className="title-box text-center">
19
- You can also try one of these pictures:
20
- </Typography>
21
- <div className="exampleImages d-flex justify-center">
17
+ You can also try one of these pictures:
18
+ <div className="exampleImages">
22
19
  <div className="exImagesWrap">
23
- {images.map((i) => {
24
- return (
25
- <img
26
- key={i}
27
- src={i}
28
- alt=""
29
- onClick={() => onExampleImageClicked(i)}
30
- />
31
- );
32
- })}
20
+ {images.map((i) => (
21
+ <img
22
+ key={i}
23
+ src={i}
24
+ alt=""
25
+ onClick={() => onExampleImageClicked(i)}
26
+ />
27
+ ))}
33
28
  </div>
34
29
  </div>
35
30
  </section>
@@ -1,30 +1,21 @@
1
- import { useAppDispatch, useAppSelector } from "Store/Store";
2
- import {
3
- feedbackNegative,
4
- feedbackSubmitPositive,
5
- NyrisFeedbackState,
6
- } from "Store/Nyris";
7
1
  import React from "react";
2
+ import { NyrisFeedbackState } from "../actions/nyrisAppActions";
8
3
  import { Animate } from "react-move";
9
- import { feedbackSuccessEpic } from "services/Feedback";
4
+
10
5
  interface FeedbackProps {
11
6
  feedbackState: NyrisFeedbackState;
7
+ onPositiveFeedback?: () => void;
8
+ onNegativeFeedback?: () => void;
12
9
  onClose?: () => void;
13
10
  }
14
11
 
15
- const Feedback: React.FC<FeedbackProps> = ({ feedbackState, onClose }) => {
12
+ const Feedback: React.FC<FeedbackProps> = ({
13
+ feedbackState,
14
+ onPositiveFeedback,
15
+ onNegativeFeedback,
16
+ onClose,
17
+ }) => {
16
18
  let inner: any = null;
17
- const state = useAppSelector((state) => state);
18
- const dispatch = useAppDispatch();
19
- const onPositiveFeedback = (data: boolean) => {
20
- feedbackSuccessEpic(state, data);
21
- if (data) {
22
- dispatch(feedbackSubmitPositive());
23
- } else {
24
- dispatch(feedbackNegative());
25
- }
26
- };
27
-
28
19
  switch (feedbackState) {
29
20
  case "question":
30
21
  inner = (
@@ -32,13 +23,13 @@ const Feedback: React.FC<FeedbackProps> = ({ feedbackState, onClose }) => {
32
23
  <p>Did you find what you were looking for?</p>
33
24
  <div
34
25
  className="btn primary positiveFeedback"
35
- onClick={() => onPositiveFeedback(true)}
26
+ onClick={onPositiveFeedback}
36
27
  >
37
28
  Yes
38
29
  </div>
39
30
  <div
40
31
  className="btn secondary negativeFeedback"
41
- onClick={() => onPositiveFeedback(false)}
32
+ onClick={onNegativeFeedback}
42
33
  >
43
34
  No
44
35
  </div>
@@ -0,0 +1,122 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { Filter } from "@nyris/nyris-api";
3
+ import {
4
+ addToSelectedFilters,
5
+ removeFromSelectedFilters,
6
+ filterChanged,
7
+ searchFilters,
8
+ } from "../actions/searchActions";
9
+ import { useDispatch } from "react-redux";
10
+ import { RiArrowDropUpLine, RiArrowDropDownLine } from "react-icons/ri";
11
+ import { capitalizeFirstLetter } from "../utils";
12
+ import { AiOutlineSearch } from "react-icons/ai";
13
+
14
+ interface FilterProps {
15
+ filter: Filter;
16
+ selectedValues?: string[];
17
+ }
18
+
19
+ const FiltersList: React.FC<FilterProps> = ({ filter, selectedValues }) => {
20
+ const dispatch = useDispatch();
21
+ const [isCollapsed, setIsCollapsed] = useState(false);
22
+ const [message, setMessage] = useState("");
23
+ const handleToggler = () => {
24
+ if (isCollapsed) {
25
+ setIsCollapsed(false);
26
+ return;
27
+ }
28
+ setIsCollapsed(true);
29
+ };
30
+ const onFilterChanged = (
31
+ e: React.ChangeEvent<HTMLInputElement>,
32
+ value: string
33
+ ) => {
34
+ if (e.target.checked) {
35
+ if (filter.key) dispatch(addToSelectedFilters(filter.key, value));
36
+ } else {
37
+ if (filter.key) dispatch(removeFromSelectedFilters(filter.key, value));
38
+ }
39
+ dispatch(filterChanged());
40
+ };
41
+ // 👇️ called every time input's value changes
42
+ const handleChangeOnSearchInputTyped = (
43
+ e: React.ChangeEvent<HTMLInputElement>
44
+ ) => {
45
+ setMessage(e.target.value);
46
+ };
47
+ const queryFilters = (key: string, value: string) => {
48
+ dispatch(searchFilters(key, value));
49
+ };
50
+
51
+ useEffect(() => {
52
+ if (message === "") {
53
+ dispatch(searchFilters(filter.key!, ""));
54
+ }
55
+ }, [message, filter.key, dispatch]);
56
+ return (
57
+ <div>
58
+ <div className="item">
59
+ {/* <RiLayoutGridLine className="sidebar-icon" /> */}
60
+ <span className="sidebar-text">
61
+ {" "}
62
+ {capitalizeFirstLetter(filter.key!)}
63
+ </span>
64
+ <RiArrowDropUpLine
65
+ className={
66
+ isCollapsed ? "sidebar-icon" : "sidebar-icon collapsedHide"
67
+ }
68
+ onClick={() => handleToggler()}
69
+ />
70
+ <RiArrowDropDownLine
71
+ className={
72
+ isCollapsed ? "sidebar-icon collapsedHide" : "sidebar-icon"
73
+ }
74
+ onClick={() => handleToggler()}
75
+ />
76
+ </div>
77
+
78
+ <div
79
+ className={
80
+ isCollapsed ? "list-container" : "list-container collapsedHide"
81
+ }
82
+ >
83
+ <div className="searchBar">
84
+ <input
85
+ id="searchQueryInput"
86
+ name="searchQueryInput"
87
+ placeholder="Search"
88
+ value={message}
89
+ onChange={(e) => handleChangeOnSearchInputTyped(e)}
90
+ />
91
+ <button
92
+ id="searchQuerySubmit"
93
+ type="submit"
94
+ name="searchQuerySubmit"
95
+ onClick={() => queryFilters(filter.key!, message)}
96
+ >
97
+ <AiOutlineSearch />
98
+ </button>
99
+ </div>
100
+ {filter &&
101
+ filter.values &&
102
+ filter.values.length > 0 &&
103
+ filter.values.slice(0, 6).map((item, index) => {
104
+ const checked = selectedValues && selectedValues.includes(item);
105
+ return (
106
+ <div key={index}>
107
+ <input
108
+ value={item}
109
+ checked={checked ? true : false}
110
+ type="checkbox"
111
+ onChange={(e) => onFilterChanged(e, item)}
112
+ />
113
+ <span className="itemLabel">{item}</span>
114
+ </div>
115
+ );
116
+ })}
117
+ </div>
118
+ </div>
119
+ );
120
+ };
121
+
122
+ export default FiltersList;
@@ -1,35 +1,32 @@
1
1
  import React from "react";
2
2
 
3
- function HeaderComponent(): JSX.Element {
3
+ const Header = () => {
4
4
  return (
5
- <div className="navWrap">
6
- <div className="wrapper" style={{ padding: 0 }}>
7
- <section id="branding" />
8
- <div id="menu" className="menuWrap" role="navigation">
9
- <ul>
10
- <li>
11
- <a
12
- href="https://nyris.io/imprint/#privacy"
13
- target="_blank"
14
- rel="noopener noreferrer"
15
- >
16
- Privacy Policy
17
- </a>
18
- </li>
19
- <li>
20
- <a
21
- href="https://nyris.io/"
22
- target="_blank"
23
- rel="noopener noreferrer"
24
- >
25
- Visit our Website
26
- </a>
27
- </li>
28
- </ul>
29
- </div>
5
+ <div id="header">
6
+ <section id="branding"></section>
7
+ <div id="menu" className="menuWrap" role="navigation">
8
+ <ul>
9
+ <li>
10
+ <a
11
+ href="https://nyris.io/imprint/#privacy"
12
+ target="_blank"
13
+ rel="noopener noreferrer"
14
+ >
15
+ Privacy Policy
16
+ </a>
17
+ </li>
18
+ <li>
19
+ <a
20
+ href="https://nyris.io/"
21
+ target="_blank"
22
+ rel="noopener noreferrer"
23
+ >
24
+ Visit our Website
25
+ </a>
26
+ </li>
27
+ </ul>
30
28
  </div>
31
29
  </div>
32
30
  );
33
- }
34
-
35
- export default HeaderComponent;
31
+ };
32
+ export default Header;