@riosst100/pwa-marketplace 2.9.0 → 2.9.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.
@@ -0,0 +1,280 @@
1
+ import { useQuery, useLazyQuery } from '@apollo/client';
2
+ import { useEffect, useMemo } from 'react';
3
+ import { useLocation } from 'react-router-dom';
4
+
5
+ import mergeOperations from '@magento/peregrine/lib/util/shallowMerge';
6
+ import DEFAULT_OPERATIONS from '@riosst100/pwa-marketplace/src/talons/ShowMore/shopBy.gql';
7
+ import { getFilterInput, getFiltersFromSearch } from '@magento/peregrine/lib/talons/FilterModal/helpers';
8
+
9
+ export const useShopBy = props => {
10
+
11
+ const { searchQuery, activeFilter, active, setActive, currentSort, categoryId, shopby } = props
12
+
13
+ const { value: sortby } = currentSort
14
+
15
+ const operations = mergeOperations(DEFAULT_OPERATIONS, null);
16
+ const { getStoreConfigData, getShopByDataQuery, getCategoryContentQuery, getFilterInputsQuery, getProductFiltersByCategoryQuery, getMasterAttributesQuery } = operations;
17
+ const { pathname, search } = useLocation();
18
+ // const [
19
+ // ,
20
+ // {
21
+ // actions: { setPageLoading }
22
+ // }
23
+ // ] = useAppContext();
24
+
25
+ const [runQuery, { data: queryResponse, loading, error }] = useLazyQuery(
26
+ getProductFiltersByCategoryQuery,
27
+ {
28
+ fetchPolicy: 'cache-and-network',
29
+ nextFetchPolicy: 'cache-first'
30
+ }
31
+ );
32
+
33
+ // const [runQuery, {data: queryResponse, loading, error}] = useLazyQuery(getShopByDataQuery, {
34
+ // fetchPolicy: 'cache-and-network',
35
+ // nextFetchPolicy: 'cache-first'
36
+ // });
37
+
38
+ const { data: storeConfigData } = useQuery(getStoreConfigData, {
39
+ fetchPolicy: 'cache-and-network',
40
+ nextFetchPolicy: 'cache-first'
41
+ });
42
+
43
+ const pathnameArr = pathname.split('/');
44
+
45
+ const categoryUrlKey = pathnameArr[pathnameArr.length - 1].replace('.html','');
46
+
47
+ const categoryUrlSuffix = storeConfigData?.storeConfig?.category_url_suffix;
48
+
49
+ const { data: introspectionData } = useQuery(getFilterInputsQuery);
50
+
51
+ const filterTypeMap = useMemo(() => {
52
+ const typeMap = new Map();
53
+ if (introspectionData) {
54
+ introspectionData.__type.inputFields.forEach(({ name, type }) => {
55
+ typeMap.set(name, type.name);
56
+ });
57
+ }
58
+ return typeMap;
59
+ }, [introspectionData]);
60
+
61
+ const filters = getFiltersFromSearch(search);
62
+
63
+ const { newFilters, activeFilters } = useMemo(() => {
64
+ const resultFilters = {};
65
+ const resultActiveFilters = [];
66
+
67
+ if (filterTypeMap.size) {
68
+ filters.forEach((values, key) => {
69
+ resultFilters[key] = getFilterInput(values, filterTypeMap.get(key));
70
+
71
+ if (key === "sc_baseball_release") {
72
+ for (let item of values) {
73
+ if (item) {
74
+ const data = search.split('&');
75
+ data.pop();
76
+ resultActiveFilters.push({
77
+ label: item.split(',')[0],
78
+ path: data
79
+ });
80
+ }
81
+ }
82
+ }
83
+ });
84
+ }
85
+
86
+ return { newFilters: resultFilters, activeFilters: resultActiveFilters };
87
+ }, [filterTypeMap]);
88
+
89
+ // MASTER ATTRIBUTES
90
+ const {
91
+ called: masterAttributesCalled,
92
+ data: masterAttributesData,
93
+ loading: masterAttributesLoading
94
+ } = useQuery(getMasterAttributesQuery,
95
+ {
96
+ fetchPolicy: 'cache-and-network',
97
+ nextFetchPolicy: 'cache-first'
98
+ });
99
+
100
+ const masterAttributes = useMemo(() => {
101
+ const masterAttributes = [];
102
+
103
+ if (masterAttributesData) {
104
+ masterAttributesData.masterAttributes.forEach(({ attribute_code }) => {
105
+ masterAttributes.push(attribute_code);
106
+ });
107
+ }
108
+
109
+ return masterAttributes;
110
+ }, [masterAttributesData]);
111
+
112
+ useEffect(() => {
113
+
114
+ if (!filterTypeMap.size) {
115
+ return;
116
+ }
117
+
118
+ const filters = getFiltersFromSearch(search);
119
+
120
+ const mainAttributes = ['card_game'];
121
+
122
+ // Construct the filter arg object.
123
+ const newFilters = {};
124
+ filters.forEach((values, key) => {
125
+ if (mainAttributes.includes(key)) {
126
+ newFilters[key] = getFilterInput(values, filterTypeMap.get(key));
127
+ }
128
+ });
129
+
130
+ // Use the category uid for the current category page regardless of the
131
+ // applied filters. Follow-up in PWA-404.
132
+ // newFilters['category_uid'] = { eq: id };
133
+
134
+ runQuery({
135
+ variables: {
136
+ filters: newFilters
137
+ }
138
+ });
139
+ }, [
140
+ runQuery, filterTypeMap, search
141
+ ]);
142
+
143
+ const alpha = ['#', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
144
+
145
+ // const isBackgroundLoading = !!queryResponse && loading;
146
+
147
+ const originalDataResult = useMemo(() => {
148
+ if (!queryResponse) {
149
+ return null;
150
+ }
151
+
152
+ const rawData = queryResponse?.products?.aggregations;
153
+ if (!rawData.length) {
154
+ return null;
155
+ }
156
+
157
+ let options = rawData.find(item => item.attribute_code === shopby).options;
158
+
159
+ const mappingData = options.reduce((acc, item) => {
160
+ let firstLetter = item.label.charAt(0).toUpperCase();
161
+ if (!alpha.includes(firstLetter)) {
162
+ firstLetter = '#';
163
+ }
164
+ if (shopby == "vehicles_year" || shopby == "trains_gauge" || shopby == "vehicles_scale" || shopby == "lego_theme" || shopby == "lego_subtheme" || shopby == "lego_interest") {
165
+ firstLetter = '#';
166
+ }
167
+ acc[firstLetter] = acc[firstLetter] || [];
168
+ acc[firstLetter].push(item);
169
+ return acc;
170
+ }, {});
171
+
172
+ const sortbyData = [];
173
+
174
+ return sortby != "all" ? sortbyData && sortbyData.length ? sortbyData.sort((a, b) => b.release_type.toLowerCase().localeCompare(a.release_type.toLowerCase())) : sortbyData : mappingData;
175
+ }, [queryResponse, sortby]);
176
+
177
+ const filteredOptions = useMemo(() => {
178
+ if (!queryResponse) {
179
+ return null;
180
+ }
181
+
182
+ const rawData = queryResponse?.products?.aggregations;
183
+ if (!rawData.length) {
184
+ return null;
185
+ }
186
+
187
+ let options = rawData.find(item => item.attribute_code === shopby).options;
188
+
189
+ // const filteredSets = [];
190
+
191
+ // let filteredOptions = [];
192
+
193
+ // let mappingData = [];
194
+
195
+ if (searchQuery) {
196
+ if (active != "all") {
197
+ setActive('all');
198
+ }
199
+
200
+ return options.filter(function(option) {
201
+ return option.label.search(new RegExp(searchQuery, "i")) != -1;
202
+ });
203
+ }
204
+
205
+ return options;
206
+ }, [queryResponse, searchQuery]);
207
+
208
+ const dataResult = useMemo(() => {
209
+ if (filteredOptions) {
210
+ return filteredOptions.reduce((acc, item) => {
211
+ let firstLetter = item.label.charAt(0).toUpperCase();
212
+ if (!alpha.includes(firstLetter)) {
213
+ firstLetter = '#';
214
+ }
215
+ if (shopby == "vehicles_year" || shopby == "trains_gauge" || shopby == "vehicles_scale" || shopby == "lego_theme" || shopby == "lego_subtheme" || shopby == "lego_interest") {
216
+ firstLetter = '#';
217
+ }
218
+ acc[firstLetter] = acc[firstLetter] || [];
219
+ acc[firstLetter].push(item);
220
+ return acc;
221
+ }, {});
222
+ }
223
+
224
+ return filteredOptions;
225
+ }, [filteredOptions]);
226
+
227
+ let availableGroups = originalDataResult ? Object.keys(originalDataResult).sort() : [];
228
+
229
+ let filteredAvailableGroups = dataResult ? Object.keys(dataResult).sort() : [];
230
+
231
+ if (shopby == "vehicles_year" || shopby == "trains_gauge" || shopby == "vehicles_scale" || shopby == "lego_theme" || shopby == "lego_subtheme" || shopby == "lego_interest") {
232
+ availableGroups = ['#'];
233
+ filteredAvailableGroups = ['#'];
234
+ }
235
+
236
+
237
+ const attributeData = queryResponse?.products?.aggregations && queryResponse?.products.aggregations.length ? queryResponse.products.aggregations.find(item => item.attribute_code === shopby) : null;
238
+
239
+ const { data: categoryData, loading: categoryLoading } = useQuery(
240
+ getCategoryContentQuery,
241
+ {
242
+ fetchPolicy: 'cache-and-network',
243
+ nextFetchPolicy: 'cache-first',
244
+ skip: !categoryId,
245
+ variables: {
246
+ id: categoryId
247
+ }
248
+ }
249
+ );
250
+
251
+ const pageInfo = useMemo(() => {
252
+ if (!queryResponse) {
253
+ return null;
254
+ }
255
+
256
+ return queryResponse.products.aggregations.find(item => item.attribute_code === shopby);
257
+ }, [queryResponse, shopby]);
258
+
259
+ const category =
260
+ categoryData && categoryData.categories.items.length
261
+ ? categoryData.categories.items[0]
262
+ : null;
263
+
264
+ return {
265
+ error,
266
+ loading,
267
+ dataResult,
268
+ // collectibleGameSets,
269
+ filteredAvailableGroups,
270
+ categoryUrlSuffix,
271
+ categoryUrlKey,
272
+ availableGroups,
273
+ attributeData,
274
+ alpha,
275
+ category,
276
+ activeFilters,
277
+ pageInfo
278
+ // productType
279
+ };
280
+ };
@@ -0,0 +1,273 @@
1
+ import { useQuery, useLazyQuery } from '@apollo/client';
2
+ import { useEffect, useMemo } from 'react';
3
+ import { useLocation } from 'react-router-dom';
4
+
5
+ import mergeOperations from '@magento/peregrine/lib/util/shallowMerge';
6
+ import DEFAULT_OPERATIONS from './showMore.gql';
7
+ import { getFilterInput, getFiltersFromSearch } from '@magento/peregrine/lib/talons/FilterModal/helpers';
8
+
9
+ export const useShowMore = props => {
10
+
11
+ const { searchQuery, activeFilter, active, setActive, currentSort, categoryId, shopby } = props
12
+
13
+ const { value: sortby } = currentSort
14
+
15
+ const operations = mergeOperations(DEFAULT_OPERATIONS, null);
16
+ const { getStoreConfigData, getShopByDataQuery, getCategoryContentQuery, getFilterInputsQuery } = operations;
17
+ const { pathname, search } = useLocation();
18
+ // const [
19
+ // ,
20
+ // {
21
+ // actions: { setPageLoading }
22
+ // }
23
+ // ] = useAppContext();
24
+
25
+ const [runQuery, queryResponse] = useLazyQuery(getShopByDataQuery, {
26
+ fetchPolicy: 'cache-and-network',
27
+ nextFetchPolicy: 'cache-first'
28
+ });
29
+
30
+ const { data: storeConfigData } = useQuery(getStoreConfigData, {
31
+ fetchPolicy: 'cache-and-network',
32
+ nextFetchPolicy: 'cache-first'
33
+ });
34
+
35
+ const pathnameArr = pathname.split('/');
36
+
37
+ const categoryUrlKey = pathnameArr[pathnameArr.length - 1].replace('.html','');
38
+
39
+ const categoryUrlSuffix = storeConfigData?.storeConfig?.category_url_suffix;
40
+
41
+ const { data: introspectionData } = useQuery(getFilterInputsQuery);
42
+
43
+ const filterTypeMap = useMemo(() => {
44
+ const typeMap = new Map();
45
+ if (introspectionData) {
46
+ introspectionData.__type.inputFields.forEach(({ name, type }) => {
47
+ typeMap.set(name, type.name);
48
+ });
49
+ }
50
+ return typeMap;
51
+ }, [introspectionData]);
52
+
53
+ const activeFilters = [];
54
+
55
+ // if (!filterTypeMap.size) {
56
+ // return;
57
+ // }
58
+
59
+ const filters = getFiltersFromSearch(search);
60
+
61
+ // Construct the filter arg object.
62
+ const newFilters = {};
63
+ filters.forEach((values, key) => {
64
+ newFilters[key] = getFilterInput(values, filterTypeMap.get(key));
65
+
66
+ if (key == "sc_baseball_release") {
67
+ for(let item of values) {
68
+ if(item) {
69
+ // console.log(item.split(',')[0])
70
+ const data = search.split('&');
71
+ data.pop();
72
+ activeFilters.push(
73
+ {
74
+ 'label': item.split(',')[0],
75
+ 'path': data
76
+ }
77
+ )
78
+ }
79
+ }
80
+ }
81
+ });
82
+
83
+ useEffect(() => {
84
+
85
+
86
+
87
+ // Use the category uid for the current category page regardless of the
88
+ // applied filters. Follow-up in PWA-404.
89
+ // newFilters['category_uid'] = { eq: id };
90
+
91
+ runQuery({
92
+ variables: {
93
+ filters: newFilters,
94
+ categoryUrlKey: categoryUrlKey,
95
+ attributeCode: shopby,
96
+ activeFilter: activeFilter,
97
+ search: search
98
+ }
99
+ });
100
+ }, [
101
+ runQuery,
102
+ activeFilter,
103
+ shopby,
104
+ // categoryUrlKey,
105
+ // filters
106
+ // filterTypeMap,
107
+ search
108
+ ]);
109
+
110
+ // console.log(activeFilters)
111
+
112
+
113
+
114
+ // const { error, loading, data } = useQuery(getShopByDataQuery, {
115
+ // fetchPolicy: 'cache-and-network',
116
+ // nextFetchPolicy: 'cache-first',
117
+ // skip: !storeConfigData,
118
+ // variables: {
119
+ // categoryUrlKey: categoryUrlKey,
120
+ // attributeCode: shopby
121
+ // }
122
+ // });
123
+
124
+ const alpha = ['#', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
125
+
126
+ // const isBackgroundLoading = !!queryResponse && loading;
127
+
128
+ const originalDataResult = useMemo(() => {
129
+ if (!queryResponse) {
130
+ return null;
131
+ }
132
+
133
+ const rawData = queryResponse?.data?.showMoreData?.data;
134
+ if (!rawData) {
135
+ return null;
136
+ }
137
+
138
+ let options = rawData[0].options;
139
+
140
+ const mappingData = options.reduce((acc, item) => {
141
+ let firstLetter = item.label.charAt(0).toUpperCase();
142
+ if (!alpha.includes(firstLetter)) {
143
+ firstLetter = '#';
144
+ }
145
+ if (shopby == "vehicles_year" || shopby == "trains_gauge" || shopby == "vehicles_scale" || shopby == "lego_theme" || shopby == "lego_subtheme" || shopby == "lego_interest") {
146
+ firstLetter = '#';
147
+ }
148
+ acc[firstLetter] = acc[firstLetter] || [];
149
+ acc[firstLetter].push(item);
150
+ return acc;
151
+ }, {});
152
+
153
+ const sortbyData = [];
154
+
155
+ return sortby != "all" ? sortbyData && sortbyData.length ? sortbyData.sort((a, b) => b.release_type.toLowerCase().localeCompare(a.release_type.toLowerCase())) : sortbyData : mappingData;
156
+ }, [queryResponse, sortby]);
157
+
158
+ const filteredOptions = useMemo(() => {
159
+ if (!queryResponse) {
160
+ return null;
161
+ }
162
+
163
+ const rawData = queryResponse?.data?.showMoreData?.data;
164
+ if (!rawData) {
165
+ return null;
166
+ }
167
+
168
+ let options = rawData[0].options;
169
+
170
+ // const filteredSets = [];
171
+
172
+ // let filteredOptions = [];
173
+
174
+ // let mappingData = [];
175
+
176
+ if (searchQuery) {
177
+ if (active != "all") {
178
+ setActive('all');
179
+ }
180
+
181
+ return options.filter(function(option) {
182
+ return option.label.search(new RegExp(searchQuery, "i")) != -1;
183
+ });
184
+ }
185
+ // } else {
186
+
187
+ // console.log(filteredOptions)
188
+
189
+
190
+ // }
191
+
192
+
193
+
194
+ // const sortbyData = [];
195
+
196
+ return options;
197
+ }, [queryResponse, searchQuery]);
198
+
199
+ const dataResult = useMemo(() => {
200
+ if (filteredOptions) {
201
+ return filteredOptions.reduce((acc, item) => {
202
+ let firstLetter = item.label.charAt(0).toUpperCase();
203
+ if (!alpha.includes(firstLetter)) {
204
+ firstLetter = '#';
205
+ }
206
+ if (shopby == "vehicles_year" || shopby == "trains_gauge" || shopby == "vehicles_scale" || shopby == "lego_theme" || shopby == "lego_subtheme" || shopby == "lego_interest") {
207
+ firstLetter = '#';
208
+ }
209
+ acc[firstLetter] = acc[firstLetter] || [];
210
+ acc[firstLetter].push(item);
211
+ return acc;
212
+ }, {});
213
+ }
214
+
215
+ return filteredOptions;
216
+ }, [filteredOptions])
217
+
218
+ // console.log(dataResult)
219
+
220
+ let availableGroups = originalDataResult ? Object.keys(originalDataResult).sort() : [];
221
+
222
+ let filteredAvailableGroups = dataResult ? Object.keys(dataResult).sort() : [];
223
+
224
+ if (shopby == "vehicles_year" || shopby == "trains_gauge" || shopby == "vehicles_scale" || shopby == "lego_theme" || shopby == "lego_subtheme" || shopby == "lego_interest") {
225
+ availableGroups = ['#'];
226
+ filteredAvailableGroups = ['#'];
227
+ }
228
+
229
+
230
+ const attributeData = queryResponse?.data?.showMoreData?.data && queryResponse?.data?.showMoreData.data.length ? queryResponse.data.showMoreData.data[0] : null
231
+
232
+ const { data: categoryData, loading: categoryLoading } = useQuery(
233
+ getCategoryContentQuery,
234
+ {
235
+ fetchPolicy: 'cache-and-network',
236
+ nextFetchPolicy: 'cache-first',
237
+ skip: !categoryId,
238
+ variables: {
239
+ id: categoryId
240
+ }
241
+ }
242
+ );
243
+
244
+ const pageInfo = useMemo(() => {
245
+ if (!queryResponse) {
246
+ return null;
247
+ }
248
+
249
+ return queryResponse?.data?.showMoreData?.page_info;
250
+ }, [queryResponse]);
251
+
252
+ const category =
253
+ categoryData && categoryData.categories.items.length
254
+ ? categoryData.categories.items[0]
255
+ : null;
256
+
257
+ return {
258
+ // error,
259
+ // loading,
260
+ dataResult,
261
+ // collectibleGameSets,
262
+ filteredAvailableGroups,
263
+ categoryUrlSuffix,
264
+ categoryUrlKey,
265
+ availableGroups,
266
+ attributeData,
267
+ alpha,
268
+ category,
269
+ activeFilters,
270
+ pageInfo
271
+ // productType
272
+ };
273
+ };