@gem-sdk/core 1.0.0

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 (214) hide show
  1. package/dist/cjs/components/AddOn.js +18 -0
  2. package/dist/cjs/components/ComponentWrapper.js +45 -0
  3. package/dist/cjs/components/ComponentWrapperPreview.js +58 -0
  4. package/dist/cjs/components/Empty.js +7 -0
  5. package/dist/cjs/components/Render.js +28 -0
  6. package/dist/cjs/components/RenderBlock.js +21 -0
  7. package/dist/cjs/components/RenderPreview.js +28 -0
  8. package/dist/cjs/components/RenderSection.js +19 -0
  9. package/dist/cjs/contexts/AddonContext.js +25 -0
  10. package/dist/cjs/contexts/BuilderComponent.js +30 -0
  11. package/dist/cjs/contexts/BuilderContext.js +29 -0
  12. package/dist/cjs/contexts/BuilderPreviewContext.js +353 -0
  13. package/dist/cjs/contexts/CartLineContext.js +24 -0
  14. package/dist/cjs/contexts/CollectionContext.js +24 -0
  15. package/dist/cjs/contexts/ProductContext.js +126 -0
  16. package/dist/cjs/contexts/ProductListContext.js +24 -0
  17. package/dist/cjs/contexts/SectionContext.js +49 -0
  18. package/dist/cjs/contexts/ShopContext.js +43 -0
  19. package/dist/cjs/graphql/fragments/analytic.generated.js +11 -0
  20. package/dist/cjs/graphql/fragments/collection-detail.generated.js +13 -0
  21. package/dist/cjs/graphql/fragments/collection-product.generated.js +26 -0
  22. package/dist/cjs/graphql/fragments/data-seo.generated.js +11 -0
  23. package/dist/cjs/graphql/fragments/media.generated.js +14 -0
  24. package/dist/cjs/graphql/fragments/product-little.generated.js +25 -0
  25. package/dist/cjs/graphql/fragments/product-option-value.generated.js +13 -0
  26. package/dist/cjs/graphql/fragments/product-option.generated.js +14 -0
  27. package/dist/cjs/graphql/fragments/product.generated.js +33 -0
  28. package/dist/cjs/graphql/fragments/published-custom-section.generated.js +12 -0
  29. package/dist/cjs/graphql/fragments/published-page-section.generated.js +11 -0
  30. package/dist/cjs/graphql/fragments/published-theme-page.generated.js +27 -0
  31. package/dist/cjs/graphql/fragments/published-theme-style.generated.js +11 -0
  32. package/dist/cjs/graphql/fragments/selected-option.generated.js +11 -0
  33. package/dist/cjs/graphql/fragments/variant.generated.js +35 -0
  34. package/dist/cjs/graphql/queries/collection-detail-filter.generated.js +34 -0
  35. package/dist/cjs/graphql/queries/collection.generated.js +52 -0
  36. package/dist/cjs/graphql/queries/preview-page.generated.js +23 -0
  37. package/dist/cjs/graphql/queries/product-little-detail.generated.js +24 -0
  38. package/dist/cjs/graphql/queries/product-medias.generated.js +29 -0
  39. package/dist/cjs/graphql/queries/product-variants.generated.js +33 -0
  40. package/dist/cjs/graphql/queries/products.generated.js +41 -0
  41. package/dist/cjs/graphql/queries/published-theme-pages.generated.js +23 -0
  42. package/dist/cjs/graphql/queries/storeProperty.generated.js +12 -0
  43. package/dist/cjs/helpers/GlobalEvent.js +17 -0
  44. package/dist/cjs/helpers/background.js +104 -0
  45. package/dist/cjs/helpers/borders.js +138 -0
  46. package/dist/cjs/helpers/clone-deep.js +5 -0
  47. package/dist/cjs/helpers/cls.js +20 -0
  48. package/dist/cjs/helpers/colors.js +157 -0
  49. package/dist/cjs/helpers/compose-advance-style.js +132 -0
  50. package/dist/cjs/helpers/constant.js +17 -0
  51. package/dist/cjs/helpers/css-variable.js +7 -0
  52. package/dist/cjs/helpers/email.js +11 -0
  53. package/dist/cjs/helpers/flatten-connection.js +10 -0
  54. package/dist/cjs/helpers/fpixel.js +29 -0
  55. package/dist/cjs/helpers/get-resonsive-value.js +32 -0
  56. package/dist/cjs/helpers/get-shortname.js +92 -0
  57. package/dist/cjs/helpers/gtag.js +48 -0
  58. package/dist/cjs/helpers/is-browser.js +9 -0
  59. package/dist/cjs/helpers/is-defined.js +7 -0
  60. package/dist/cjs/helpers/is-empty-children.js +12 -0
  61. package/dist/cjs/helpers/layout.js +17 -0
  62. package/dist/cjs/helpers/load-script.js +32 -0
  63. package/dist/cjs/helpers/make-style.js +99 -0
  64. package/dist/cjs/helpers/normalize-builder-data.js +17 -0
  65. package/dist/cjs/helpers/prefetch-queries.js +68 -0
  66. package/dist/cjs/helpers/product.js +35 -0
  67. package/dist/cjs/helpers/queries/get-collection.js +173 -0
  68. package/dist/cjs/helpers/queries/get-product-by-slug.js +99 -0
  69. package/dist/cjs/helpers/queries/get-product.js +113 -0
  70. package/dist/cjs/helpers/queries/get-products.js +135 -0
  71. package/dist/cjs/helpers/radius.js +91 -0
  72. package/dist/cjs/helpers/shadow.js +48 -0
  73. package/dist/cjs/helpers/size.js +20 -0
  74. package/dist/cjs/helpers/spacing.js +45 -0
  75. package/dist/cjs/helpers/tiktokpixel.js +17 -0
  76. package/dist/cjs/helpers/typography.js +7 -0
  77. package/dist/cjs/hooks/cart/use-add-to-cart.js +20 -0
  78. package/dist/cjs/hooks/cart/use-cart-data.js +26 -0
  79. package/dist/cjs/hooks/cart/use-cart-discount-codes-update.js +20 -0
  80. package/dist/cjs/hooks/cart/use-cart-note-update.js +20 -0
  81. package/dist/cjs/hooks/cart/use-create-cart.js +22 -0
  82. package/dist/cjs/hooks/cart/use-remove-cart-item.js +20 -0
  83. package/dist/cjs/hooks/cart/use-update-cart-item.js +20 -0
  84. package/dist/cjs/hooks/shop/use-collection-query.js +16 -0
  85. package/dist/cjs/hooks/shop/use-product-query.js +16 -0
  86. package/dist/cjs/hooks/shop/use-products-query.js +16 -0
  87. package/dist/cjs/hooks/shop.js +80 -0
  88. package/dist/cjs/hooks/use-current-device.js +23 -0
  89. package/dist/cjs/hooks/use-lazy-video.js +15 -0
  90. package/dist/cjs/hooks/useCartId.js +36 -0
  91. package/dist/cjs/hooks/useCartLine.js +11 -0
  92. package/dist/cjs/hooks/useCartUI.js +42 -0
  93. package/dist/cjs/hooks/useCollection.js +9 -0
  94. package/dist/cjs/hooks/useFetchHandle.js +13 -0
  95. package/dist/cjs/hooks/useFormatMoney.js +17 -0
  96. package/dist/cjs/hooks/useIsomorphicLayoutEffect.js +10 -0
  97. package/dist/cjs/hooks/useLoadScript.js +30 -0
  98. package/dist/cjs/hooks/useMoney.js +52 -0
  99. package/dist/cjs/hooks/usePrevious.js +17 -0
  100. package/dist/cjs/hooks/useProduct.js +90 -0
  101. package/dist/cjs/hooks/useProductList.js +21 -0
  102. package/dist/cjs/hooks/useSuspenseFetch.js +24 -0
  103. package/dist/cjs/hooks/useSwatchesOptions.js +39 -0
  104. package/dist/cjs/index.js +229 -0
  105. package/dist/cjs/types/global-style.js +7 -0
  106. package/dist/cjs/types/shop.js +2 -0
  107. package/dist/esm/components/AddOn.js +14 -0
  108. package/dist/esm/components/ComponentWrapper.js +40 -0
  109. package/dist/esm/components/ComponentWrapperPreview.js +54 -0
  110. package/dist/esm/components/Empty.js +3 -0
  111. package/dist/esm/components/Render.js +24 -0
  112. package/dist/esm/components/RenderBlock.js +17 -0
  113. package/dist/esm/components/RenderPreview.js +24 -0
  114. package/dist/esm/components/RenderSection.js +15 -0
  115. package/dist/esm/contexts/AddonContext.js +21 -0
  116. package/dist/esm/contexts/BuilderComponent.js +27 -0
  117. package/dist/esm/contexts/BuilderContext.js +26 -0
  118. package/dist/esm/contexts/BuilderPreviewContext.js +350 -0
  119. package/dist/esm/contexts/CartLineContext.js +21 -0
  120. package/dist/esm/contexts/CollectionContext.js +20 -0
  121. package/dist/esm/contexts/ProductContext.js +123 -0
  122. package/dist/esm/contexts/ProductListContext.js +20 -0
  123. package/dist/esm/contexts/SectionContext.js +45 -0
  124. package/dist/esm/contexts/ShopContext.js +40 -0
  125. package/dist/esm/graphql/fragments/analytic.generated.js +9 -0
  126. package/dist/esm/graphql/fragments/collection-detail.generated.js +11 -0
  127. package/dist/esm/graphql/fragments/collection-product.generated.js +24 -0
  128. package/dist/esm/graphql/fragments/data-seo.generated.js +9 -0
  129. package/dist/esm/graphql/fragments/media.generated.js +12 -0
  130. package/dist/esm/graphql/fragments/product-little.generated.js +23 -0
  131. package/dist/esm/graphql/fragments/product-option-value.generated.js +11 -0
  132. package/dist/esm/graphql/fragments/product-option.generated.js +12 -0
  133. package/dist/esm/graphql/fragments/product.generated.js +31 -0
  134. package/dist/esm/graphql/fragments/published-custom-section.generated.js +10 -0
  135. package/dist/esm/graphql/fragments/published-page-section.generated.js +9 -0
  136. package/dist/esm/graphql/fragments/published-theme-page.generated.js +25 -0
  137. package/dist/esm/graphql/fragments/published-theme-style.generated.js +9 -0
  138. package/dist/esm/graphql/fragments/selected-option.generated.js +9 -0
  139. package/dist/esm/graphql/fragments/variant.generated.js +33 -0
  140. package/dist/esm/graphql/queries/collection-detail-filter.generated.js +32 -0
  141. package/dist/esm/graphql/queries/collection.generated.js +50 -0
  142. package/dist/esm/graphql/queries/preview-page.generated.js +21 -0
  143. package/dist/esm/graphql/queries/product-little-detail.generated.js +22 -0
  144. package/dist/esm/graphql/queries/product-medias.generated.js +27 -0
  145. package/dist/esm/graphql/queries/product-variants.generated.js +31 -0
  146. package/dist/esm/graphql/queries/products.generated.js +38 -0
  147. package/dist/esm/graphql/queries/published-theme-pages.generated.js +21 -0
  148. package/dist/esm/graphql/queries/storeProperty.generated.js +10 -0
  149. package/dist/esm/helpers/GlobalEvent.js +13 -0
  150. package/dist/esm/helpers/background.js +102 -0
  151. package/dist/esm/helpers/borders.js +133 -0
  152. package/dist/esm/helpers/clone-deep.js +3 -0
  153. package/dist/esm/helpers/cls.js +18 -0
  154. package/dist/esm/helpers/colors.js +145 -0
  155. package/dist/esm/helpers/compose-advance-style.js +130 -0
  156. package/dist/esm/helpers/constant.js +13 -0
  157. package/dist/esm/helpers/css-variable.js +5 -0
  158. package/dist/esm/helpers/email.js +6 -0
  159. package/dist/esm/helpers/flatten-connection.js +8 -0
  160. package/dist/esm/helpers/fpixel.js +25 -0
  161. package/dist/esm/helpers/get-resonsive-value.js +28 -0
  162. package/dist/esm/helpers/get-shortname.js +90 -0
  163. package/dist/esm/helpers/gtag.js +45 -0
  164. package/dist/esm/helpers/is-browser.js +5 -0
  165. package/dist/esm/helpers/is-defined.js +5 -0
  166. package/dist/esm/helpers/is-empty-children.js +7 -0
  167. package/dist/esm/helpers/layout.js +15 -0
  168. package/dist/esm/helpers/load-script.js +30 -0
  169. package/dist/esm/helpers/make-style.js +91 -0
  170. package/dist/esm/helpers/normalize-builder-data.js +15 -0
  171. package/dist/esm/helpers/prefetch-queries.js +66 -0
  172. package/dist/esm/helpers/product.js +32 -0
  173. package/dist/esm/helpers/queries/get-collection.js +170 -0
  174. package/dist/esm/helpers/queries/get-product-by-slug.js +97 -0
  175. package/dist/esm/helpers/queries/get-product.js +109 -0
  176. package/dist/esm/helpers/queries/get-products.js +133 -0
  177. package/dist/esm/helpers/radius.js +86 -0
  178. package/dist/esm/helpers/shadow.js +45 -0
  179. package/dist/esm/helpers/size.js +18 -0
  180. package/dist/esm/helpers/spacing.js +42 -0
  181. package/dist/esm/helpers/tiktokpixel.js +15 -0
  182. package/dist/esm/helpers/typography.js +5 -0
  183. package/dist/esm/hooks/cart/use-add-to-cart.js +18 -0
  184. package/dist/esm/hooks/cart/use-cart-data.js +24 -0
  185. package/dist/esm/hooks/cart/use-cart-discount-codes-update.js +18 -0
  186. package/dist/esm/hooks/cart/use-cart-note-update.js +18 -0
  187. package/dist/esm/hooks/cart/use-create-cart.js +20 -0
  188. package/dist/esm/hooks/cart/use-remove-cart-item.js +18 -0
  189. package/dist/esm/hooks/cart/use-update-cart-item.js +18 -0
  190. package/dist/esm/hooks/shop/use-collection-query.js +14 -0
  191. package/dist/esm/hooks/shop/use-product-query.js +14 -0
  192. package/dist/esm/hooks/shop/use-products-query.js +14 -0
  193. package/dist/esm/hooks/shop.js +68 -0
  194. package/dist/esm/hooks/use-current-device.js +21 -0
  195. package/dist/esm/hooks/use-lazy-video.js +13 -0
  196. package/dist/esm/hooks/useCartId.js +32 -0
  197. package/dist/esm/hooks/useCartLine.js +7 -0
  198. package/dist/esm/hooks/useCartUI.js +38 -0
  199. package/dist/esm/hooks/useCollection.js +7 -0
  200. package/dist/esm/hooks/useFetchHandle.js +11 -0
  201. package/dist/esm/hooks/useFormatMoney.js +13 -0
  202. package/dist/esm/hooks/useIsomorphicLayoutEffect.js +6 -0
  203. package/dist/esm/hooks/useLoadScript.js +26 -0
  204. package/dist/esm/hooks/useMoney.js +48 -0
  205. package/dist/esm/hooks/usePrevious.js +15 -0
  206. package/dist/esm/hooks/useProduct.js +78 -0
  207. package/dist/esm/hooks/useProductList.js +16 -0
  208. package/dist/esm/hooks/useSuspenseFetch.js +20 -0
  209. package/dist/esm/hooks/useSwatchesOptions.js +35 -0
  210. package/dist/esm/index.js +82 -0
  211. package/dist/esm/types/global-style.js +4 -0
  212. package/dist/esm/types/shop.js +1 -0
  213. package/dist/types/index.d.ts +7393 -0
  214. package/package.json +50 -0
