@ikas/storefront-providers 4.0.0-alpha.59 → 4.0.0-alpha.60

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