@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.
Files changed (66) hide show
  1. package/package.json +46 -0
  2. package/src/index.ts +22 -0
  3. package/src/models/prop-value/attribute-list.ts +8 -0
  4. package/src/models/prop-value/attribute.ts +8 -0
  5. package/src/models/prop-value/blog-category-list.ts +9 -0
  6. package/src/models/prop-value/blog-category.ts +6 -0
  7. package/src/models/prop-value/blog-list.ts +13 -0
  8. package/src/models/prop-value/blog.ts +6 -0
  9. package/src/models/prop-value/brand-list.ts +11 -0
  10. package/src/models/prop-value/brand.ts +6 -0
  11. package/src/models/prop-value/category-list.ts +11 -0
  12. package/src/models/prop-value/category.ts +6 -0
  13. package/src/models/prop-value/link.ts +22 -0
  14. package/src/models/prop-value/product-list.ts +29 -0
  15. package/src/models/prop-value/product.ts +7 -0
  16. package/src/models/prop-value/raffle-list.ts +6 -0
  17. package/src/models/prop-value/raffle.ts +6 -0
  18. package/src/models/ui/blog-category-list/index.ts +19 -0
  19. package/src/models/ui/blog-category-list/init.ts +54 -0
  20. package/src/models/ui/blog-list/index.ts +21 -0
  21. package/src/models/ui/blog-list/init.ts +49 -0
  22. package/src/models/ui/brand-list/index.ts +25 -0
  23. package/src/models/ui/brand-list/init.ts +47 -0
  24. package/src/models/ui/category-list/index.ts +25 -0
  25. package/src/models/ui/category-list/init.ts +50 -0
  26. package/src/models/ui/component-renderer/index.ts +5 -0
  27. package/src/models/ui/customer-review-list/index.ts +12 -0
  28. package/src/models/ui/customer-review-list/init.ts +33 -0
  29. package/src/models/ui/customer-review-summary-list/index.ts +12 -0
  30. package/src/models/ui/customer-review-summary-list/init.ts +33 -0
  31. package/src/models/ui/index.ts +12 -0
  32. package/src/models/ui/navigation-link/index.ts +7 -0
  33. package/src/models/ui/product-attribute-detail/index.ts +7 -0
  34. package/src/models/ui/product-attribute-list/index.ts +7 -0
  35. package/src/models/ui/product-list/index.ts +80 -0
  36. package/src/models/ui/product-list/init.ts +407 -0
  37. package/src/models/ui/raffle-list/index.ts +17 -0
  38. package/src/models/ui/raffle-list/init.ts +44 -0
  39. package/src/providers/helpers/raffle.ts +69 -0
  40. package/src/providers/page-data-get.ts +708 -0
  41. package/src/providers/placeholders.ts +138 -0
  42. package/src/providers/prop-value/attribute-list.ts +75 -0
  43. package/src/providers/prop-value/attribute.ts +77 -0
  44. package/src/providers/prop-value/blog-category-list.ts +29 -0
  45. package/src/providers/prop-value/blog-category.ts +49 -0
  46. package/src/providers/prop-value/blog-list.ts +61 -0
  47. package/src/providers/prop-value/blog.ts +41 -0
  48. package/src/providers/prop-value/boolean.ts +14 -0
  49. package/src/providers/prop-value/brand-list.ts +30 -0
  50. package/src/providers/prop-value/brand.ts +46 -0
  51. package/src/providers/prop-value/category-list.ts +31 -0
  52. package/src/providers/prop-value/category.ts +45 -0
  53. package/src/providers/prop-value/color.ts +14 -0
  54. package/src/providers/prop-value/custom.ts +560 -0
  55. package/src/providers/prop-value/image-list.ts +16 -0
  56. package/src/providers/prop-value/image.ts +16 -0
  57. package/src/providers/prop-value/index.ts +3 -0
  58. package/src/providers/prop-value/link.ts +259 -0
  59. package/src/providers/prop-value/product-detail.ts +92 -0
  60. package/src/providers/prop-value/product-list.ts +124 -0
  61. package/src/providers/prop-value/raffle-list.ts +20 -0
  62. package/src/providers/prop-value/raffle.ts +41 -0
  63. package/src/providers/prop-value/rich-text.ts +14 -0
  64. package/src/providers/prop-value/slider.ts +19 -0
  65. package/src/providers/prop-value/text.ts +14 -0
  66. 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
+ }