@@ -0,0 +1,27 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useStore, createStore } from 'zustand';
3
+ import { createContext, useContext } from 'react';
4
+ import Empty from '../components/Empty.js';
5
+
6
+ const BuilderComponentContext = createContext(null);
7
+ const createBuilderComponentStore = (components) => createStore((_, get) => ({
8
+ components,
9
+ getItem: (id) => {
10
+ return get().components[id];
11
+ },
12
+ }));
13
+ const BuilderComponentProvider = ({ children, components, ...passProps }) => {
14
+ return (jsx(BuilderComponentContext.Provider, { ...passProps, value: createBuilderComponentStore(components), children: children }));
15
+ };
16
+ // export const useBuilderComponent = (id?: string) => {
17
+ // return useStore((s) => (id ? s.getItem(id) ?? Empty : Empty));
18
+ // };
19
+ const useBuilderComponent = (id) => {
20
+ const store = useContext(BuilderComponentContext);
21
+ if (!store) {
22
+ throw new Error('useBuilderComponent must be used within a BuilderComponentProvider');
23
+ }
24
+ return useStore(store, (s) => (id ? s.getItem(id) ?? Empty : Empty));
25
+ };
26
+
27
+ export { BuilderComponentProvider, useBuilderComponent };
@@ -0,0 +1,26 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext, Suspense, Fragment } from 'react';
3
+ import { useStore, createStore } from 'zustand';
4
+
5
+ const BuilderContext = createContext(null);
6
+ const createBuilderProvider = (data) => createStore((_, get) => ({
7
+ state: data,
8
+ getItem: (id) => {
9
+ return get().state[id];
10
+ },
11
+ }));
12
+ const BuilderProvider = ({ children, state, lazy, priority, ...passProps }) => {
13
+ const Component = lazy ? Suspense : Fragment;
14
+ const store = createBuilderProvider(state);
15
+ return (jsx(Component, { children: jsx(BuilderContext.Provider, { ...passProps, value: store, children: children }) }));
16
+ };
17
+ // export const useBuilderStore = useStore;
18
+ const useBuilderStore = (selector, equalityFn) => {
19
+ const store = useContext(BuilderContext);
20
+ if (!store) {
21
+ throw new Error('useBuilderStore must be used within a BuilderProvider');
22
+ }
23
+ return useStore(store, selector, equalityFn);
24
+ };
25
+
26
+ export { BuilderProvider, useBuilderStore };
@@ -0,0 +1,350 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext, Suspense, Fragment } from 'react';
3
+ import { useStore, createStore } from 'zustand';
4
+ import { cloneDeep } from '../helpers/clone-deep.js';
5
+ import { normalizeBuilderData } from '../helpers/normalize-builder-data.js';
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);
348
+ };
349
+
350
+ export { BuilderPreviewProvider, useBuilderPreviewStore };
@@ -0,0 +1,21 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useStore, createStore } from 'zustand';
3
+ import { createContext, useContext } from 'react';
4
+
5
+ const CartLineContext = createContext(null);
6
+ const createCartLineStore = (data) => createStore(() => ({
7
+ ...data,
8
+ }));
9
+ const CartLineProvider = ({ children, line }) => {
10
+ return (jsx(CartLineContext.Provider, { value: createCartLineStore({ line }), children: children }, `${line.id}-${line.quantity}`));
11
+ };
12
+ // export const useCartLineStore = useStore;
13
+ const useCartLineStore = (selector, equalityFn) => {
14
+ const store = useContext(CartLineContext);
15
+ if (!store) {
16
+ throw new Error('useCartLineStore must be used within a CartLineProvider');
17
+ }
18
+ return useStore(store, selector, equalityFn);
19
+ };
20
+
21
+ export { CartLineProvider, useCartLineStore };
@@ -0,0 +1,20 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext } from 'react';
3
+ import { useStore, createStore } from 'zustand';
4
+
5
+ const CollectionListContext = createContext(null);
6
+ const createCollectionProvider = (data) => createStore(() => ({
7
+ ...data,
8
+ }));
9
+ const CollectionProvider = ({ children, collection, products, settings, styles, }) => {
10
+ return (jsx(CollectionListContext.Provider, { value: createCollectionProvider({ products, collection, settings, styles }), children: children }, collection?.id));
11
+ };
12
+ const useCollectionStore = (selector, equalityFn) => {
13
+ const store = useContext(CollectionListContext);
14
+ if (!store) {
15
+ throw new Error('useCollectionStore must be used within a useCollectionStore');
16
+ }
17
+ return useStore(store, selector, equalityFn);
18
+ };
19
+
20
+ export { CollectionListContext, CollectionProvider, useCollectionStore };
@@ -0,0 +1,123 @@
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useStore, createStore } from 'zustand';
3
+ import { createContext, useId, useMemo, useContext } from 'react';
4
+ import { flattenConnection } from '../helpers/flatten-connection.js';
5
+
6
+ // const { Provider, useStore } = createContext<StoreApi<ProductContextProps>>();
7
+ const ProductContext = createContext(null);
8
+ const createProductStoreProvider = (data) => createStore((set, get) => ({
9
+ ...data,
10
+ updateProperty: (name, data) => {
11
+ set((state) => {
12
+ return {
13
+ properties: state.properties?.map((v) => {
14
+ if (v.key === name) {
15
+ return { ...v, ...data };
16
+ }
17
+ return v;
18
+ }),
19
+ };
20
+ });
21
+ },
22
+ addProperty: (data) => {
23
+ const properties = get().properties;
24
+ if (!properties?.some((v) => v.key === data.key)) {
25
+ set((state) => ({ properties: [...(state.properties ?? []), data] }));
26
+ }
27
+ },
28
+ removeProperty: (name) => {
29
+ set((state) => ({ properties: state.properties?.filter((v) => v.key !== name) }));
30
+ },
31
+ setQuantity: (num) => {
32
+ set({
33
+ quantity: num > 0 ? num : 1,
34
+ });
35
+ },
36
+ setProductFeaturedImage: (image) => {
37
+ set({
38
+ featuredImageGlobal: image,
39
+ });
40
+ },
41
+ incrementQuantity: () => {
42
+ set((state) => {
43
+ const quantity = state.quantity ?? 1;
44
+ return {
45
+ quantity: quantity + 1,
46
+ };
47
+ });
48
+ },
49
+ decrementQuantity: () => {
50
+ set((state) => {
51
+ const quantity = state.quantity ?? 1;
52
+ return {
53
+ quantity: quantity > 2 ? quantity - 1 : 1,
54
+ };
55
+ });
56
+ },
57
+ setSelectedOption: (optionId, optionValue) => {
58
+ set((state) => {
59
+ if (optionId && optionValue) {
60
+ return {
61
+ selectedOptions: {
62
+ ...state?.selectedOptions,
63
+ [optionId]: optionValue,
64
+ },
65
+ };
66
+ }
67
+ return state;
68
+ });
69
+ },
70
+ forceSelectedOption: (value) => {
71
+ set((state) => {
72
+ return {
73
+ selectedOptions: {
74
+ ...state?.selectedOptions,
75
+ ...value,
76
+ },
77
+ };
78
+ });
79
+ },
80
+ updateIsSubmit: (value) => {
81
+ set({
82
+ isSubmit: value,
83
+ });
84
+ },
85
+ }));
86
+ const ProductProvider = ({ children, product, initialVariantId, quantity = 1, }) => {
87
+ const uiqueId = useId();
88
+ const store = useMemo(() => {
89
+ let selectedOptions = {};
90
+ let featuredImageGlobal = undefined;
91
+ if (product) {
92
+ const variants = flattenConnection(product.variants);
93
+ const firstVariant = flattenConnection(product.variants)[0];
94
+ const initialVariant = variants.find((v) => v?.id === initialVariantId) ?? firstVariant;
95
+ selectedOptions = initialVariant?.selectedOptions.reduce((acc, option) => {
96
+ if (option.name) {
97
+ return { ...acc, [option.name]: option.value };
98
+ }
99
+ return acc;
100
+ }, {});
101
+ featuredImageGlobal =
102
+ product.medias?.edges.find((v) => v.node?.id === initialVariant?.mediaId)?.node ??
103
+ product.featuredImage;
104
+ }
105
+ return createProductStoreProvider({
106
+ product,
107
+ quantity,
108
+ selectedOptions,
109
+ uiqueId,
110
+ featuredImageGlobal,
111
+ });
112
+ }, [initialVariantId, product, quantity, uiqueId]);
113
+ return (jsx(ProductContext.Provider, { value: store, children: jsx(Fragment, { children: children }) }));
114
+ };
115
+ const useProductStore = (selector, equalityFn) => {
116
+ const store = useContext(ProductContext);
117
+ if (!store) {
118
+ throw new Error('Element of product must be used inside a Product');
119
+ }
120
+ return useStore(store, selector, equalityFn);
121
+ };
122
+
123
+ export { ProductProvider, useProductStore };
@@ -0,0 +1,20 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext } from 'react';
3
+ import { useStore, createStore } from 'zustand';
4
+
5
+ const ProductListContext = createContext(null);
6
+ const createProductListProvider = (data) => createStore(() => ({
7
+ ...data,
8
+ }));
9
+ const ProductListProvider = ({ children, collection, products, settings, styles, }) => {
10
+ return (jsx(ProductListContext.Provider, { value: createProductListProvider({ products, collection, settings, styles }), children: children }));
11
+ };
12
+ const useProductListStore = (selector, equalityFn) => {
13
+ const store = useContext(ProductListContext);
14
+ if (!store) {
15
+ throw new Error('useProductListStore must be used within a useProductListStore');
16
+ }
17
+ return useStore(store, selector, equalityFn);
18
+ };
19
+
20
+ export { ProductListContext, ProductListProvider, useProductListStore };
@@ -0,0 +1,45 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useStore, createStore } from 'zustand';
3
+ import { createContext, useContext } from 'react';
4
+ import { cloneDeep } from '../helpers/clone-deep.js';
5
+ import { normalizeBuilderData } from '../helpers/normalize-builder-data.js';
6
+
7
+ const SectionContext = createContext(null);
8
+ const createSectionProvider = (data) => createStore((set, get) => ({
9
+ data: data ?? {},
10
+ getSection: (id) => {
11
+ const section = get().data[id];
12
+ return section ?? undefined;
13
+ },
14
+ addSection: (id, data) => {
15
+ const item = normalizeBuilderData(data);
16
+ set((prev) => ({
17
+ data: {
18
+ ...prev.data,
19
+ [id]: cloneDeep(item),
20
+ },
21
+ }));
22
+ },
23
+ removeSection: (id) => {
24
+ set((prev) => {
25
+ const { [id]: _, ...rest } = prev.data;
26
+ return {
27
+ data: rest,
28
+ };
29
+ });
30
+ },
31
+ }));
32
+ const SectionProvider = ({ children, data, ...passProps }) => {
33
+ return (jsx(SectionContext.Provider, { ...passProps, value: createSectionProvider(data), children: children }));
34
+ };
35
+ // export const useSectionStore = useStore;
36
+ const useSectionStore = (selector, equalityFn) => {
37
+ const store = useContext(SectionContext);
38
+ if (!store) {
39
+ throw new Error('useSectionStore must be used within a SectionProvider');
40
+ }
41
+ return useStore(store, selector, equalityFn);
42
+ };
43
+ const useSection = (id) => useSectionStore((s) => s.getSection(id));
44
+
45
+ export { SectionProvider, useSection, useSectionStore };
@@ -0,0 +1,40 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { SWRConfig } from 'swr';
3
+ import { useStore, createStore } from 'zustand';
4
+ import { createContext, useMemo, useContext } from 'react';
5
+ import { AddonProvider } from './AddonContext.js';
6
+
7
+ const ShopContext = createContext(null);
8
+ const createShopStoreProvider = (data) => createStore((set) => ({
9
+ mobileOnly: false,
10
+ ...data,
11
+ changeLocale: (locale) => {
12
+ set({ locale });
13
+ },
14
+ changeCurrency: (currency) => {
15
+ set({ currency });
16
+ },
17
+ changeSwatches: (swatches) => {
18
+ set({ swatches });
19
+ },
20
+ changeStorefrontInfo: ({ url, token }) => {
21
+ set((prev) => ({
22
+ storefrontUrl: url ?? prev.storefrontUrl,
23
+ storefrontToken: token ?? prev.storefrontToken,
24
+ }));
25
+ },
26
+ }));
27
+ const ShopProvider = ({ children, addons, storeOption, queryOption, ...passProps }) => {
28
+ const store = useMemo(() => createShopStoreProvider(storeOption), [storeOption]);
29
+ return (jsx(AddonProvider, { components: addons, children: jsx(SWRConfig, { value: queryOption, children: jsx(ShopContext.Provider, { ...passProps, value: store, children: children }, JSON.stringify(storeOption)) }) }));
30
+ };
31
+ // export const useShopStore = useStore;
32
+ const useShopStore = (selector, equalityFn) => {
33
+ const store = useContext(ShopContext);
34
+ if (!store) {
35
+ throw new Error('useShopStore must be used within a ShopProvider');
36
+ }
37
+ return useStore(store, selector, equalityFn);
38
+ };
39
+
40
+ export { ShopProvider, useShopStore };
@@ -0,0 +1,9 @@
1
+ const AnalyticSelect = `
2
+ fragment AnalyticSelect on Analytic {
3
+ fbPixelID
4
+ gaTrackingID
5
+ tiktokPixelID
6
+ }
7
+ `;
8
+
9
+ export { AnalyticSelect };