@nyris/nyris-webapp 0.3.2 → 0.3.5
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 +8 -8
- package/build/index.html +1 -1
- package/build/js/test.js +14 -20
- package/build/{precache-manifest.8f85a4fff2063a7498a608ec69549bb1.js → precache-manifest.bbb31f2ce7710d7eb3175b1b48241d24.js} +9 -9
- package/build/service-worker.js +1 -1
- package/build/static/js/2.4a55bc61.chunk.js +3 -0
- package/build/static/js/{2.efc0ab83.chunk.js.LICENSE.txt → 2.4a55bc61.chunk.js.LICENSE.txt} +0 -9
- package/build/static/js/2.4a55bc61.chunk.js.map +1 -0
- package/build/static/js/main.2660f94a.chunk.js +2 -0
- package/build/static/js/main.2660f94a.chunk.js.map +1 -0
- package/package.json +3 -3
- package/public/js/test.js +14 -20
- package/src/App.tsx +3 -7
- package/src/Store/Nyris.ts +7 -7
- package/src/Store/Search.ts +48 -74
- package/src/Store/Store.ts +12 -5
- package/src/components/CustomHits/index.tsx +57 -0
- package/src/components/DragDropFile.tsx +27 -23
- package/src/components/ExampleImages.tsx +2 -2
- package/src/components/Feedback.tsx +2 -2
- package/src/components/Footer.tsx +1 -1
- package/src/components/HeaderMd.tsx +4 -5
- package/src/index.tsx +2 -1
- package/src/modules/LandingPage/{indexApp.tsx → App.tsx} +52 -208
- package/src/modules/LandingPage/{indexAppMD.tsx → AppMD.tsx} +52 -147
- package/src/modules/LandingPage/index.tsx +169 -0
- package/src/modules/LandingPage/indexNewVersion.tsx +14 -21
- package/src/modules/LandingPage/propsType.ts +43 -0
- package/src/page/result/index.tsx +51 -106
- package/src/services/Feedback.ts +46 -47
- package/src/services/image.ts +28 -98
- package/src/services/session.ts +13 -16
- package/src/services/types.ts +2 -48
- package/src/types.ts +12 -8
- package/build/static/js/2.efc0ab83.chunk.js +0 -3
- package/build/static/js/2.efc0ab83.chunk.js.map +0 -1
- package/build/static/js/main.3bfed050.chunk.js +0 -2
- package/build/static/js/main.3bfed050.chunk.js.map +0 -1
- package/src/App.test.tsx +0 -49
- package/src/Store/common.d.ts +0 -10
- package/src/Store/epics/feedback.ts +0 -59
- package/src/Store/epics/types.ts +0 -12
- package/src/components/preview/preview.tsx +0 -433
- package/src/services/findByImage.ts +0 -24
- package/src/services/findRegionsCustom.ts +0 -212
- package/src/services/nyris.ts +0 -123
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nyris/nyris-webapp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"homepage": "./",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@babel/runtime": "^7.17.2",
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"@material-ui/data-grid": "^4.0.0-alpha.37",
|
|
9
9
|
"@material-ui/icons": "^4.4.1",
|
|
10
10
|
"@material-ui/lab": "^4.0.0-alpha.60",
|
|
11
|
-
"@nyris/nyris-api": "^0.3.
|
|
12
|
-
"@nyris/nyris-react-components": "^0.3.
|
|
11
|
+
"@nyris/nyris-api": "^0.3.5",
|
|
12
|
+
"@nyris/nyris-react-components": "^0.3.5",
|
|
13
13
|
"@reduxjs/toolkit": "^1.6.1",
|
|
14
14
|
"@types/blueimp-load-image": "^2.23.4",
|
|
15
15
|
"@types/classnames": "^2.2.9",
|
package/public/js/test.js
CHANGED
|
@@ -12,15 +12,14 @@ var settings = {
|
|
|
12
12
|
resultTemplate: "default",
|
|
13
13
|
responseFormat: "application/offers.complete+json",
|
|
14
14
|
exampleImages: [
|
|
15
|
-
"https://
|
|
16
|
-
"https://
|
|
17
|
-
"https://
|
|
18
|
-
"https://
|
|
19
|
-
"https://img.nyris.io/demo/everybag/mb-dle-4.jpg",
|
|
15
|
+
"https://storage.googleapis.com/nyris/share/examples_search/example_1.jpg",
|
|
16
|
+
"https://storage.googleapis.com/nyris/share/examples_search/example_2.jpg",
|
|
17
|
+
"https://storage.googleapis.com/nyris/share/examples_search/example_3.jpg",
|
|
18
|
+
"https://storage.googleapis.com/nyris/share/examples_search/example_4.jpg",
|
|
20
19
|
],
|
|
21
20
|
deactivated: false,
|
|
22
21
|
cadSearch: false,
|
|
23
|
-
|
|
22
|
+
themePage: {
|
|
24
23
|
default: {
|
|
25
24
|
active: false,
|
|
26
25
|
},
|
|
@@ -40,23 +39,18 @@ var settings = {
|
|
|
40
39
|
resultLinkIcon: "eye",
|
|
41
40
|
},
|
|
42
41
|
},
|
|
43
|
-
|
|
42
|
+
newVersion: {
|
|
44
43
|
active: true,
|
|
45
44
|
},
|
|
46
45
|
},
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
imageMatchingUrlBySku: "https://api.nyris.io/recommend/v1",
|
|
56
|
-
imageMatchingSubmitManualUrl: "https://api.nyris.io/find/v1/manual",
|
|
57
|
-
regionProposalUrl: "https://api.nyris.io/find/v1/regions",
|
|
58
|
-
feedbackUrl: "https://api.nyris.io/feedback/v1",
|
|
59
|
-
}
|
|
46
|
+
imageMatchingUrl: "https://api.nyris.io/find/v1",
|
|
47
|
+
imageMatchingUrlBySku: "https://api.nyris.io/recommend/v1",
|
|
48
|
+
imageMatchingSubmitManualUrl: "https://api.nyris.io/find/v1/manual",
|
|
49
|
+
regionProposalUrl: "https://api.nyris.io/find/v1/regions",
|
|
50
|
+
feedbackUrl: "https://api.nyris.io/feedback/v1",
|
|
51
|
+
appIdAlgolia: "HBDJYUK5G4",
|
|
52
|
+
indexNameAlgolia: "Normparts",
|
|
53
|
+
apiKeyAlgolia: "f6a833ff662086f362b93064b9de6f02",
|
|
60
54
|
};
|
|
61
55
|
settings["customSearchRequest"] = null;
|
|
62
56
|
settings["responseHook"] = null;
|
package/src/App.tsx
CHANGED
|
@@ -4,17 +4,13 @@ import React from "react";
|
|
|
4
4
|
import "typeface-roboto";
|
|
5
5
|
import "index.css";
|
|
6
6
|
import { useAppSelector } from "Store/Store";
|
|
7
|
-
import LandingPageApp from "modules/LandingPage/
|
|
8
|
-
import LandingPageAppMD from "modules/LandingPage/indexAppMD";
|
|
7
|
+
import LandingPageApp from "modules/LandingPage/index";
|
|
9
8
|
import AppNewVersion from "modules/LandingPage/indexNewVersion";
|
|
10
|
-
import {AppState} from "./types";
|
|
11
9
|
|
|
12
10
|
function App(): JSX.Element {
|
|
13
|
-
const { settings } = useAppSelector
|
|
11
|
+
const { settings } = useAppSelector((state) => state);
|
|
14
12
|
const { themePage } = settings;
|
|
15
|
-
let SelectedApp =
|
|
16
|
-
themePage.default?.active ? LandingPageApp : (
|
|
17
|
-
themePage.materialDesign?.active ? LandingPageAppMD : AppNewVersion);
|
|
13
|
+
let SelectedApp = themePage.searchSuite?.active ? AppNewVersion : LandingPageApp;
|
|
18
14
|
|
|
19
15
|
return <SelectedApp />;
|
|
20
16
|
}
|
package/src/Store/Nyris.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createSlice
|
|
1
|
+
import { createSlice } from "@reduxjs/toolkit";
|
|
2
2
|
|
|
3
3
|
export type NyrisAppPart = "start" | "camera" | "results";
|
|
4
4
|
export type NyrisFeedbackState =
|
|
@@ -20,7 +20,7 @@ export const nyrisSlice = createSlice({
|
|
|
20
20
|
name: "nyris",
|
|
21
21
|
initialState,
|
|
22
22
|
reducers: {
|
|
23
|
-
showStart: (state
|
|
23
|
+
showStart: (state) => {
|
|
24
24
|
return {
|
|
25
25
|
...state,
|
|
26
26
|
showPart: "start",
|
|
@@ -32,31 +32,31 @@ export const nyrisSlice = createSlice({
|
|
|
32
32
|
showPart: "camera",
|
|
33
33
|
};
|
|
34
34
|
},
|
|
35
|
-
showResults: (state
|
|
35
|
+
showResults: (state) => {
|
|
36
36
|
return {
|
|
37
37
|
...state,
|
|
38
38
|
showPart: "results",
|
|
39
39
|
};
|
|
40
40
|
},
|
|
41
|
-
showFeedback: (state
|
|
41
|
+
showFeedback: (state) => {
|
|
42
42
|
return {
|
|
43
43
|
...state,
|
|
44
44
|
feedbackState: "question",
|
|
45
45
|
};
|
|
46
46
|
},
|
|
47
|
-
hideFeedback: (state
|
|
47
|
+
hideFeedback: (state) => {
|
|
48
48
|
return {
|
|
49
49
|
...state,
|
|
50
50
|
feedbackState: "hidden",
|
|
51
51
|
};
|
|
52
52
|
},
|
|
53
|
-
feedbackSubmitPositive: (state
|
|
53
|
+
feedbackSubmitPositive: (state) => {
|
|
54
54
|
return {
|
|
55
55
|
...state,
|
|
56
56
|
feedbackState: "positive",
|
|
57
57
|
};
|
|
58
58
|
},
|
|
59
|
-
feedbackNegative: (state
|
|
59
|
+
feedbackNegative: (state) => {
|
|
60
60
|
return {
|
|
61
61
|
...state,
|
|
62
62
|
feedbackState: "negative",
|
package/src/Store/Search.ts
CHANGED
|
@@ -2,37 +2,6 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
|
|
|
2
2
|
import { CanvasWithId } from "types";
|
|
3
3
|
import { Code, RectCoords, Region } from "@nyris/nyris-api";
|
|
4
4
|
|
|
5
|
-
export type ImageSourceType =
|
|
6
|
-
| { url: string }
|
|
7
|
-
| { file: File }
|
|
8
|
-
| { image: HTMLCanvasElement };
|
|
9
|
-
|
|
10
|
-
export type SearchAction =
|
|
11
|
-
| { type: "FEEDBACK_SUBMIT_POSITIVE" }
|
|
12
|
-
| { type: "FEEDBACK_SUBMIT_NEGATIVE" }
|
|
13
|
-
| { type: "IMAGE_LOADED"; image: CanvasWithId }
|
|
14
|
-
| { type: "REGION_REQUEST_START"; image: HTMLCanvasElement }
|
|
15
|
-
| { type: "REGION_REQUEST_SUCCEED"; regions: Region[] }
|
|
16
|
-
| { type: "REGION_REQUEST_FAIL"; reason: string; exception: any }
|
|
17
|
-
| {
|
|
18
|
-
type: "SEARCH_REQUEST_START";
|
|
19
|
-
image: HTMLCanvasElement;
|
|
20
|
-
normalizedRect?: RectCoords;
|
|
21
|
-
}
|
|
22
|
-
| { type: "SEARCH_REQUEST_START"; file: File }
|
|
23
|
-
| {
|
|
24
|
-
type: "SEARCH_REQUEST_SUCCEED";
|
|
25
|
-
results: any[];
|
|
26
|
-
requestId: string;
|
|
27
|
-
duration: number;
|
|
28
|
-
categoryPredictions: CategoryPrediction[];
|
|
29
|
-
codes: Code[];
|
|
30
|
-
}
|
|
31
|
-
| { type: "SEARCH_REQUEST_FAIL"; reason: string; exception?: any }
|
|
32
|
-
| { type: "REGION_CHANGED"; normalizedRect: RectCoords }
|
|
33
|
-
| ({ type: "LOAD_IMAGE" } & ImageSourceType)
|
|
34
|
-
| { type: "LOAD_FILE"; file: File }
|
|
35
|
-
| { type: "CAD_LOADED"; file: File };
|
|
36
5
|
|
|
37
6
|
interface CategoryPrediction {
|
|
38
7
|
name: string;
|
|
@@ -45,12 +14,11 @@ export interface SearchState {
|
|
|
45
14
|
requestId?: string;
|
|
46
15
|
sessionId?: string;
|
|
47
16
|
regions: Region[];
|
|
48
|
-
selectedRegion
|
|
17
|
+
selectedRegion?: RectCoords;
|
|
49
18
|
fetchingRegions: boolean;
|
|
50
19
|
fetchingResults: boolean;
|
|
51
20
|
filterOptions: string[];
|
|
52
21
|
requestImage?: CanvasWithId;
|
|
53
|
-
requestCadFile?: File;
|
|
54
22
|
categoryPredictions: CategoryPrediction[];
|
|
55
23
|
codes: Code[];
|
|
56
24
|
errorMessage: string;
|
|
@@ -65,7 +33,7 @@ export interface SearchState {
|
|
|
65
33
|
const initialState: SearchState = {
|
|
66
34
|
results: [],
|
|
67
35
|
regions: [],
|
|
68
|
-
selectedRegion:
|
|
36
|
+
selectedRegion: undefined,
|
|
69
37
|
requestImage: undefined,
|
|
70
38
|
fetchingResults: false,
|
|
71
39
|
fetchingRegions: false,
|
|
@@ -80,46 +48,51 @@ const initialState: SearchState = {
|
|
|
80
48
|
loadingSearchAlgolia: false,
|
|
81
49
|
};
|
|
82
50
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
51
|
+
|
|
52
|
+
export const searchSlice = createSlice({
|
|
53
|
+
name: "search",
|
|
54
|
+
initialState,
|
|
55
|
+
reducers: {
|
|
56
|
+
setSearchResults: (state, data) => {
|
|
88
57
|
const { payload } = data;
|
|
89
58
|
const {
|
|
90
|
-
requestImage,
|
|
91
59
|
results,
|
|
92
60
|
requestId,
|
|
93
61
|
categoryPredictions,
|
|
94
62
|
codes,
|
|
95
63
|
duration,
|
|
96
|
-
regions,
|
|
97
|
-
selectedRegion,
|
|
98
64
|
filters,
|
|
99
65
|
} = payload;
|
|
100
66
|
return {
|
|
101
67
|
...state,
|
|
102
68
|
filters,
|
|
103
|
-
requestImage,
|
|
104
69
|
results,
|
|
105
70
|
requestId,
|
|
106
71
|
categoryPredictions,
|
|
107
72
|
codes,
|
|
108
73
|
duration,
|
|
109
74
|
sessionId: state.sessionId || requestId,
|
|
110
|
-
regions,
|
|
111
|
-
selectedRegion,
|
|
112
75
|
fetchingResults: false,
|
|
113
76
|
};
|
|
114
77
|
},
|
|
115
78
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
79
|
+
setRegions: (state, data: PayloadAction<Region[]>) => ({
|
|
80
|
+
...state,
|
|
81
|
+
regions: data.payload
|
|
82
|
+
}),
|
|
83
|
+
|
|
84
|
+
setSelectedRegion: (state, data: PayloadAction<RectCoords|undefined>) => ({
|
|
85
|
+
...state,
|
|
86
|
+
selectedRegion: data.payload
|
|
87
|
+
}),
|
|
88
|
+
|
|
89
|
+
setRequestImage: (state, data: PayloadAction<HTMLCanvasElement>) => ({
|
|
119
90
|
...state,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
91
|
+
requestImage: {
|
|
92
|
+
canvas: data.payload,
|
|
93
|
+
id: Math.random().toString()
|
|
94
|
+
}
|
|
95
|
+
}),
|
|
123
96
|
|
|
124
97
|
selectionChanged: (state, data: PayloadAction<RectCoords>) => {
|
|
125
98
|
const { payload } = data;
|
|
@@ -144,19 +117,13 @@ export const searchSlice = createSlice({
|
|
|
144
117
|
fetchingRegions: false,
|
|
145
118
|
};
|
|
146
119
|
},
|
|
147
|
-
|
|
148
|
-
return;
|
|
149
|
-
},
|
|
150
|
-
submitNegativeFeedback: (state, data: PayloadAction<RectCoords>) => {
|
|
151
|
-
return;
|
|
152
|
-
},
|
|
153
|
-
loadingActionResults: (state, _data: PayloadAction<any>) => {
|
|
120
|
+
loadingActionResults: (state) => {
|
|
154
121
|
return {
|
|
155
122
|
...state,
|
|
156
123
|
fetchingResults: true,
|
|
157
124
|
};
|
|
158
125
|
},
|
|
159
|
-
loadingActionRegions: (state
|
|
126
|
+
loadingActionRegions: (state) => {
|
|
160
127
|
return {
|
|
161
128
|
...state,
|
|
162
129
|
fetchingRegions: true,
|
|
@@ -170,7 +137,6 @@ export const searchSlice = createSlice({
|
|
|
170
137
|
duration,
|
|
171
138
|
categoryPredictions,
|
|
172
139
|
codes,
|
|
173
|
-
requestImage,
|
|
174
140
|
} = payload;
|
|
175
141
|
return {
|
|
176
142
|
...state,
|
|
@@ -179,32 +145,31 @@ export const searchSlice = createSlice({
|
|
|
179
145
|
duration,
|
|
180
146
|
categoryPredictions,
|
|
181
147
|
codes,
|
|
182
|
-
requestImage,
|
|
183
148
|
fetchingResults: false,
|
|
184
149
|
};
|
|
185
150
|
},
|
|
186
|
-
changeValueTextSearch: (state
|
|
151
|
+
changeValueTextSearch: (state, data: PayloadAction<any>) => {
|
|
187
152
|
const { payload } = data;
|
|
188
153
|
return {
|
|
189
154
|
...state,
|
|
190
155
|
valueTextSearch: payload,
|
|
191
156
|
};
|
|
192
157
|
},
|
|
193
|
-
resultSearchText: (state
|
|
158
|
+
resultSearchText: (state, data: PayloadAction<any>) => {
|
|
194
159
|
const { payload } = data;
|
|
195
160
|
return {
|
|
196
161
|
...state,
|
|
197
162
|
resultSearchText: payload,
|
|
198
163
|
};
|
|
199
164
|
},
|
|
200
|
-
updateResults: (state
|
|
165
|
+
updateResults: (state, data: PayloadAction<any>) => {
|
|
201
166
|
const { payload } = data;
|
|
202
167
|
return {
|
|
203
168
|
...state,
|
|
204
169
|
results: payload,
|
|
205
170
|
};
|
|
206
171
|
},
|
|
207
|
-
reset: (state
|
|
172
|
+
reset: (state, data: PayloadAction<any>) => {
|
|
208
173
|
return {
|
|
209
174
|
results: [],
|
|
210
175
|
regions: [],
|
|
@@ -222,22 +187,21 @@ export const searchSlice = createSlice({
|
|
|
222
187
|
loadingSearchAlgolia: false,
|
|
223
188
|
};
|
|
224
189
|
},
|
|
225
|
-
configureFilter: (state
|
|
190
|
+
configureFilter: (state, data: PayloadAction<any>) => {
|
|
226
191
|
const { payload } = data;
|
|
227
192
|
return {
|
|
228
193
|
...state,
|
|
229
194
|
configureFilter: payload,
|
|
230
195
|
};
|
|
231
196
|
},
|
|
232
|
-
setUpdateSession: (state
|
|
197
|
+
setUpdateSession: (state, data: PayloadAction<string>) => {
|
|
233
198
|
const { payload } = data;
|
|
234
199
|
return {
|
|
235
200
|
...state,
|
|
236
|
-
|
|
237
|
-
sessionId: payload.sessionId,
|
|
201
|
+
sessionId: payload,
|
|
238
202
|
};
|
|
239
203
|
},
|
|
240
|
-
updateResultChangePosition: (state
|
|
204
|
+
updateResultChangePosition: (state, data: PayloadAction<any>) => {
|
|
241
205
|
const { payload } = data;
|
|
242
206
|
const { results } = payload;
|
|
243
207
|
return {
|
|
@@ -245,16 +209,25 @@ export const searchSlice = createSlice({
|
|
|
245
209
|
results,
|
|
246
210
|
};
|
|
247
211
|
},
|
|
212
|
+
|
|
213
|
+
setError: (state, data: PayloadAction<string>) => {
|
|
214
|
+
return {
|
|
215
|
+
...state,
|
|
216
|
+
fetchingRegions: false,
|
|
217
|
+
fetchingResults: false,
|
|
218
|
+
errorMessage: data.payload
|
|
219
|
+
}
|
|
220
|
+
}
|
|
248
221
|
},
|
|
249
222
|
});
|
|
250
223
|
|
|
251
224
|
export const {
|
|
252
|
-
|
|
225
|
+
setSearchResults,
|
|
253
226
|
selectionChanged,
|
|
254
|
-
|
|
255
|
-
submitNegativeFeedback,
|
|
256
|
-
loadCadFileLoad,
|
|
227
|
+
setRequestImage,
|
|
257
228
|
loadFileSelectRegion,
|
|
229
|
+
setRegions,
|
|
230
|
+
setSelectedRegion,
|
|
258
231
|
loadingActionResults,
|
|
259
232
|
loadingActionRegions,
|
|
260
233
|
searchFileImageNonRegion,
|
|
@@ -265,5 +238,6 @@ export const {
|
|
|
265
238
|
configureFilter,
|
|
266
239
|
setUpdateSession,
|
|
267
240
|
updateResultChangePosition,
|
|
241
|
+
setError,
|
|
268
242
|
} = searchSlice.actions;
|
|
269
243
|
export default searchSlice.reducer;
|
package/src/Store/Store.ts
CHANGED
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
import { configureStore } from "@reduxjs/toolkit";
|
|
2
2
|
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
|
|
3
3
|
import { combineReducers } from "redux";
|
|
4
|
-
import thunk from "redux-thunk";
|
|
5
4
|
import Auth from "Store/Auth";
|
|
6
|
-
import {
|
|
7
|
-
import { defaultSettings } from "defaults";
|
|
5
|
+
import {AppSettings, MDSettings} from "types";
|
|
8
6
|
import { getUrlParam } from "utils";
|
|
9
7
|
import Search from "Store/Search";
|
|
10
8
|
import Nyris from "Store/Nyris";
|
|
9
|
+
import {defaultMdSettings, defaultSettings} from "../defaults";
|
|
11
10
|
|
|
12
11
|
declare var settings: AppSettings;
|
|
13
12
|
|
|
13
|
+
|
|
14
|
+
|
|
14
15
|
let normalizedSettings: AppSettings = {
|
|
15
16
|
...defaultSettings,
|
|
16
17
|
...settings,
|
|
17
18
|
};
|
|
18
19
|
|
|
20
|
+
// spread default settings for material design
|
|
21
|
+
let mdSettings : MDSettings = {
|
|
22
|
+
...defaultMdSettings,
|
|
23
|
+
...settings.themePage.materialDesign
|
|
24
|
+
}
|
|
25
|
+
normalizedSettings.themePage.materialDesign = mdSettings;
|
|
26
|
+
|
|
19
27
|
normalizedSettings = {
|
|
20
28
|
...normalizedSettings,
|
|
21
29
|
apiKey: (getUrlParam("apiKey") as string) || normalizedSettings.apiKey,
|
|
@@ -28,7 +36,7 @@ normalizedSettings = {
|
|
|
28
36
|
|
|
29
37
|
const reducers = combineReducers({
|
|
30
38
|
auth: Auth,
|
|
31
|
-
settings: () => normalizedSettings
|
|
39
|
+
settings: () => normalizedSettings,
|
|
32
40
|
search: Search,
|
|
33
41
|
nyris: Nyris,
|
|
34
42
|
});
|
|
@@ -36,7 +44,6 @@ const reducers = combineReducers({
|
|
|
36
44
|
export const store = configureStore({
|
|
37
45
|
reducer: reducers,
|
|
38
46
|
devTools: process.env.NODE_ENV !== "production",
|
|
39
|
-
middleware: [thunk],
|
|
40
47
|
});
|
|
41
48
|
|
|
42
49
|
export type RootState = ReturnType<typeof store.getState>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import PropTypes from "prop-types";
|
|
3
|
+
import { connectHits } from "react-instantsearch-dom";
|
|
4
|
+
import ItemResult from "components/results/ItemResult";
|
|
5
|
+
|
|
6
|
+
function Hits({
|
|
7
|
+
hits,
|
|
8
|
+
setDataResultToAlgolia,
|
|
9
|
+
handlerToggleModal,
|
|
10
|
+
setOpenModalShare,
|
|
11
|
+
setSearchStateInput,
|
|
12
|
+
getUrlToCanvasFile,
|
|
13
|
+
setLoading,
|
|
14
|
+
sendFeedBackAction,
|
|
15
|
+
}: any): JSX.Element {
|
|
16
|
+
const handleSearch = () => {
|
|
17
|
+
setDataResultToAlgolia(hits);
|
|
18
|
+
};
|
|
19
|
+
console.log("hitshits", hits);
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<>
|
|
23
|
+
{handleSearch}
|
|
24
|
+
{hits.map((hit: any, index: any) => {
|
|
25
|
+
return (
|
|
26
|
+
<ItemResult
|
|
27
|
+
key={index}
|
|
28
|
+
dataItem={hit}
|
|
29
|
+
handlerToggleModal={() => {
|
|
30
|
+
handlerToggleModal(hit);
|
|
31
|
+
}}
|
|
32
|
+
handlerToggleModalShare={() => setOpenModalShare(true)}
|
|
33
|
+
indexItem={hit.__position}
|
|
34
|
+
isHover={false}
|
|
35
|
+
onSearchImage={(url: any) => {
|
|
36
|
+
setSearchStateInput({});
|
|
37
|
+
getUrlToCanvasFile(url);
|
|
38
|
+
setLoading(true);
|
|
39
|
+
}}
|
|
40
|
+
handlerFeedback={(value: string) => {
|
|
41
|
+
sendFeedBackAction(value);
|
|
42
|
+
}}
|
|
43
|
+
/>
|
|
44
|
+
);
|
|
45
|
+
})}
|
|
46
|
+
</>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Hits.propTypes = {
|
|
51
|
+
hits: PropTypes.arrayOf(PropTypes.object),
|
|
52
|
+
objectIDs: PropTypes.arrayOf(PropTypes.string),
|
|
53
|
+
setObjectIDs: PropTypes.func,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const CustomHits = connectHits(Hits);
|
|
57
|
+
export default CustomHits;
|
|
@@ -4,17 +4,18 @@ import { useDropzone } from "react-dropzone";
|
|
|
4
4
|
import IconSearch from "common/assets/icons/icon_search_image.svg";
|
|
5
5
|
import { makeFileHandler } from "@nyris/nyris-react-components";
|
|
6
6
|
import { useAppDispatch, useAppSelector } from "Store/Store";
|
|
7
|
-
import {
|
|
7
|
+
import {createImage, findByImage, findRegions} from "services/image";
|
|
8
8
|
import {
|
|
9
|
-
|
|
9
|
+
setSearchResults,
|
|
10
10
|
loadingActionResults,
|
|
11
|
-
|
|
11
|
+
setRequestImage, setRegions, setSelectedRegion,
|
|
12
12
|
} from "Store/Search";
|
|
13
13
|
import { showFeedback, showResults } from "Store/Nyris";
|
|
14
14
|
import { useHistory } from "react-router-dom";
|
|
15
15
|
import ExampleImages from "./ExampleImages";
|
|
16
16
|
import { feedbackClickEpic } from "services/Feedback";
|
|
17
17
|
import { useState } from "react";
|
|
18
|
+
import {RectCoords} from "@nyris/nyris-api";
|
|
18
19
|
|
|
19
20
|
interface Props {
|
|
20
21
|
acceptTypes: any;
|
|
@@ -28,11 +29,10 @@ function DragDropFile(props: Props) {
|
|
|
28
29
|
const { acceptTypes, onChangeLoading, isLoading } = props;
|
|
29
30
|
const searchState = useAppSelector((state) => state);
|
|
30
31
|
const { settings } = searchState;
|
|
31
|
-
const [rectCoords] = useState<any>(undefined);
|
|
32
32
|
const [isLoadingLoadFile, setLoadingLoadFile] = useState<any>(false);
|
|
33
33
|
|
|
34
34
|
const { getRootProps, getInputProps, isDragActive } = useDropzone({
|
|
35
|
-
onDrop: (fs: File[]) => {
|
|
35
|
+
onDrop: async (fs: File[]) => {
|
|
36
36
|
onChangeLoading(true);
|
|
37
37
|
console.log("321");
|
|
38
38
|
let payload: any;
|
|
@@ -40,7 +40,10 @@ function DragDropFile(props: Props) {
|
|
|
40
40
|
setLoadingLoadFile(true);
|
|
41
41
|
console.log("fs", fs);
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
let image = await createImage(fs[0]);
|
|
44
|
+
dispatch(setRequestImage(image));
|
|
45
|
+
// TODO support regions
|
|
46
|
+
return findByImage(image, searchState.settings).then((res: any) => {
|
|
44
47
|
console.log("res?.results", res);
|
|
45
48
|
|
|
46
49
|
res?.results.map((item: any) => {
|
|
@@ -56,37 +59,38 @@ function DragDropFile(props: Props) {
|
|
|
56
59
|
};
|
|
57
60
|
console.log("payload", payload);
|
|
58
61
|
|
|
59
|
-
dispatch(
|
|
62
|
+
dispatch(setSearchResults(payload));
|
|
60
63
|
setLoadingLoadFile(false);
|
|
61
64
|
onChangeLoading(false);
|
|
62
65
|
history.push("/result");
|
|
63
|
-
return dispatch(showFeedback(
|
|
66
|
+
return dispatch(showFeedback());
|
|
64
67
|
});
|
|
65
68
|
},
|
|
66
69
|
});
|
|
67
70
|
|
|
68
|
-
const getUrlToCanvasFile = (url: string, position?: number) => {
|
|
71
|
+
const getUrlToCanvasFile = async (url: string, position?: number) => {
|
|
69
72
|
onChangeLoading(true);
|
|
70
|
-
dispatch(showResults(
|
|
71
|
-
dispatch(loadingActionResults(
|
|
73
|
+
dispatch(showResults());
|
|
74
|
+
dispatch(loadingActionResults());
|
|
72
75
|
if (position) {
|
|
73
76
|
feedbackClickEpic(searchState, position);
|
|
74
77
|
}
|
|
75
78
|
|
|
79
|
+
let image = await createImage(url);
|
|
80
|
+
dispatch(setRequestImage(image));
|
|
81
|
+
let searchRegion: RectCoords| undefined = undefined;
|
|
76
82
|
if (settings.regions) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return dispatch(showFeedback(""));
|
|
82
|
-
});
|
|
83
|
-
} else {
|
|
84
|
-
serviceImageNonRegion(url, searchState, rectCoords).then((res) => {
|
|
85
|
-
onChangeLoading(false);
|
|
86
|
-
history.push("/result");
|
|
87
|
-
dispatch(searchFileImageNonRegion(res));
|
|
88
|
-
});
|
|
83
|
+
let res = await findRegions(image, settings);
|
|
84
|
+
dispatch(setRegions(res.regions));
|
|
85
|
+
searchRegion = res.selectedRegion;
|
|
86
|
+
dispatch(setSelectedRegion(searchRegion));
|
|
89
87
|
}
|
|
88
|
+
return findByImage(image, searchState.settings, searchRegion).then((res) => {
|
|
89
|
+
dispatch(setSearchResults(res));
|
|
90
|
+
onChangeLoading(false);
|
|
91
|
+
history.push("/result");
|
|
92
|
+
return dispatch(showFeedback());
|
|
93
|
+
});
|
|
90
94
|
};
|
|
91
95
|
|
|
92
96
|
return (
|
|
@@ -15,10 +15,10 @@ const ExampleImages: React.FC<ExampleImagesProps> = ({
|
|
|
15
15
|
}
|
|
16
16
|
return (
|
|
17
17
|
<section className="useExampleImg">
|
|
18
|
-
<Typography className="title-box">
|
|
18
|
+
<Typography className="title-box text-center">
|
|
19
19
|
You can also try one of these pictures:
|
|
20
20
|
</Typography>
|
|
21
|
-
<div className="exampleImages">
|
|
21
|
+
<div className="exampleImages d-flex justify-center">
|
|
22
22
|
<div className="exImagesWrap">
|
|
23
23
|
{images.map((i) => {
|
|
24
24
|
return (
|
|
@@ -19,9 +19,9 @@ const Feedback: React.FC<FeedbackProps> = ({ feedbackState, onClose }) => {
|
|
|
19
19
|
const onPositiveFeedback = (data: boolean) => {
|
|
20
20
|
feedbackSuccessEpic(state, data);
|
|
21
21
|
if (data) {
|
|
22
|
-
dispatch(feedbackSubmitPositive(
|
|
22
|
+
dispatch(feedbackSubmitPositive());
|
|
23
23
|
} else {
|
|
24
|
-
dispatch(feedbackNegative(
|
|
24
|
+
dispatch(feedbackNegative());
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Container, Toolbar, Typography, AppBar } from "@material-ui/core";
|
|
3
|
-
import { defaultMdSettings } from "defaults";
|
|
4
3
|
import { useAppSelector } from "Store/Store";
|
|
4
|
+
import {MDSettings} from "../types";
|
|
5
5
|
interface Props {
|
|
6
6
|
settings: any;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
function HeaderMdComponent(): JSX.Element {
|
|
10
|
-
const { settings } = useAppSelector((state
|
|
10
|
+
const { settings } = useAppSelector((state) => state);
|
|
11
11
|
const { themePage } = settings;
|
|
12
|
-
const mdSettings
|
|
13
|
-
|
|
14
|
-
: defaultMdSettings;
|
|
12
|
+
const mdSettings = themePage.materialDesign as MDSettings;
|
|
13
|
+
|
|
15
14
|
return (
|
|
16
15
|
<AppBar
|
|
17
16
|
position={"relative"}
|