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