@ikas/storefront-providers 4.0.0-alpha.10
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/package.json +46 -0
- package/src/index.ts +22 -0
- package/src/models/prop-value/attribute-list.ts +8 -0
- package/src/models/prop-value/attribute.ts +8 -0
- package/src/models/prop-value/blog-category-list.ts +9 -0
- package/src/models/prop-value/blog-category.ts +6 -0
- package/src/models/prop-value/blog-list.ts +13 -0
- package/src/models/prop-value/blog.ts +6 -0
- package/src/models/prop-value/brand-list.ts +11 -0
- package/src/models/prop-value/brand.ts +6 -0
- package/src/models/prop-value/category-list.ts +11 -0
- package/src/models/prop-value/category.ts +6 -0
- package/src/models/prop-value/link.ts +22 -0
- package/src/models/prop-value/product-list.ts +29 -0
- package/src/models/prop-value/product.ts +7 -0
- package/src/models/prop-value/raffle-list.ts +6 -0
- package/src/models/prop-value/raffle.ts +6 -0
- package/src/models/ui/blog-category-list/index.ts +19 -0
- package/src/models/ui/blog-category-list/init.ts +54 -0
- package/src/models/ui/blog-list/index.ts +21 -0
- package/src/models/ui/blog-list/init.ts +49 -0
- package/src/models/ui/brand-list/index.ts +25 -0
- package/src/models/ui/brand-list/init.ts +47 -0
- package/src/models/ui/category-list/index.ts +25 -0
- package/src/models/ui/category-list/init.ts +50 -0
- package/src/models/ui/component-renderer/index.ts +5 -0
- package/src/models/ui/customer-review-list/index.ts +12 -0
- package/src/models/ui/customer-review-list/init.ts +33 -0
- package/src/models/ui/customer-review-summary-list/index.ts +12 -0
- package/src/models/ui/customer-review-summary-list/init.ts +33 -0
- package/src/models/ui/index.ts +12 -0
- package/src/models/ui/navigation-link/index.ts +7 -0
- package/src/models/ui/product-attribute-detail/index.ts +7 -0
- package/src/models/ui/product-attribute-list/index.ts +7 -0
- package/src/models/ui/product-list/index.ts +80 -0
- package/src/models/ui/product-list/init.ts +407 -0
- package/src/models/ui/raffle-list/index.ts +17 -0
- package/src/models/ui/raffle-list/init.ts +44 -0
- package/src/providers/helpers/raffle.ts +69 -0
- package/src/providers/page-data-get.ts +708 -0
- package/src/providers/placeholders.ts +138 -0
- package/src/providers/prop-value/attribute-list.ts +75 -0
- package/src/providers/prop-value/attribute.ts +77 -0
- package/src/providers/prop-value/blog-category-list.ts +29 -0
- package/src/providers/prop-value/blog-category.ts +49 -0
- package/src/providers/prop-value/blog-list.ts +61 -0
- package/src/providers/prop-value/blog.ts +41 -0
- package/src/providers/prop-value/boolean.ts +14 -0
- package/src/providers/prop-value/brand-list.ts +30 -0
- package/src/providers/prop-value/brand.ts +46 -0
- package/src/providers/prop-value/category-list.ts +31 -0
- package/src/providers/prop-value/category.ts +45 -0
- package/src/providers/prop-value/color.ts +14 -0
- package/src/providers/prop-value/custom.ts +560 -0
- package/src/providers/prop-value/image-list.ts +16 -0
- package/src/providers/prop-value/image.ts +16 -0
- package/src/providers/prop-value/index.ts +3 -0
- package/src/providers/prop-value/link.ts +259 -0
- package/src/providers/prop-value/product-detail.ts +92 -0
- package/src/providers/prop-value/product-list.ts +124 -0
- package/src/providers/prop-value/raffle-list.ts +20 -0
- package/src/providers/prop-value/raffle.ts +41 -0
- package/src/providers/prop-value/rich-text.ts +14 -0
- package/src/providers/prop-value/slider.ts +19 -0
- package/src/providers/prop-value/text.ts +14 -0
- package/src/providers/types.ts +88 -0
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
import _uniq from "lodash/uniq";
|
|
2
|
+
import { makeAutoObservable } from "mobx";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
IkasThemeJson,
|
|
6
|
+
IkasThemeJsonPageType,
|
|
7
|
+
IkasThemeJsonPageComponent,
|
|
8
|
+
IkasThemeJsonComponentPropType,
|
|
9
|
+
IkasThemeJsonComponentProp,
|
|
10
|
+
IkasThemeJsonPage,
|
|
11
|
+
IkasHTMLMetaDataTargetType,
|
|
12
|
+
IkasHTMLMetaData,
|
|
13
|
+
IkasMerchantSettings,
|
|
14
|
+
IkasCustomerReviewSummary,
|
|
15
|
+
IkasProduct,
|
|
16
|
+
IkasBlogMetaData,
|
|
17
|
+
IkasBlogMetaDataTargetType,
|
|
18
|
+
IkasThemeJsonPageSpecification,
|
|
19
|
+
IkasRaffleMetaData,
|
|
20
|
+
IkasRaffleMetadataTargetType,
|
|
21
|
+
} from "@ikas/storefront-models";
|
|
22
|
+
import { IkasStorefrontConfig } from "@ikas/storefront-config";
|
|
23
|
+
import { IkasProductFunctions } from "@ikas/storefront-model-functions";
|
|
24
|
+
|
|
25
|
+
import { IkasProductListPropValueProvider } from "./prop-value/product-list";
|
|
26
|
+
import IkasPropValueProvider from "./prop-value";
|
|
27
|
+
import { IkasProductPropValueProvider } from "./prop-value/product-detail";
|
|
28
|
+
import { IkasBrandListPropValueProvider } from "./prop-value/brand-list";
|
|
29
|
+
import { IkasBrandPropValueProvider } from "./prop-value/brand";
|
|
30
|
+
import {
|
|
31
|
+
IkasLinkPropValueProvider,
|
|
32
|
+
IkasLinkMetaDataTargetId,
|
|
33
|
+
IkasLinkMetaDataType,
|
|
34
|
+
} from "./prop-value/link";
|
|
35
|
+
import { IkasImageListPropValueProvider } from "./prop-value/image-list";
|
|
36
|
+
import { IkasTextPropValueProvider } from "./prop-value/text";
|
|
37
|
+
import { IkasColorPropValueProvider } from "./prop-value/color";
|
|
38
|
+
import { IkasBooleanPropValueProvider } from "./prop-value/boolean";
|
|
39
|
+
import { IkasImagePropValueProvider } from "./prop-value/image";
|
|
40
|
+
import { IkasCategoryPropValueProvider } from "./prop-value/category";
|
|
41
|
+
import { IkasCategoryListPropValueProvider } from "./prop-value/category-list";
|
|
42
|
+
import { IkasCustomPropValueProvider } from "./prop-value/custom";
|
|
43
|
+
|
|
44
|
+
import { IkasSliderPropValueProvider } from "./prop-value/slider";
|
|
45
|
+
import { IkasRichTextPropValueProvider } from "./prop-value/rich-text";
|
|
46
|
+
import { IkasBlogPropValueProvider } from "./prop-value/blog";
|
|
47
|
+
import { IkasBlogListPropValueProvider } from "./prop-value/blog-list";
|
|
48
|
+
import { IkasAttributePropValueProvider } from "./prop-value/attribute";
|
|
49
|
+
import { IkasAttributeListPropValueProvider } from "./prop-value/attribute-list";
|
|
50
|
+
import { IkasBlogCategoryPropValueProvider } from "./prop-value/blog-category";
|
|
51
|
+
import { IkasBlogCategoryListPropValueProvider } from "./prop-value/blog-category-list";
|
|
52
|
+
import { IkasRafflePropValueProvider } from "./prop-value/raffle";
|
|
53
|
+
import { IkasRaffleListPropValueProvider } from "./prop-value/raffle-list";
|
|
54
|
+
import { IkasPageComponentPropValue } from "./types";
|
|
55
|
+
import {
|
|
56
|
+
listBlog,
|
|
57
|
+
listBlogCategory,
|
|
58
|
+
listBlogMetaData,
|
|
59
|
+
listProductBrand,
|
|
60
|
+
listCategory,
|
|
61
|
+
listCustomerReviewSummary,
|
|
62
|
+
listHTMLMetaData,
|
|
63
|
+
listMerchantSettings,
|
|
64
|
+
listProductOptionSet,
|
|
65
|
+
listRaffle,
|
|
66
|
+
listRaffleMetaData,
|
|
67
|
+
searchProducts,
|
|
68
|
+
} from "@ikas/storefront-api";
|
|
69
|
+
import { populateRaffleProducts } from "./helpers/raffle";
|
|
70
|
+
import { IkasBrandPropValue } from "../models/prop-value/brand";
|
|
71
|
+
import { IkasBrandListPropValue } from "../models/prop-value/brand-list";
|
|
72
|
+
import { IkasProductListPropValue } from "../models/prop-value/product-list";
|
|
73
|
+
import { IkasProductPropValue } from "../models/prop-value/product";
|
|
74
|
+
import { IkasAttributePropValue } from "../models/prop-value/attribute";
|
|
75
|
+
import { IkasAttributeListPropValue } from "../models/prop-value/attribute-list";
|
|
76
|
+
import { IkasCategoryPropValue } from "../models/prop-value/category";
|
|
77
|
+
import { IkasCategoryListPropValue } from "../models/prop-value/category-list";
|
|
78
|
+
|
|
79
|
+
export class IkasPageDataProvider {
|
|
80
|
+
theme: IkasThemeJson;
|
|
81
|
+
pageType?: IkasThemeJsonPageType | null = null;
|
|
82
|
+
pageParams: Record<string, any> = {};
|
|
83
|
+
pageComponentPropValues: IkasPageComponentPropValue[] = [];
|
|
84
|
+
pageSpecificData?: any | null = null;
|
|
85
|
+
merchantSettings?: IkasMerchantSettings | null = null;
|
|
86
|
+
possiblePageTypes?: IkasThemeJsonPageType[] = []; // Used for distinguishing blog slug page from main slug page
|
|
87
|
+
linkMetaDataTargetIds: IkasLinkMetaDataTargetId[] = []; // Used for bulk fetching of link slugs
|
|
88
|
+
|
|
89
|
+
// Only used for product pages
|
|
90
|
+
productReviewSummary: IkasCustomerReviewSummary | null = null;
|
|
91
|
+
|
|
92
|
+
constructor(
|
|
93
|
+
theme: IkasThemeJson,
|
|
94
|
+
pageParams?: Record<string, any>,
|
|
95
|
+
pageType?: IkasThemeJsonPageType
|
|
96
|
+
) {
|
|
97
|
+
this.theme = theme;
|
|
98
|
+
this.pageParams = pageParams || {};
|
|
99
|
+
this.pageType = pageType;
|
|
100
|
+
|
|
101
|
+
makeAutoObservable(this);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
get page(): IkasThemeJsonPage | undefined {
|
|
105
|
+
if (this.pageType === IkasThemeJsonPageType.CUSTOM) {
|
|
106
|
+
const { slug } = this.pageParams;
|
|
107
|
+
return this.theme.pages.find(
|
|
108
|
+
(page) =>
|
|
109
|
+
page.type === IkasThemeJsonPageType.CUSTOM && page.slug === slug
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return this.theme.pages.find((page) => page.type === this.pageType);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
get nextPageData() {
|
|
117
|
+
return {
|
|
118
|
+
props: JSON.parse(
|
|
119
|
+
JSON.stringify({
|
|
120
|
+
propValues: this.pageComponentPropValues,
|
|
121
|
+
pageSpecificData: this.pageSpecificData || null,
|
|
122
|
+
pageType: this.page?.type || IkasThemeJsonPageType.CUSTOM,
|
|
123
|
+
pageTitle: this.page?.pageTitle || null,
|
|
124
|
+
pageDescription: this.page?.description || null,
|
|
125
|
+
canonicals: this.page?.canonicals || null,
|
|
126
|
+
disableIndex: this.page?.disableIndex || null,
|
|
127
|
+
themeSettings: this.theme.settings || {},
|
|
128
|
+
productReviewSummary: this.productReviewSummary,
|
|
129
|
+
configJson: IkasStorefrontConfig.toJSON(),
|
|
130
|
+
})
|
|
131
|
+
),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
get specification() {
|
|
136
|
+
const selectedPage = this.page;
|
|
137
|
+
let specification: IkasThemeJsonPageSpecification | undefined;
|
|
138
|
+
|
|
139
|
+
if (selectedPage?.type === IkasThemeJsonPageType.PRODUCT) {
|
|
140
|
+
specification = selectedPage.specifications?.find(
|
|
141
|
+
(s) => s.id === (this.pageSpecificData as IkasProduct)?.id
|
|
142
|
+
);
|
|
143
|
+
} else {
|
|
144
|
+
specification = selectedPage?.specifications?.find(
|
|
145
|
+
(s) => s.id === this.pageSpecificData?.id
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return specification;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
get pageComponents() {
|
|
153
|
+
if (this.specification) return this.specification.components;
|
|
154
|
+
return this.page?.components || [];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async getMerchantSettings() {
|
|
158
|
+
const merchantSettingsResponse = await listMerchantSettings({});
|
|
159
|
+
|
|
160
|
+
if (merchantSettingsResponse.isSuccess && merchantSettingsResponse.data) {
|
|
161
|
+
this.merchantSettings = merchantSettingsResponse.data;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async getPageData() {
|
|
166
|
+
if (!this.pageSpecificData) {
|
|
167
|
+
await this.getPageSpecificData();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (!this.page) return;
|
|
171
|
+
|
|
172
|
+
await this.getMerchantSettings();
|
|
173
|
+
this.pageComponentPropValues = await Promise.all(
|
|
174
|
+
this.pageComponents.map((pageComponent) =>
|
|
175
|
+
this.getPageComponentPropValues(pageComponent)
|
|
176
|
+
)
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
await this.setLinkSlugs();
|
|
180
|
+
await this.getProductReviewSummary();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async getProductReviewSummary() {
|
|
184
|
+
if (this.pageType === IkasThemeJsonPageType.PRODUCT) {
|
|
185
|
+
const responseReviewSummaryResponse = await listCustomerReviewSummary({
|
|
186
|
+
productId: {
|
|
187
|
+
eq: (this.pageSpecificData as IkasProduct)?.id,
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
if (
|
|
192
|
+
responseReviewSummaryResponse.isSuccess &&
|
|
193
|
+
responseReviewSummaryResponse.data?.data?.length
|
|
194
|
+
) {
|
|
195
|
+
this.productReviewSummary = responseReviewSummaryResponse.data.data[0];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async getPageSpecificData() {
|
|
201
|
+
if (
|
|
202
|
+
this.pageType &&
|
|
203
|
+
![
|
|
204
|
+
IkasThemeJsonPageType.BRAND,
|
|
205
|
+
IkasThemeJsonPageType.PRODUCT,
|
|
206
|
+
IkasThemeJsonPageType.CATEGORY,
|
|
207
|
+
IkasThemeJsonPageType.BLOG,
|
|
208
|
+
IkasThemeJsonPageType.BLOG_CATEGORY,
|
|
209
|
+
IkasThemeJsonPageType.RAFFLE_DETAIL,
|
|
210
|
+
].includes(this.pageType)
|
|
211
|
+
)
|
|
212
|
+
return;
|
|
213
|
+
|
|
214
|
+
const { slug } = this.pageParams as Record<string, string>;
|
|
215
|
+
if (!slug) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
let metaDataList:
|
|
220
|
+
| IkasHTMLMetaData[]
|
|
221
|
+
| IkasBlogMetaData[]
|
|
222
|
+
| IkasRaffleMetaData[] = [];
|
|
223
|
+
|
|
224
|
+
if (
|
|
225
|
+
this.possiblePageTypes?.includes(IkasThemeJsonPageType.BLOG) ||
|
|
226
|
+
this.possiblePageTypes?.includes(IkasThemeJsonPageType.BLOG_CATEGORY)
|
|
227
|
+
) {
|
|
228
|
+
const response = await listBlogMetaData({
|
|
229
|
+
slug: { eq: slug },
|
|
230
|
+
});
|
|
231
|
+
metaDataList = response.data?.data || [];
|
|
232
|
+
|
|
233
|
+
if (!metaDataList.length) return;
|
|
234
|
+
} else if (
|
|
235
|
+
this.possiblePageTypes?.includes(IkasThemeJsonPageType.RAFFLE_DETAIL)
|
|
236
|
+
) {
|
|
237
|
+
const response = await listRaffleMetaData({
|
|
238
|
+
slug: { eq: slug },
|
|
239
|
+
});
|
|
240
|
+
metaDataList = response.data || [];
|
|
241
|
+
|
|
242
|
+
if (!metaDataList.length) return;
|
|
243
|
+
} else {
|
|
244
|
+
const response = await listHTMLMetaData({
|
|
245
|
+
slug: { eq: slug },
|
|
246
|
+
});
|
|
247
|
+
metaDataList = response.data || [];
|
|
248
|
+
|
|
249
|
+
if (!metaDataList || !metaDataList.length) return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const metaData = metaDataList[0];
|
|
253
|
+
if (!metaData.targetId) return;
|
|
254
|
+
|
|
255
|
+
const handleProductPage = async () => {
|
|
256
|
+
const productsResponse = await searchProducts({
|
|
257
|
+
input: {
|
|
258
|
+
productIdList: [metaData.targetId!],
|
|
259
|
+
priceListId: IkasStorefrontConfig.getPriceListId(),
|
|
260
|
+
salesChannelId: IkasStorefrontConfig.getSalesChannelId(),
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
if (!productsResponse?.data?.data?.length) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const product = productsResponse.data.data[0];
|
|
269
|
+
|
|
270
|
+
// Set product option set if exists
|
|
271
|
+
if (product.productOptionSetId) {
|
|
272
|
+
const optionSetResponse = await listProductOptionSet({
|
|
273
|
+
id: { eq: product.productOptionSetId },
|
|
274
|
+
});
|
|
275
|
+
if (optionSetResponse.isSuccess && optionSetResponse?.data?.length) {
|
|
276
|
+
//@ts-ignore
|
|
277
|
+
product.productOptionSet = optionSetResponse.data[0];
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const selectedVariant = product.variants.find((v) => v.isActive);
|
|
282
|
+
if (!selectedVariant) return;
|
|
283
|
+
|
|
284
|
+
//@ts-ignore
|
|
285
|
+
product.selectedVariantValues = selectedVariant.variantValues;
|
|
286
|
+
|
|
287
|
+
const { getDisplayedVariantTypes } = IkasProductFunctions;
|
|
288
|
+
|
|
289
|
+
this.pageSpecificData = product as IkasProduct;
|
|
290
|
+
|
|
291
|
+
const displayedVariantTypes = getDisplayedVariantTypes(
|
|
292
|
+
this.pageSpecificData as IkasProduct,
|
|
293
|
+
//@ts-ignore
|
|
294
|
+
product.selectedVariantValues
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// Select the first displayed in stock variant
|
|
298
|
+
if (displayedVariantTypes.length) {
|
|
299
|
+
const displayedVariantType = displayedVariantTypes[0];
|
|
300
|
+
|
|
301
|
+
if (displayedVariantType.displayedVariantValues.length) {
|
|
302
|
+
const inStockVariant =
|
|
303
|
+
displayedVariantType.displayedVariantValues.find(
|
|
304
|
+
(dvv) => dvv.hasStock
|
|
305
|
+
);
|
|
306
|
+
if (inStockVariant) {
|
|
307
|
+
this.pageSpecificData.selectedVariantValues =
|
|
308
|
+
inStockVariant.variant.variantValues;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
this.pageType = IkasThemeJsonPageType.PRODUCT;
|
|
314
|
+
this.setPageMetaData(metaData);
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
const handleBrandPage = async () => {
|
|
318
|
+
const brandsResponse = await listProductBrand({
|
|
319
|
+
id: { eq: metaData.targetId },
|
|
320
|
+
});
|
|
321
|
+
if (!brandsResponse.isSuccess || !brandsResponse.data?.data?.length)
|
|
322
|
+
return;
|
|
323
|
+
|
|
324
|
+
const brand = brandsResponse.data.data[0];
|
|
325
|
+
this.pageSpecificData = brand;
|
|
326
|
+
this.pageType = IkasThemeJsonPageType.BRAND;
|
|
327
|
+
this.setPageMetaData(metaData);
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
const handleCategoryPage = async () => {
|
|
331
|
+
const categoriesResponse = await listCategory({
|
|
332
|
+
id: { eq: metaData.targetId },
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
if (
|
|
336
|
+
!categoriesResponse.isSuccess ||
|
|
337
|
+
!categoriesResponse.data?.data?.length
|
|
338
|
+
)
|
|
339
|
+
return;
|
|
340
|
+
|
|
341
|
+
const category = categoriesResponse.data.data[0];
|
|
342
|
+
this.pageSpecificData = category;
|
|
343
|
+
this.pageType = IkasThemeJsonPageType.CATEGORY;
|
|
344
|
+
this.setPageMetaData(metaData);
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
const handleBlogPage = async () => {
|
|
348
|
+
const blog = await listBlog({
|
|
349
|
+
id: { eq: metaData.targetId },
|
|
350
|
+
});
|
|
351
|
+
if (!blog) return;
|
|
352
|
+
|
|
353
|
+
this.pageSpecificData = blog;
|
|
354
|
+
this.pageType = IkasThemeJsonPageType.BLOG;
|
|
355
|
+
this.setPageMetaData(metaData);
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
const handleBlogCategoryPage = async () => {
|
|
359
|
+
const blogCategoriesResponse = await listBlogCategory({
|
|
360
|
+
id: { eq: metaData.targetId },
|
|
361
|
+
pagination: {
|
|
362
|
+
page: 1,
|
|
363
|
+
limit: 1,
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
if (
|
|
368
|
+
!blogCategoriesResponse.isSuccess ||
|
|
369
|
+
!blogCategoriesResponse.data?.data?.length
|
|
370
|
+
)
|
|
371
|
+
return;
|
|
372
|
+
|
|
373
|
+
const blogCategory = blogCategoriesResponse.data.data[0];
|
|
374
|
+
|
|
375
|
+
this.pageSpecificData = blogCategory;
|
|
376
|
+
this.pageType = IkasThemeJsonPageType.BLOG_CATEGORY;
|
|
377
|
+
this.setPageMetaData(metaData);
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
const handleRafflePage = async () => {
|
|
381
|
+
const response = await listRaffle({
|
|
382
|
+
id: { eq: metaData.targetId },
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
if (!response.isSuccess || !response.data?.data?.length) return;
|
|
386
|
+
|
|
387
|
+
const raffle = response.data.data[0];
|
|
388
|
+
await populateRaffleProducts([raffle]);
|
|
389
|
+
|
|
390
|
+
this.pageSpecificData = raffle;
|
|
391
|
+
this.pageType = IkasThemeJsonPageType.RAFFLE_DETAIL;
|
|
392
|
+
this.setPageMetaData(metaData);
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
switch (metaData.targetType) {
|
|
396
|
+
case IkasHTMLMetaDataTargetType.BRAND:
|
|
397
|
+
return await handleBrandPage();
|
|
398
|
+
|
|
399
|
+
case IkasHTMLMetaDataTargetType.CATEGORY:
|
|
400
|
+
return await handleCategoryPage();
|
|
401
|
+
|
|
402
|
+
case IkasHTMLMetaDataTargetType.PRODUCT:
|
|
403
|
+
return await handleProductPage();
|
|
404
|
+
|
|
405
|
+
case IkasBlogMetaDataTargetType.BLOG:
|
|
406
|
+
return await handleBlogPage();
|
|
407
|
+
|
|
408
|
+
case IkasBlogMetaDataTargetType.BLOG_CATEGORY:
|
|
409
|
+
return await handleBlogCategoryPage();
|
|
410
|
+
|
|
411
|
+
case IkasRaffleMetadataTargetType.RAFFLE:
|
|
412
|
+
return await handleRafflePage();
|
|
413
|
+
default:
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
async getPageComponentPropValues(pageComponent: IkasThemeJsonPageComponent) {
|
|
419
|
+
const component = this.theme!.components.find(
|
|
420
|
+
(c) => c.id === pageComponent.componentId
|
|
421
|
+
)!;
|
|
422
|
+
|
|
423
|
+
const result: IkasPageComponentPropValue = {
|
|
424
|
+
pageComponent,
|
|
425
|
+
component,
|
|
426
|
+
propValues: {},
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
const setPageComponentPropValue = async (
|
|
430
|
+
prop: IkasThemeJsonComponentProp
|
|
431
|
+
) => {
|
|
432
|
+
result.propValues[prop.name] = await this.getPageComponentPropValue(
|
|
433
|
+
pageComponent,
|
|
434
|
+
prop
|
|
435
|
+
);
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
await Promise.all(component.props.map(setPageComponentPropValue));
|
|
439
|
+
|
|
440
|
+
return result;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
async getPageComponentPropValue(
|
|
444
|
+
pageComponent: IkasThemeJsonPageComponent,
|
|
445
|
+
prop: IkasThemeJsonComponentProp
|
|
446
|
+
) {
|
|
447
|
+
let propValueProvider: IkasPropValueProvider<any> | undefined;
|
|
448
|
+
const propValue = pageComponent.propValues[prop.name];
|
|
449
|
+
const emptyPropValueTypes = [IkasThemeJsonComponentPropType.RAFFLE_LIST];
|
|
450
|
+
|
|
451
|
+
if (
|
|
452
|
+
(propValue === null || propValue === undefined) &&
|
|
453
|
+
!emptyPropValueTypes.includes(prop.type)
|
|
454
|
+
)
|
|
455
|
+
return null;
|
|
456
|
+
|
|
457
|
+
switch (prop.type) {
|
|
458
|
+
case IkasThemeJsonComponentPropType.TEXT:
|
|
459
|
+
propValueProvider = new IkasTextPropValueProvider(propValue as string);
|
|
460
|
+
break;
|
|
461
|
+
|
|
462
|
+
case IkasThemeJsonComponentPropType.RICH_TEXT:
|
|
463
|
+
propValueProvider = new IkasRichTextPropValueProvider(
|
|
464
|
+
propValue as string
|
|
465
|
+
);
|
|
466
|
+
break;
|
|
467
|
+
|
|
468
|
+
case IkasThemeJsonComponentPropType.BOOLEAN:
|
|
469
|
+
propValueProvider = new IkasBooleanPropValueProvider(
|
|
470
|
+
propValue as boolean
|
|
471
|
+
);
|
|
472
|
+
break;
|
|
473
|
+
|
|
474
|
+
case IkasThemeJsonComponentPropType.IMAGE:
|
|
475
|
+
propValueProvider = new IkasImagePropValueProvider(propValue as string);
|
|
476
|
+
break;
|
|
477
|
+
|
|
478
|
+
case IkasThemeJsonComponentPropType.IMAGE_LIST:
|
|
479
|
+
propValueProvider = new IkasImageListPropValueProvider(
|
|
480
|
+
propValue as string[]
|
|
481
|
+
);
|
|
482
|
+
break;
|
|
483
|
+
|
|
484
|
+
case IkasThemeJsonComponentPropType.BRAND:
|
|
485
|
+
propValueProvider = new IkasBrandPropValueProvider(
|
|
486
|
+
propValue as IkasBrandPropValue
|
|
487
|
+
);
|
|
488
|
+
break;
|
|
489
|
+
|
|
490
|
+
case IkasThemeJsonComponentPropType.BRAND_LIST:
|
|
491
|
+
propValueProvider = new IkasBrandListPropValueProvider(
|
|
492
|
+
propValue as IkasBrandListPropValue
|
|
493
|
+
);
|
|
494
|
+
break;
|
|
495
|
+
|
|
496
|
+
case IkasThemeJsonComponentPropType.PRODUCT_LIST:
|
|
497
|
+
propValueProvider = new IkasProductListPropValueProvider(
|
|
498
|
+
this.pageType!,
|
|
499
|
+
propValue as IkasProductListPropValue,
|
|
500
|
+
this.pageSpecificData
|
|
501
|
+
);
|
|
502
|
+
break;
|
|
503
|
+
|
|
504
|
+
case IkasThemeJsonComponentPropType.PRODUCT_DETAIL:
|
|
505
|
+
propValueProvider = new IkasProductPropValueProvider(
|
|
506
|
+
propValue as IkasProductPropValue
|
|
507
|
+
);
|
|
508
|
+
break;
|
|
509
|
+
|
|
510
|
+
case IkasThemeJsonComponentPropType.PRODUCT_ATTRIBUTE:
|
|
511
|
+
propValueProvider = new IkasAttributePropValueProvider(
|
|
512
|
+
propValue as IkasAttributePropValue
|
|
513
|
+
);
|
|
514
|
+
break;
|
|
515
|
+
|
|
516
|
+
case IkasThemeJsonComponentPropType.PRODUCT_ATTRIBUTE_LIST:
|
|
517
|
+
propValueProvider = new IkasAttributeListPropValueProvider(
|
|
518
|
+
propValue as IkasAttributeListPropValue
|
|
519
|
+
);
|
|
520
|
+
break;
|
|
521
|
+
|
|
522
|
+
case IkasThemeJsonComponentPropType.CATEGORY:
|
|
523
|
+
propValueProvider = new IkasCategoryPropValueProvider(
|
|
524
|
+
propValue as IkasCategoryPropValue
|
|
525
|
+
);
|
|
526
|
+
break;
|
|
527
|
+
|
|
528
|
+
case IkasThemeJsonComponentPropType.CATEGORY_LIST:
|
|
529
|
+
propValueProvider = new IkasCategoryListPropValueProvider(
|
|
530
|
+
propValue as IkasCategoryListPropValue
|
|
531
|
+
);
|
|
532
|
+
break;
|
|
533
|
+
|
|
534
|
+
case IkasThemeJsonComponentPropType.LINK:
|
|
535
|
+
case IkasThemeJsonComponentPropType.LIST_OF_LINK:
|
|
536
|
+
propValueProvider = new IkasLinkPropValueProvider(
|
|
537
|
+
propValue,
|
|
538
|
+
this.theme,
|
|
539
|
+
this.linkMetaDataTargetIds
|
|
540
|
+
);
|
|
541
|
+
break;
|
|
542
|
+
|
|
543
|
+
case IkasThemeJsonComponentPropType.COLOR:
|
|
544
|
+
propValueProvider = new IkasColorPropValueProvider(propValue as string);
|
|
545
|
+
break;
|
|
546
|
+
|
|
547
|
+
case IkasThemeJsonComponentPropType.CUSTOM:
|
|
548
|
+
const customData = this.theme.customData.find(
|
|
549
|
+
(cd) => cd.id === prop.customDataId
|
|
550
|
+
);
|
|
551
|
+
if (!customData) return;
|
|
552
|
+
|
|
553
|
+
propValueProvider = new IkasCustomPropValueProvider(
|
|
554
|
+
propValue,
|
|
555
|
+
customData,
|
|
556
|
+
this.theme,
|
|
557
|
+
this.pageType!,
|
|
558
|
+
this,
|
|
559
|
+
this.pageSpecificData,
|
|
560
|
+
this.pageParams
|
|
561
|
+
);
|
|
562
|
+
break;
|
|
563
|
+
|
|
564
|
+
case IkasThemeJsonComponentPropType.COMPONENT:
|
|
565
|
+
case IkasThemeJsonComponentPropType.COMPONENT_LIST:
|
|
566
|
+
const pageComponents = propValue as IkasThemeJsonPageComponent[];
|
|
567
|
+
return await Promise.all(
|
|
568
|
+
pageComponents.map((tp) => this.getPageComponentPropValues(tp))
|
|
569
|
+
);
|
|
570
|
+
|
|
571
|
+
case IkasThemeJsonComponentPropType.BLOG:
|
|
572
|
+
propValueProvider = new IkasBlogPropValueProvider(propValue);
|
|
573
|
+
break;
|
|
574
|
+
|
|
575
|
+
case IkasThemeJsonComponentPropType.BLOG_LIST:
|
|
576
|
+
propValueProvider = new IkasBlogListPropValueProvider(
|
|
577
|
+
this.pageType!,
|
|
578
|
+
propValue,
|
|
579
|
+
this.pageSpecificData
|
|
580
|
+
);
|
|
581
|
+
break;
|
|
582
|
+
|
|
583
|
+
case IkasThemeJsonComponentPropType.BLOG_CATEGORY:
|
|
584
|
+
propValueProvider = new IkasBlogCategoryPropValueProvider(propValue);
|
|
585
|
+
break;
|
|
586
|
+
|
|
587
|
+
case IkasThemeJsonComponentPropType.BLOG_CATEGORY_LIST:
|
|
588
|
+
propValueProvider = new IkasBlogCategoryListPropValueProvider(
|
|
589
|
+
propValue
|
|
590
|
+
);
|
|
591
|
+
break;
|
|
592
|
+
|
|
593
|
+
case IkasThemeJsonComponentPropType.RAFFLE:
|
|
594
|
+
propValueProvider = new IkasRafflePropValueProvider(propValue);
|
|
595
|
+
break;
|
|
596
|
+
|
|
597
|
+
case IkasThemeJsonComponentPropType.RAFFLE_LIST:
|
|
598
|
+
propValueProvider = new IkasRaffleListPropValueProvider();
|
|
599
|
+
break;
|
|
600
|
+
|
|
601
|
+
case IkasThemeJsonComponentPropType.SLIDER:
|
|
602
|
+
propValueProvider = new IkasSliderPropValueProvider(propValue);
|
|
603
|
+
break;
|
|
604
|
+
|
|
605
|
+
default:
|
|
606
|
+
break;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
return await propValueProvider?.getValue();
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
private setPageMetaData(
|
|
613
|
+
metaData: IkasHTMLMetaData | IkasBlogMetaData | IkasRaffleMetaData
|
|
614
|
+
) {
|
|
615
|
+
if (this.page) {
|
|
616
|
+
this.page.pageTitle = metaData.pageTitle || null;
|
|
617
|
+
this.page.description = metaData.description || null;
|
|
618
|
+
this.page.canonicals = metaData.canonicals || null;
|
|
619
|
+
this.page.disableIndex = metaData.disableIndex || null;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
async setLinkSlugs() {
|
|
624
|
+
const defaultLinks: IkasLinkMetaDataTargetId[] = [];
|
|
625
|
+
const blogLinks: IkasLinkMetaDataTargetId[] = [];
|
|
626
|
+
const raffleLinks: IkasLinkMetaDataTargetId[] = [];
|
|
627
|
+
|
|
628
|
+
this.linkMetaDataTargetIds.forEach((target) => {
|
|
629
|
+
switch (target.type) {
|
|
630
|
+
case "DEFAULT":
|
|
631
|
+
defaultLinks.push(target);
|
|
632
|
+
break;
|
|
633
|
+
|
|
634
|
+
case "BLOG":
|
|
635
|
+
blogLinks.push(target);
|
|
636
|
+
break;
|
|
637
|
+
|
|
638
|
+
case "RAFFLE":
|
|
639
|
+
raffleLinks.push(target);
|
|
640
|
+
break;
|
|
641
|
+
|
|
642
|
+
default:
|
|
643
|
+
break;
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
return await Promise.all([
|
|
648
|
+
this.getLinkSlugs(defaultLinks, "DEFAULT"),
|
|
649
|
+
this.getLinkSlugs(blogLinks, "BLOG"),
|
|
650
|
+
this.getLinkSlugs(raffleLinks, "RAFFLE"),
|
|
651
|
+
]);
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
private async getLinkSlugs(
|
|
655
|
+
targets: IkasLinkMetaDataTargetId[],
|
|
656
|
+
type: IkasLinkMetaDataType
|
|
657
|
+
) {
|
|
658
|
+
const idList = _uniq(targets.map((t) => t.id));
|
|
659
|
+
let metaDataList: (
|
|
660
|
+
| IkasHTMLMetaData
|
|
661
|
+
| IkasBlogMetaData
|
|
662
|
+
| IkasRaffleMetaData
|
|
663
|
+
)[] = [];
|
|
664
|
+
|
|
665
|
+
const getPage = async () => {
|
|
666
|
+
let results:
|
|
667
|
+
| (IkasHTMLMetaData | IkasBlogMetaData | IkasRaffleMetaData)[]
|
|
668
|
+
| undefined = [];
|
|
669
|
+
|
|
670
|
+
switch (type) {
|
|
671
|
+
case "DEFAULT":
|
|
672
|
+
const htmlMetaDataResponse = await listHTMLMetaData({
|
|
673
|
+
id: { in: idList },
|
|
674
|
+
});
|
|
675
|
+
results = htmlMetaDataResponse.data || [];
|
|
676
|
+
break;
|
|
677
|
+
|
|
678
|
+
case "BLOG":
|
|
679
|
+
const blogMetaDataResponse = await listBlogMetaData({
|
|
680
|
+
id: { in: idList },
|
|
681
|
+
});
|
|
682
|
+
results = blogMetaDataResponse.data?.data || [];
|
|
683
|
+
break;
|
|
684
|
+
|
|
685
|
+
case "RAFFLE":
|
|
686
|
+
const raffleMetaDataResponse = await listRaffleMetaData({
|
|
687
|
+
id: { in: idList },
|
|
688
|
+
});
|
|
689
|
+
results = raffleMetaDataResponse.data || [];
|
|
690
|
+
break;
|
|
691
|
+
|
|
692
|
+
default:
|
|
693
|
+
break;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
if (results.length) metaDataList = results;
|
|
697
|
+
};
|
|
698
|
+
|
|
699
|
+
await getPage();
|
|
700
|
+
|
|
701
|
+
targets.forEach((target) => {
|
|
702
|
+
const metaData = metaDataList.find((md) => md.targetId === target.id);
|
|
703
|
+
if (metaData) {
|
|
704
|
+
target.navigationLink.href += metaData.slug;
|
|
705
|
+
}
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
}
|