@gem-sdk/core 1.5.17 → 1.5.22

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 (206) hide show
  1. package/dist/cjs/components/AddOn.js +7 -7
  2. package/dist/cjs/components/ComponentWrapper.js +14 -8
  3. package/dist/cjs/components/ComponentWrapperPreview.js +55 -46
  4. package/dist/cjs/components/Empty.js +1 -1
  5. package/dist/cjs/components/Render.js +50 -13
  6. package/dist/cjs/components/Render.liquid.js +81 -57
  7. package/dist/cjs/components/RenderBlock.js +41 -8
  8. package/dist/cjs/components/RenderPreview.js +51 -13
  9. package/dist/cjs/components/RenderSection.js +11 -7
  10. package/dist/cjs/components/constant.js +24 -24
  11. package/dist/cjs/contexts/AddonContext.js +25 -14
  12. package/dist/cjs/contexts/BuilderComponent.js +23 -19
  13. package/dist/cjs/contexts/BuilderContext.js +25 -19
  14. package/dist/cjs/contexts/BuilderPreviewContext.js +349 -341
  15. package/dist/cjs/contexts/CartLineContext.js +19 -14
  16. package/dist/cjs/contexts/CollectionContext.js +21 -13
  17. package/dist/cjs/contexts/ProductContext.js +136 -115
  18. package/dist/cjs/contexts/ProductListContext.js +21 -13
  19. package/dist/cjs/contexts/SectionContext.js +41 -37
  20. package/dist/cjs/contexts/ShopContext.js +49 -31
  21. package/dist/cjs/graphql/fragments/analytic.generated.js +1 -1
  22. package/dist/cjs/graphql/fragments/collection-detail.generated.js +1 -1
  23. package/dist/cjs/graphql/fragments/collection-product.generated.js +1 -1
  24. package/dist/cjs/graphql/fragments/custom-code.generated.js +1 -1
  25. package/dist/cjs/graphql/fragments/data-seo.generated.js +1 -1
  26. package/dist/cjs/graphql/fragments/media.generated.js +1 -1
  27. package/dist/cjs/graphql/fragments/product-little.generated.js +1 -1
  28. package/dist/cjs/graphql/fragments/product-option-value.generated.js +1 -1
  29. package/dist/cjs/graphql/fragments/product-option.generated.js +1 -1
  30. package/dist/cjs/graphql/fragments/product.generated.js +1 -1
  31. package/dist/cjs/graphql/fragments/published-custom-section.generated.js +1 -1
  32. package/dist/cjs/graphql/fragments/published-page-section.generated.js +1 -1
  33. package/dist/cjs/graphql/fragments/published-theme-page.generated.js +1 -1
  34. package/dist/cjs/graphql/fragments/published-theme-style.generated.js +1 -1
  35. package/dist/cjs/graphql/fragments/selected-option.generated.js +1 -1
  36. package/dist/cjs/graphql/fragments/variant.generated.js +1 -1
  37. package/dist/cjs/graphql/mutations/page-view-up.generated.js +1 -1
  38. package/dist/cjs/graphql/queries/products.generated.js +1 -1
  39. package/dist/cjs/graphql/queries/store-property.generated.js +1 -1
  40. package/dist/cjs/helpers/GlobalEvent.js +12 -10
  41. package/dist/cjs/helpers/background.js +96 -96
  42. package/dist/cjs/helpers/borders.js +123 -127
  43. package/dist/cjs/helpers/clone-deep.js +1 -1
  44. package/dist/cjs/helpers/cls.js +11 -15
  45. package/dist/cjs/helpers/colors.js +121 -156
  46. package/dist/cjs/helpers/compose-advance-style.js +115 -121
  47. package/dist/cjs/helpers/constant.js +16 -11
  48. package/dist/cjs/helpers/css-variable.js +2 -2
  49. package/dist/cjs/helpers/email.js +3 -3
  50. package/dist/cjs/helpers/flatten-connection.js +4 -5
  51. package/dist/cjs/helpers/get-resonsive-value.js +24 -25
  52. package/dist/cjs/helpers/get-shortname.js +87 -87
  53. package/dist/cjs/helpers/is-browser.js +2 -2
  54. package/dist/cjs/helpers/is-defined.js +2 -2
  55. package/dist/cjs/helpers/is-empty-children.js +2 -2
  56. package/dist/cjs/helpers/layout.js +9 -10
  57. package/dist/cjs/helpers/load-script.js +26 -27
  58. package/dist/cjs/helpers/make-style.js +77 -86
  59. package/dist/cjs/helpers/normalize-builder-data.js +18 -12
  60. package/dist/cjs/helpers/prefetch-queries.js +72 -52
  61. package/dist/cjs/helpers/product.js +25 -29
  62. package/dist/cjs/helpers/queries/get-collection.js +179 -167
  63. package/dist/cjs/helpers/queries/get-product-by-slug.js +103 -94
  64. package/dist/cjs/helpers/queries/get-product.js +121 -106
  65. package/dist/cjs/helpers/queries/get-products.js +137 -125
  66. package/dist/cjs/helpers/radius.js +78 -81
  67. package/dist/cjs/helpers/render.js +56 -56
  68. package/dist/cjs/helpers/shadow.js +38 -38
  69. package/dist/cjs/helpers/size.js +12 -13
  70. package/dist/cjs/helpers/spacing.js +35 -37
  71. package/dist/cjs/helpers/tracking/fpixel.js +21 -22
  72. package/dist/cjs/helpers/tracking/gtag.js +84 -90
  73. package/dist/cjs/helpers/tracking/tiktokpixel.js +12 -12
  74. package/dist/cjs/helpers/typography.js +2 -2
  75. package/dist/cjs/hooks/cart/use-add-to-cart.js +10 -10
  76. package/dist/cjs/hooks/cart/use-cart-data.js +18 -16
  77. package/dist/cjs/hooks/cart/use-cart-discount-codes-update.js +10 -10
  78. package/dist/cjs/hooks/cart/use-cart-note-update.js +10 -10
  79. package/dist/cjs/hooks/cart/use-create-cart.js +12 -12
  80. package/dist/cjs/hooks/cart/use-remove-cart-item.js +10 -10
  81. package/dist/cjs/hooks/cart/use-update-cart-item.js +10 -10
  82. package/dist/cjs/hooks/shop/use-collection-query.js +12 -6
  83. package/dist/cjs/hooks/shop/use-product-query.js +12 -6
  84. package/dist/cjs/hooks/shop/use-products-query.js +14 -6
  85. package/dist/cjs/hooks/shop.js +86 -67
  86. package/dist/cjs/hooks/use-current-device.js +14 -16
  87. package/dist/cjs/hooks/use-lazy-video.js +7 -7
  88. package/dist/cjs/hooks/useCartId.js +35 -27
  89. package/dist/cjs/hooks/useCartLine.js +2 -2
  90. package/dist/cjs/hooks/useCartUI.js +37 -31
  91. package/dist/cjs/hooks/useCollection.js +2 -2
  92. package/dist/cjs/hooks/useFetchHandle.js +6 -6
  93. package/dist/cjs/hooks/useFormatMoney.js +11 -7
  94. package/dist/cjs/hooks/useIsomorphicLayoutEffect.js +1 -1
  95. package/dist/cjs/hooks/useLoadScript.js +22 -20
  96. package/dist/cjs/hooks/useMoney.js +59 -42
  97. package/dist/cjs/hooks/usePrevious.js +12 -10
  98. package/dist/cjs/hooks/useProduct.js +92 -69
  99. package/dist/cjs/hooks/useProductList.js +11 -11
  100. package/dist/cjs/hooks/useSuspenseFetch.js +20 -17
  101. package/dist/cjs/hooks/useSwatchesOptions.js +32 -30
  102. package/dist/cjs/types/global-style.js +9 -2
  103. package/dist/esm/components/AddOn.js +7 -7
  104. package/dist/esm/components/ComponentWrapper.js +14 -8
  105. package/dist/esm/components/ComponentWrapperPreview.js +55 -46
  106. package/dist/esm/components/Empty.js +1 -1
  107. package/dist/esm/components/Render.js +50 -13
  108. package/dist/esm/components/Render.liquid.js +81 -57
  109. package/dist/esm/components/RenderBlock.js +41 -8
  110. package/dist/esm/components/RenderPreview.js +51 -13
  111. package/dist/esm/components/RenderSection.js +11 -7
  112. package/dist/esm/components/constant.js +24 -24
  113. package/dist/esm/contexts/AddonContext.js +26 -15
  114. package/dist/esm/contexts/BuilderComponent.js +24 -20
  115. package/dist/esm/contexts/BuilderContext.js +26 -20
  116. package/dist/esm/contexts/BuilderPreviewContext.js +350 -342
  117. package/dist/esm/contexts/CartLineContext.js +20 -15
  118. package/dist/esm/contexts/CollectionContext.js +22 -14
  119. package/dist/esm/contexts/ProductContext.js +137 -116
  120. package/dist/esm/contexts/ProductListContext.js +22 -14
  121. package/dist/esm/contexts/SectionContext.js +42 -38
  122. package/dist/esm/contexts/ShopContext.js +50 -32
  123. package/dist/esm/graphql/fragments/analytic.generated.js +1 -1
  124. package/dist/esm/graphql/fragments/collection-detail.generated.js +1 -1
  125. package/dist/esm/graphql/fragments/collection-product.generated.js +1 -1
  126. package/dist/esm/graphql/fragments/custom-code.generated.js +1 -1
  127. package/dist/esm/graphql/fragments/data-seo.generated.js +1 -1
  128. package/dist/esm/graphql/fragments/media.generated.js +1 -1
  129. package/dist/esm/graphql/fragments/product-little.generated.js +1 -1
  130. package/dist/esm/graphql/fragments/product-option-value.generated.js +1 -1
  131. package/dist/esm/graphql/fragments/product-option.generated.js +1 -1
  132. package/dist/esm/graphql/fragments/product.generated.js +1 -1
  133. package/dist/esm/graphql/fragments/published-custom-section.generated.js +1 -1
  134. package/dist/esm/graphql/fragments/published-page-section.generated.js +1 -1
  135. package/dist/esm/graphql/fragments/published-theme-page.generated.js +1 -1
  136. package/dist/esm/graphql/fragments/published-theme-style.generated.js +1 -1
  137. package/dist/esm/graphql/fragments/selected-option.generated.js +1 -1
  138. package/dist/esm/graphql/fragments/variant.generated.js +1 -1
  139. package/dist/esm/graphql/mutations/page-view-up.generated.js +1 -1
  140. package/dist/esm/graphql/queries/products.generated.js +1 -1
  141. package/dist/esm/graphql/queries/store-property.generated.js +1 -1
  142. package/dist/esm/helpers/GlobalEvent.js +12 -10
  143. package/dist/esm/helpers/background.js +96 -96
  144. package/dist/esm/helpers/borders.js +123 -127
  145. package/dist/esm/helpers/clone-deep.js +1 -1
  146. package/dist/esm/helpers/cls.js +11 -15
  147. package/dist/esm/helpers/colors.js +121 -156
  148. package/dist/esm/helpers/compose-advance-style.js +115 -121
  149. package/dist/esm/helpers/constant.js +16 -11
  150. package/dist/esm/helpers/css-variable.js +2 -2
  151. package/dist/esm/helpers/email.js +3 -3
  152. package/dist/esm/helpers/flatten-connection.js +4 -5
  153. package/dist/esm/helpers/get-resonsive-value.js +24 -25
  154. package/dist/esm/helpers/get-shortname.js +87 -87
  155. package/dist/esm/helpers/is-browser.js +2 -2
  156. package/dist/esm/helpers/is-defined.js +2 -2
  157. package/dist/esm/helpers/is-empty-children.js +2 -2
  158. package/dist/esm/helpers/layout.js +9 -10
  159. package/dist/esm/helpers/load-script.js +26 -27
  160. package/dist/esm/helpers/make-style.js +77 -86
  161. package/dist/esm/helpers/normalize-builder-data.js +18 -12
  162. package/dist/esm/helpers/prefetch-queries.js +72 -52
  163. package/dist/esm/helpers/product.js +25 -29
  164. package/dist/esm/helpers/queries/get-collection.js +179 -167
  165. package/dist/esm/helpers/queries/get-product-by-slug.js +103 -94
  166. package/dist/esm/helpers/queries/get-product.js +121 -106
  167. package/dist/esm/helpers/queries/get-products.js +137 -125
  168. package/dist/esm/helpers/radius.js +78 -81
  169. package/dist/esm/helpers/render.js +56 -56
  170. package/dist/esm/helpers/shadow.js +38 -38
  171. package/dist/esm/helpers/size.js +12 -13
  172. package/dist/esm/helpers/spacing.js +35 -37
  173. package/dist/esm/helpers/tracking/fpixel.js +21 -22
  174. package/dist/esm/helpers/tracking/gtag.js +84 -90
  175. package/dist/esm/helpers/tracking/tiktokpixel.js +12 -12
  176. package/dist/esm/helpers/typography.js +2 -2
  177. package/dist/esm/hooks/cart/use-add-to-cart.js +10 -10
  178. package/dist/esm/hooks/cart/use-cart-data.js +18 -16
  179. package/dist/esm/hooks/cart/use-cart-discount-codes-update.js +10 -10
  180. package/dist/esm/hooks/cart/use-cart-note-update.js +10 -10
  181. package/dist/esm/hooks/cart/use-create-cart.js +12 -12
  182. package/dist/esm/hooks/cart/use-remove-cart-item.js +10 -10
  183. package/dist/esm/hooks/cart/use-update-cart-item.js +10 -10
  184. package/dist/esm/hooks/shop/use-collection-query.js +12 -6
  185. package/dist/esm/hooks/shop/use-product-query.js +12 -6
  186. package/dist/esm/hooks/shop/use-products-query.js +14 -6
  187. package/dist/esm/hooks/shop.js +86 -67
  188. package/dist/esm/hooks/use-current-device.js +14 -16
  189. package/dist/esm/hooks/use-lazy-video.js +7 -7
  190. package/dist/esm/hooks/useCartId.js +35 -27
  191. package/dist/esm/hooks/useCartLine.js +2 -2
  192. package/dist/esm/hooks/useCartUI.js +37 -31
  193. package/dist/esm/hooks/useCollection.js +2 -2
  194. package/dist/esm/hooks/useFetchHandle.js +6 -6
  195. package/dist/esm/hooks/useFormatMoney.js +11 -7
  196. package/dist/esm/hooks/useIsomorphicLayoutEffect.js +1 -1
  197. package/dist/esm/hooks/useLoadScript.js +22 -20
  198. package/dist/esm/hooks/useMoney.js +59 -42
  199. package/dist/esm/hooks/usePrevious.js +12 -10
  200. package/dist/esm/hooks/useProduct.js +92 -69
  201. package/dist/esm/hooks/useProductList.js +11 -11
  202. package/dist/esm/hooks/useSuspenseFetch.js +20 -17
  203. package/dist/esm/hooks/useSwatchesOptions.js +32 -30
  204. package/dist/esm/types/global-style.js +9 -2
  205. package/dist/types/index.d.ts +24 -2
  206. package/package.json +1 -1
@@ -6,347 +6,355 @@ var zustand = require('zustand');
6
6
  var cloneDeep = require('../helpers/clone-deep.js');
7
7
  var normalizeBuilderData = require('../helpers/normalize-builder-data.js');
8
8
 
9
- function moveByIndex(input, from, to) {
10
- const elm = input.splice(from, 1)[0];
11
- if (elm !== undefined) {
12
- input.splice(to, 0, elm);
13
- }
14
- }
15
- function removeByKey(id, data) {
16
- const item = data[id];
17
- if (item) {
18
- delete data[id];
19
- if (item.type !== 'section') {
20
- item.childrens?.map((child) => removeByKey(child, data));
21
- }
22
- }
23
- }
24
- const BuilderPreviewContext = react.createContext(null);
25
- const root = {
26
- uid: 'ROOT',
27
- tag: 'Root',
28
- label: 'Root',
29
- childrens: [],
30
- };
31
- const createBuilderPreviewProvider = (args) => zustand.createStore((set, get) => ({
32
- state: args,
33
- addItem: (args) => {
34
- const { position, data } = args;
35
- const state = get().state;
36
- const dateModified = Date.now();
37
- if (args.type === 'section') {
38
- if (!Array.isArray(data)) {
39
- const sectionId = data.uid;
40
- // Section only add to ROOT
41
- const ROOT = state.ROOT;
42
- if (!ROOT.childrens) {
43
- ROOT.childrens = [sectionId];
44
- }
45
- else {
46
- ROOT.childrens.splice(position ?? 0, 0, sectionId);
47
- }
48
- ROOT.dateModified = dateModified;
49
- set({
50
- state: {
51
- ...state,
52
- [sectionId]: {
53
- uid: sectionId,
54
- type: 'section',
55
- label: data.label,
56
- },
57
- ROOT: cloneDeep.cloneDeep(ROOT),
58
- },
59
- });
60
- }
61
- }
62
- else {
63
- const { id, data } = args;
64
- const parent = id ? state[id] ?? state.ROOT : state.ROOT;
65
- // Can't add item to section
66
- if (parent.type === 'section')
67
- return;
68
- if (Array.isArray(data)) {
69
- const childrens = data.map((v) => v.uid);
70
- const newState = data.reduceRight((prev, current) => {
71
- const item = normalizeBuilderData.normalizeBuilderData(current);
72
- return {
73
- ...prev,
74
- ...item,
75
- };
76
- }, {});
77
- parent.dateModified = dateModified;
78
- parent.childrens = parent.childrens ?? [];
79
- parent.childrens.splice(position ?? 0, 0, ...childrens);
80
- set({
81
- state: {
82
- ...state,
83
- ...newState,
84
- [parent.uid]: cloneDeep.cloneDeep(parent),
85
- },
86
- });
87
- }
88
- else {
89
- const item = normalizeBuilderData.normalizeBuilderData(data);
90
- parent.dateModified = dateModified;
91
- parent.childrens = parent.childrens ?? [];
92
- parent.childrens.splice(position ?? 0, 0, data.uid);
93
- set({
94
- state: {
95
- ...state,
96
- ...item,
97
- [parent.uid]: cloneDeep.cloneDeep(parent),
98
- },
99
- });
100
- }
101
- }
102
- },
103
- changeItemProp: (id, data, group) => {
104
- if (!group || !['setting', 'style', 'advanced'].includes(group))
105
- return;
106
- const state = get().state;
107
- const item = state[id];
108
- // Ignore section
109
- if (item?.type === 'section')
110
- return;
111
- if (item) {
112
- const dateModified = Date.now();
113
- item.dateModified = dateModified;
114
- switch (group) {
115
- case 'setting':
116
- set({
117
- state: {
118
- ...state,
119
- [id]: {
120
- ...item,
121
- settings: {
122
- ...item.settings,
123
- ...data,
124
- },
125
- },
126
- },
127
- });
128
- break;
129
- case 'style':
130
- set({
131
- state: {
132
- ...state,
133
- [id]: {
134
- ...item,
135
- styles: {
136
- ...item.styles,
137
- ...data,
138
- },
139
- },
140
- },
141
- });
142
- break;
143
- case 'advanced':
144
- set({
145
- state: {
146
- ...state,
147
- [id]: {
148
- ...item,
149
- advanced: {
150
- ...item.advanced,
151
- ...data,
152
- },
153
- },
154
- },
155
- });
156
- break;
157
- }
158
- }
159
- },
160
- changeItemPropByKey: ({ id, key, data, group }) => {
161
- if (!group || !['setting', 'style', 'advanced'].includes(group))
162
- return;
163
- const state = get().state;
164
- const item = state[id];
165
- // Ignore section
166
- if (item?.type === 'section')
167
- return;
168
- if (item) {
169
- const itemSetting = {
170
- style: item.styles ?? {},
171
- advanced: item.advanced ?? {},
172
- setting: item.settings ?? {},
173
- };
174
- if (data === undefined) {
175
- console.warn('Data is undefined');
176
- delete itemSetting[group][key];
177
- }
178
- else {
179
- itemSetting[group][key] = data;
180
- }
181
- set({
182
- state: {
183
- ...state,
184
- [id]: {
185
- ...item,
186
- settings: { ...itemSetting.setting },
187
- styles: { ...itemSetting.style },
188
- advanced: { ...itemSetting.advanced },
189
- },
190
- },
191
- });
192
- }
193
- },
194
- getItem: (id) => {
195
- return get().state[id];
196
- },
197
- removeItem: (id) => {
198
- if (id === 'ROOT') {
199
- set({
200
- state: {
201
- ROOT: root,
202
- },
203
- });
204
- }
205
- else {
206
- const state = get().state;
207
- removeByKey(id, state);
208
- // Get parent node by id
209
- const parent = Object.entries(state).find(([, value]) => value.type !== 'section' && value.childrens?.includes(id));
210
- if (parent) {
211
- const dateModified = Date.now();
212
- const [parentId, parentValue] = parent;
213
- if (parentValue.type === 'section')
214
- return;
215
- parentValue.childrens = parentValue.childrens?.filter((child) => child !== id);
216
- parentValue.dateModified = dateModified;
217
- set({
218
- state: {
219
- ...state,
220
- [parentId]: cloneDeep.cloneDeep(parentValue),
221
- },
222
- });
223
- }
224
- }
225
- },
226
- moveItem: (id, toId, position) => {
227
- const state = get().state;
228
- const item = state[id];
229
- const moveTo = state[toId];
230
- // Ignore section
231
- if (!item || !moveTo || moveTo.type === 'section')
232
- return;
233
- if (item.type === 'section') {
234
- // Section only add to ROOT
235
- const ROOT = state.ROOT;
236
- if (!ROOT.childrens)
237
- return;
238
- const currentIndex = ROOT.childrens.findIndex((uid) => uid === id);
239
- moveByIndex(ROOT.childrens, currentIndex, position ?? 0);
240
- set({
241
- state: {
242
- ...state,
243
- ROOT: cloneDeep.cloneDeep(ROOT),
244
- },
245
- });
246
- }
247
- else {
248
- const parent = Object.entries(state).find(([, value]) => value.type !== 'section' && value.childrens?.includes(id));
249
- if (item && parent) {
250
- const dateModified = Date.now();
251
- const [, parentItem] = parent;
252
- // Ignore section
253
- if (parentItem.type === 'section')
254
- return;
255
- parentItem.dateModified = dateModified;
256
- if (toId === parentItem.uid && parentItem.childrens) {
257
- // Move item to the same parent
258
- const currentIndex = parentItem.childrens.findIndex((uid) => uid === id);
259
- if (parentItem.childrens && currentIndex !== position) {
260
- moveByIndex(parentItem.childrens, currentIndex, position ?? 0);
261
- set({
262
- state: {
263
- ...state,
264
- [parentItem.uid]: cloneDeep.cloneDeep(parentItem),
265
- },
266
- });
267
- }
268
- }
269
- else {
270
- // Move item to another parent
271
- // Remove item from parent node
272
- parentItem.childrens = parentItem.childrens?.filter((uid) => uid !== id);
273
- if (moveTo) {
274
- moveTo.dateModified = dateModified;
275
- moveTo.childrens = moveTo.childrens ?? [];
276
- moveTo.childrens.splice(position ?? 0, 0, item.uid);
277
- set({
278
- state: {
279
- ...state,
280
- [moveTo.uid]: cloneDeep.cloneDeep(moveTo),
281
- [parentItem.uid]: cloneDeep.cloneDeep(parentItem),
282
- },
283
- });
284
- }
285
- }
286
- }
287
- }
288
- },
289
- forceChangeState: (data) => {
290
- set({ state: data });
291
- },
292
- initState: (data) => {
293
- if (Array.isArray(data)) {
294
- const childrens = data.map((v) => v.uid);
295
- const newState = data.reduceRight((prev, current) => {
296
- const item = normalizeBuilderData.normalizeBuilderData(current);
297
- return {
298
- ...prev,
299
- ...item,
300
- };
301
- }, {});
302
- set({
303
- state: {
304
- ROOT: {
305
- ...root,
306
- childrens,
307
- },
308
- ...newState,
309
- },
310
- });
311
- }
312
- else {
313
- const newState = normalizeBuilderData.normalizeBuilderData(data);
314
- set({
315
- state: {
316
- ROOT: {
317
- ...root,
318
- childrens: [data.uid],
319
- },
320
- ...newState,
321
- },
322
- });
323
- }
324
- },
325
- addSection: (data, position) => {
326
- const state = get().state;
327
- const ROOT = state.ROOT;
328
- if (!ROOT.childrens)
329
- ROOT.childrens = [];
330
- ROOT.childrens.splice(position ?? 0, 0, data.uid);
331
- set({
332
- state: {
333
- ...state,
334
- ROOT: cloneDeep.cloneDeep(ROOT),
335
- },
336
- });
337
- },
338
- }));
339
- const BuilderPreviewProvider = ({ children, state, lazy, ...passProps }) => {
340
- const Component = lazy ? react.Suspense : react.Fragment;
341
- return (jsxRuntime.jsx(Component, { children: jsxRuntime.jsx(BuilderPreviewContext.Provider, { ...passProps, value: createBuilderPreviewProvider(state), children: children }) }));
342
- };
343
- // export const useBuilderPreviewStore = useStore;
344
- const useBuilderPreviewStore = (selector, equalityFn) => {
345
- const store = react.useContext(BuilderPreviewContext);
346
- if (!store) {
347
- throw new Error('useBuilderPreviewStore must be used within a BuilderPreviewProvider');
348
- }
349
- return zustand.useStore(store, selector, equalityFn);
9
+ function moveByIndex(input, from, to) {
10
+ const elm = input.splice(from, 1)[0];
11
+ if (elm !== undefined) {
12
+ input.splice(to, 0, elm);
13
+ }
14
+ }
15
+ function removeByKey(id, data) {
16
+ const item = data[id];
17
+ if (item) {
18
+ delete data[id];
19
+ if (item.type !== 'section') {
20
+ item.childrens?.map((child)=>removeByKey(child, data));
21
+ }
22
+ }
23
+ }
24
+ const BuilderPreviewContext = /*#__PURE__*/ react.createContext(null);
25
+ const root = {
26
+ uid: 'ROOT',
27
+ tag: 'Root',
28
+ label: 'Root',
29
+ childrens: []
30
+ };
31
+ const createBuilderPreviewProvider = (args)=>zustand.createStore((set, get)=>({
32
+ state: args,
33
+ addItem: (args)=>{
34
+ const { position , data } = args;
35
+ const state = get().state;
36
+ const dateModified = Date.now();
37
+ if (args.type === 'section') {
38
+ if (!Array.isArray(data)) {
39
+ const sectionId = data.uid;
40
+ // Section only add to ROOT
41
+ const ROOT = state.ROOT;
42
+ if (!ROOT.childrens) {
43
+ ROOT.childrens = [
44
+ sectionId
45
+ ];
46
+ } else {
47
+ ROOT.childrens.splice(position ?? 0, 0, sectionId);
48
+ }
49
+ ROOT.dateModified = dateModified;
50
+ set({
51
+ state: {
52
+ ...state,
53
+ [sectionId]: {
54
+ uid: sectionId,
55
+ type: 'section',
56
+ label: data.label
57
+ },
58
+ ROOT: cloneDeep.cloneDeep(ROOT)
59
+ }
60
+ });
61
+ }
62
+ } else {
63
+ const { id , data } = args;
64
+ const parent = id ? state[id] ?? state.ROOT : state.ROOT;
65
+ // Can't add item to section
66
+ if (parent.type === 'section') return;
67
+ if (Array.isArray(data)) {
68
+ const childrens = data.map((v)=>v.uid);
69
+ const newState = data.reduceRight((prev, current)=>{
70
+ const item = normalizeBuilderData.normalizeBuilderData(current);
71
+ return {
72
+ ...prev,
73
+ ...item
74
+ };
75
+ }, {});
76
+ parent.dateModified = dateModified;
77
+ parent.childrens = parent.childrens ?? [];
78
+ parent.childrens.splice(position ?? 0, 0, ...childrens);
79
+ set({
80
+ state: {
81
+ ...state,
82
+ ...newState,
83
+ [parent.uid]: cloneDeep.cloneDeep(parent)
84
+ }
85
+ });
86
+ } else {
87
+ const item = normalizeBuilderData.normalizeBuilderData(data);
88
+ parent.dateModified = dateModified;
89
+ parent.childrens = parent.childrens ?? [];
90
+ parent.childrens.splice(position ?? 0, 0, data.uid);
91
+ set({
92
+ state: {
93
+ ...state,
94
+ ...item,
95
+ [parent.uid]: cloneDeep.cloneDeep(parent)
96
+ }
97
+ });
98
+ }
99
+ }
100
+ },
101
+ changeItemProp: (id, data, group)=>{
102
+ if (!group || ![
103
+ 'setting',
104
+ 'style',
105
+ 'advanced'
106
+ ].includes(group)) return;
107
+ const state = get().state;
108
+ const item = state[id];
109
+ // Ignore section
110
+ if (item?.type === 'section') return;
111
+ if (item) {
112
+ const dateModified = Date.now();
113
+ item.dateModified = dateModified;
114
+ switch(group){
115
+ case 'setting':
116
+ set({
117
+ state: {
118
+ ...state,
119
+ [id]: {
120
+ ...item,
121
+ settings: {
122
+ ...item.settings,
123
+ ...data
124
+ }
125
+ }
126
+ }
127
+ });
128
+ break;
129
+ case 'style':
130
+ set({
131
+ state: {
132
+ ...state,
133
+ [id]: {
134
+ ...item,
135
+ styles: {
136
+ ...item.styles,
137
+ ...data
138
+ }
139
+ }
140
+ }
141
+ });
142
+ break;
143
+ case 'advanced':
144
+ set({
145
+ state: {
146
+ ...state,
147
+ [id]: {
148
+ ...item,
149
+ advanced: {
150
+ ...item.advanced,
151
+ ...data
152
+ }
153
+ }
154
+ }
155
+ });
156
+ break;
157
+ }
158
+ }
159
+ },
160
+ changeItemPropByKey: ({ id , key , data , group })=>{
161
+ if (!group || ![
162
+ 'setting',
163
+ 'style',
164
+ 'advanced'
165
+ ].includes(group)) return;
166
+ const state = get().state;
167
+ const item = state[id];
168
+ // Ignore section
169
+ if (item?.type === 'section') return;
170
+ if (item) {
171
+ const itemSetting = {
172
+ style: item.styles ?? {},
173
+ advanced: item.advanced ?? {},
174
+ setting: item.settings ?? {}
175
+ };
176
+ if (data === undefined) {
177
+ console.warn('Data is undefined');
178
+ delete itemSetting[group][key];
179
+ } else {
180
+ itemSetting[group][key] = data;
181
+ }
182
+ set({
183
+ state: {
184
+ ...state,
185
+ [id]: {
186
+ ...item,
187
+ settings: {
188
+ ...itemSetting.setting
189
+ },
190
+ styles: {
191
+ ...itemSetting.style
192
+ },
193
+ advanced: {
194
+ ...itemSetting.advanced
195
+ }
196
+ }
197
+ }
198
+ });
199
+ }
200
+ },
201
+ getItem: (id)=>{
202
+ return get().state[id];
203
+ },
204
+ removeItem: (id)=>{
205
+ if (id === 'ROOT') {
206
+ set({
207
+ state: {
208
+ ROOT: root
209
+ }
210
+ });
211
+ } else {
212
+ const state = get().state;
213
+ removeByKey(id, state);
214
+ // Get parent node by id
215
+ const parent = Object.entries(state).find(([, value])=>value.type !== 'section' && value.childrens?.includes(id));
216
+ if (parent) {
217
+ const dateModified = Date.now();
218
+ const [parentId, parentValue] = parent;
219
+ if (parentValue.type === 'section') return;
220
+ parentValue.childrens = parentValue.childrens?.filter((child)=>child !== id);
221
+ parentValue.dateModified = dateModified;
222
+ set({
223
+ state: {
224
+ ...state,
225
+ [parentId]: cloneDeep.cloneDeep(parentValue)
226
+ }
227
+ });
228
+ }
229
+ }
230
+ },
231
+ moveItem: (id, toId, position)=>{
232
+ const state = get().state;
233
+ const item = state[id];
234
+ const moveTo = state[toId];
235
+ // Ignore section
236
+ if (!item || !moveTo || moveTo.type === 'section') return;
237
+ if (item.type === 'section') {
238
+ // Section only add to ROOT
239
+ const ROOT = state.ROOT;
240
+ if (!ROOT.childrens) return;
241
+ const currentIndex = ROOT.childrens.findIndex((uid)=>uid === id);
242
+ moveByIndex(ROOT.childrens, currentIndex, position ?? 0);
243
+ set({
244
+ state: {
245
+ ...state,
246
+ ROOT: cloneDeep.cloneDeep(ROOT)
247
+ }
248
+ });
249
+ } else {
250
+ const parent = Object.entries(state).find(([, value])=>value.type !== 'section' && value.childrens?.includes(id));
251
+ if (item && parent) {
252
+ const dateModified = Date.now();
253
+ const [, parentItem] = parent;
254
+ // Ignore section
255
+ if (parentItem.type === 'section') return;
256
+ parentItem.dateModified = dateModified;
257
+ if (toId === parentItem.uid && parentItem.childrens) {
258
+ // Move item to the same parent
259
+ const currentIndex = parentItem.childrens.findIndex((uid)=>uid === id);
260
+ if (parentItem.childrens && currentIndex !== position) {
261
+ moveByIndex(parentItem.childrens, currentIndex, position ?? 0);
262
+ set({
263
+ state: {
264
+ ...state,
265
+ [parentItem.uid]: cloneDeep.cloneDeep(parentItem)
266
+ }
267
+ });
268
+ }
269
+ } else {
270
+ // Move item to another parent
271
+ // Remove item from parent node
272
+ parentItem.childrens = parentItem.childrens?.filter((uid)=>uid !== id);
273
+ if (moveTo) {
274
+ moveTo.dateModified = dateModified;
275
+ moveTo.childrens = moveTo.childrens ?? [];
276
+ moveTo.childrens.splice(position ?? 0, 0, item.uid);
277
+ set({
278
+ state: {
279
+ ...state,
280
+ [moveTo.uid]: cloneDeep.cloneDeep(moveTo),
281
+ [parentItem.uid]: cloneDeep.cloneDeep(parentItem)
282
+ }
283
+ });
284
+ }
285
+ }
286
+ }
287
+ }
288
+ },
289
+ forceChangeState: (data)=>{
290
+ set({
291
+ state: data
292
+ });
293
+ },
294
+ initState: (data)=>{
295
+ if (Array.isArray(data)) {
296
+ const childrens = data.map((v)=>v.uid);
297
+ const newState = data.reduceRight((prev, current)=>{
298
+ const item = normalizeBuilderData.normalizeBuilderData(current);
299
+ return {
300
+ ...prev,
301
+ ...item
302
+ };
303
+ }, {});
304
+ set({
305
+ state: {
306
+ ROOT: {
307
+ ...root,
308
+ childrens
309
+ },
310
+ ...newState
311
+ }
312
+ });
313
+ } else {
314
+ const newState = normalizeBuilderData.normalizeBuilderData(data);
315
+ set({
316
+ state: {
317
+ ROOT: {
318
+ ...root,
319
+ childrens: [
320
+ data.uid
321
+ ]
322
+ },
323
+ ...newState
324
+ }
325
+ });
326
+ }
327
+ },
328
+ addSection: (data, position)=>{
329
+ const state = get().state;
330
+ const ROOT = state.ROOT;
331
+ if (!ROOT.childrens) ROOT.childrens = [];
332
+ ROOT.childrens.splice(position ?? 0, 0, data.uid);
333
+ set({
334
+ state: {
335
+ ...state,
336
+ ROOT: cloneDeep.cloneDeep(ROOT)
337
+ }
338
+ });
339
+ }
340
+ }));
341
+ const BuilderPreviewProvider = ({ children , state , lazy , ...passProps })=>{
342
+ const Component = lazy ? react.Suspense : react.Fragment;
343
+ return /*#__PURE__*/ jsxRuntime.jsx(Component, {
344
+ children: /*#__PURE__*/ jsxRuntime.jsx(BuilderPreviewContext.Provider, {
345
+ ...passProps,
346
+ value: createBuilderPreviewProvider(state),
347
+ children: children
348
+ })
349
+ });
350
+ };
351
+ // export const useBuilderPreviewStore = useStore;
352
+ const useBuilderPreviewStore = (selector, equalityFn)=>{
353
+ const store = react.useContext(BuilderPreviewContext);
354
+ if (!store) {
355
+ throw new Error('useBuilderPreviewStore must be used within a BuilderPreviewProvider');
356
+ }
357
+ return zustand.useStore(store, selector, equalityFn);
350
358
  };
351
359
 
352
360
  exports.BuilderPreviewProvider = BuilderPreviewProvider;