@duongthiu/onex-core 0.1.0 → 0.1.1

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 (190) hide show
  1. package/README.md +44 -65
  2. package/THEME_API.md +36 -33
  3. package/dist/api.js +14 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/api.mjs +5 -0
  6. package/dist/api.mjs.map +1 -0
  7. package/dist/auth.js +23 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/auth.mjs +6 -0
  10. package/dist/auth.mjs.map +1 -0
  11. package/dist/blog.js +22 -0
  12. package/dist/blog.js.map +1 -0
  13. package/dist/blog.mjs +5 -0
  14. package/dist/blog.mjs.map +1 -0
  15. package/dist/cart.js +27 -0
  16. package/dist/cart.js.map +1 -0
  17. package/dist/cart.mjs +6 -0
  18. package/dist/cart.mjs.map +1 -0
  19. package/dist/chunk-2CSWHI3L.js +210 -0
  20. package/dist/chunk-2CSWHI3L.js.map +1 -0
  21. package/dist/chunk-2FGHIDUV.js +99 -0
  22. package/dist/chunk-2FGHIDUV.js.map +1 -0
  23. package/dist/chunk-2NMEKWO5.js +40 -0
  24. package/dist/chunk-2NMEKWO5.js.map +1 -0
  25. package/dist/chunk-43BVHGDT.mjs +131 -0
  26. package/dist/chunk-43BVHGDT.mjs.map +1 -0
  27. package/dist/chunk-4JVQJI3I.mjs +290 -0
  28. package/dist/chunk-4JVQJI3I.mjs.map +1 -0
  29. package/dist/chunk-5N2EKK5O.js +9550 -0
  30. package/dist/chunk-5N2EKK5O.js.map +1 -0
  31. package/dist/chunk-5T6NDVSN.js +76 -0
  32. package/dist/chunk-5T6NDVSN.js.map +1 -0
  33. package/dist/chunk-73AINNCI.mjs +201 -0
  34. package/dist/chunk-73AINNCI.mjs.map +1 -0
  35. package/dist/chunk-AIXBDAVP.mjs +61 -0
  36. package/dist/chunk-AIXBDAVP.mjs.map +1 -0
  37. package/dist/chunk-ALYN5HAC.js +210 -0
  38. package/dist/chunk-ALYN5HAC.js.map +1 -0
  39. package/dist/chunk-AREMJR3Q.js +36 -0
  40. package/dist/chunk-AREMJR3Q.js.map +1 -0
  41. package/dist/chunk-DXAI6XOI.mjs +33 -0
  42. package/dist/chunk-DXAI6XOI.mjs.map +1 -0
  43. package/dist/chunk-F5TFNWFJ.mjs +257 -0
  44. package/dist/chunk-F5TFNWFJ.mjs.map +1 -0
  45. package/dist/chunk-FQ7FWUZN.js +265 -0
  46. package/dist/chunk-FQ7FWUZN.js.map +1 -0
  47. package/dist/{chunk-3SZX6LHT.js → chunk-J27VGXJH.js} +2 -24
  48. package/dist/chunk-J27VGXJH.js.map +1 -0
  49. package/dist/chunk-JZ46LLTZ.js +121 -0
  50. package/dist/chunk-JZ46LLTZ.js.map +1 -0
  51. package/dist/chunk-K24UHN6G.mjs +76 -0
  52. package/dist/chunk-K24UHN6G.mjs.map +1 -0
  53. package/dist/chunk-KCQGGU5R.mjs +344 -0
  54. package/dist/chunk-KCQGGU5R.mjs.map +1 -0
  55. package/dist/chunk-MT22NYKT.mjs +117 -0
  56. package/dist/chunk-MT22NYKT.mjs.map +1 -0
  57. package/dist/chunk-NDD472IZ.js +85 -0
  58. package/dist/chunk-NDD472IZ.js.map +1 -0
  59. package/dist/chunk-NHOIGGYU.mjs +833 -0
  60. package/dist/chunk-NHOIGGYU.mjs.map +1 -0
  61. package/dist/chunk-O3XR7TW3.mjs +12 -0
  62. package/dist/chunk-O3XR7TW3.mjs.map +1 -0
  63. package/dist/chunk-OAPYSC2X.mjs +206 -0
  64. package/dist/chunk-OAPYSC2X.mjs.map +1 -0
  65. package/dist/{chunk-XE4EOKS4.mjs → chunk-ONJREDYY.mjs} +3 -23
  66. package/dist/chunk-ONJREDYY.mjs.map +1 -0
  67. package/dist/chunk-OVT2LUAM.js +197 -0
  68. package/dist/chunk-OVT2LUAM.js.map +1 -0
  69. package/dist/chunk-OWNGNGKL.js +331 -0
  70. package/dist/chunk-OWNGNGKL.js.map +1 -0
  71. package/dist/chunk-P7SXNZSV.js +298 -0
  72. package/dist/chunk-P7SXNZSV.js.map +1 -0
  73. package/dist/chunk-PFJOL3HI.mjs +71 -0
  74. package/dist/chunk-PFJOL3HI.mjs.map +1 -0
  75. package/dist/chunk-PPULMWJ6.js +295 -0
  76. package/dist/chunk-PPULMWJ6.js.map +1 -0
  77. package/dist/chunk-RGIVKACG.js +359 -0
  78. package/dist/chunk-RGIVKACG.js.map +1 -0
  79. package/dist/chunk-RPP5K2LP.js +870 -0
  80. package/dist/chunk-RPP5K2LP.js.map +1 -0
  81. package/dist/{chunk-7EON6Q4L.mjs → chunk-RUCHWUD7.mjs} +7651 -6370
  82. package/dist/chunk-RUCHWUD7.mjs.map +1 -0
  83. package/dist/chunk-SEVUIX4H.js +137 -0
  84. package/dist/chunk-SEVUIX4H.js.map +1 -0
  85. package/dist/chunk-SK2FSHFM.mjs +208 -0
  86. package/dist/chunk-SK2FSHFM.mjs.map +1 -0
  87. package/dist/chunk-T6EJ2GAV.mjs +294 -0
  88. package/dist/chunk-T6EJ2GAV.mjs.map +1 -0
  89. package/dist/chunk-ULBDOFZI.mjs +302 -0
  90. package/dist/chunk-ULBDOFZI.mjs.map +1 -0
  91. package/dist/chunk-V3JIELNV.js +241 -0
  92. package/dist/chunk-V3JIELNV.js.map +1 -0
  93. package/dist/chunk-V5E2KWMA.mjs +238 -0
  94. package/dist/chunk-V5E2KWMA.mjs.map +1 -0
  95. package/dist/chunk-VJA3ER6A.js +14 -0
  96. package/dist/chunk-VJA3ER6A.js.map +1 -0
  97. package/dist/chunk-VLI7ULX5.js +66 -0
  98. package/dist/chunk-VLI7ULX5.js.map +1 -0
  99. package/dist/chunk-WFGS5OFH.mjs +189 -0
  100. package/dist/chunk-WFGS5OFH.mjs.map +1 -0
  101. package/dist/chunk-WVC5GP24.mjs +96 -0
  102. package/dist/chunk-WVC5GP24.mjs.map +1 -0
  103. package/dist/chunk-YOSPWY5K.mjs +36 -0
  104. package/dist/chunk-YOSPWY5K.mjs.map +1 -0
  105. package/dist/chunk-ZFFXXLX7.js +205 -0
  106. package/dist/chunk-ZFFXXLX7.js.map +1 -0
  107. package/dist/client.js +512 -249
  108. package/dist/client.mjs +21 -2
  109. package/dist/components.js +393 -0
  110. package/dist/components.js.map +1 -0
  111. package/dist/components.mjs +8 -0
  112. package/dist/components.mjs.map +1 -0
  113. package/dist/config.js +17 -0
  114. package/dist/config.js.map +1 -0
  115. package/dist/config.mjs +4 -0
  116. package/dist/config.mjs.map +1 -0
  117. package/dist/contact.js +22 -0
  118. package/dist/contact.js.map +1 -0
  119. package/dist/contact.mjs +5 -0
  120. package/dist/contact.mjs.map +1 -0
  121. package/dist/contexts.js +51 -0
  122. package/dist/contexts.js.map +1 -0
  123. package/dist/contexts.mjs +6 -0
  124. package/dist/contexts.mjs.map +1 -0
  125. package/dist/finance.js +26 -0
  126. package/dist/finance.js.map +1 -0
  127. package/dist/finance.mjs +5 -0
  128. package/dist/finance.mjs.map +1 -0
  129. package/dist/icons.js +15 -0
  130. package/dist/icons.js.map +1 -0
  131. package/dist/icons.mjs +4 -0
  132. package/dist/icons.mjs.map +1 -0
  133. package/dist/index.js +512 -249
  134. package/dist/index.js.map +1 -1
  135. package/dist/index.mjs +21 -2
  136. package/dist/index.mjs.map +1 -1
  137. package/dist/internal.js +1437 -0
  138. package/dist/internal.js.map +1 -0
  139. package/dist/internal.mjs +1404 -0
  140. package/dist/internal.mjs.map +1 -0
  141. package/dist/motion.js +51 -0
  142. package/dist/motion.js.map +1 -0
  143. package/dist/motion.mjs +38 -0
  144. package/dist/motion.mjs.map +1 -0
  145. package/dist/orders.js +22 -0
  146. package/dist/orders.js.map +1 -0
  147. package/dist/orders.mjs +5 -0
  148. package/dist/orders.mjs.map +1 -0
  149. package/dist/products.js +27 -0
  150. package/dist/products.js.map +1 -0
  151. package/dist/products.mjs +6 -0
  152. package/dist/products.mjs.map +1 -0
  153. package/dist/registry.js +44 -0
  154. package/dist/registry.js.map +1 -0
  155. package/dist/registry.mjs +7 -0
  156. package/dist/registry.mjs.map +1 -0
  157. package/dist/renderers.js +51 -0
  158. package/dist/renderers.js.map +1 -0
  159. package/dist/renderers.mjs +6 -0
  160. package/dist/renderers.mjs.map +1 -0
  161. package/dist/server.js +11 -189
  162. package/dist/server.js.map +1 -1
  163. package/dist/server.mjs +3 -186
  164. package/dist/server.mjs.map +1 -1
  165. package/dist/types.js +37 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/types.mjs +4 -0
  168. package/dist/types.mjs.map +1 -0
  169. package/dist/utils.js +160 -0
  170. package/dist/utils.js.map +1 -0
  171. package/dist/utils.mjs +7 -0
  172. package/dist/utils.mjs.map +1 -0
  173. package/dist/wrappers.js +104 -0
  174. package/dist/wrappers.js.map +1 -0
  175. package/dist/wrappers.mjs +96 -0
  176. package/dist/wrappers.mjs.map +1 -0
  177. package/package.json +112 -9
  178. package/dist/api-vuL1Eg5L.d.mts +0 -2961
  179. package/dist/api-vuL1Eg5L.d.ts +0 -2961
  180. package/dist/chunk-3SZX6LHT.js.map +0 -1
  181. package/dist/chunk-7EON6Q4L.mjs.map +0 -1
  182. package/dist/chunk-WDY773GJ.js +0 -8308
  183. package/dist/chunk-WDY773GJ.js.map +0 -1
  184. package/dist/chunk-XE4EOKS4.mjs.map +0 -1
  185. package/dist/client.d.mts +0 -1461
  186. package/dist/client.d.ts +0 -1461
  187. package/dist/index.d.mts +0 -125
  188. package/dist/index.d.ts +0 -125
  189. package/dist/server.d.mts +0 -70
  190. package/dist/server.d.ts +0 -70
@@ -0,0 +1,96 @@
1
+ "use client";
2
+ import { __spreadProps, __spreadValues } from './chunk-YOSPWY5K.mjs';
3
+ import { createContext, useState, useEffect, useContext } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var CartContext = createContext(void 0);
7
+ var CART_STORAGE_KEY = "onex-cart";
8
+ function getInitialCart() {
9
+ if (typeof window === "undefined") return [];
10
+ try {
11
+ const savedCart = localStorage.getItem(CART_STORAGE_KEY);
12
+ if (savedCart) {
13
+ return JSON.parse(savedCart);
14
+ }
15
+ } catch (error) {
16
+ console.error(
17
+ "[CartContext] Failed to load cart from localStorage:",
18
+ error
19
+ );
20
+ }
21
+ return [];
22
+ }
23
+ function CartProvider({ children }) {
24
+ const [items, setItems] = useState(() => getInitialCart());
25
+ useEffect(() => {
26
+ localStorage.setItem(CART_STORAGE_KEY, JSON.stringify(items));
27
+ }, [items]);
28
+ const addItem = (newItem) => {
29
+ setItems((currentItems) => {
30
+ const existingItem = currentItems.find(
31
+ (item) => item.productId === newItem.productId && (item.size || "") === (newItem.size || "") && (item.color || "") === (newItem.color || "") && (item.locationId || "") === (newItem.locationId || "")
32
+ );
33
+ if (existingItem) {
34
+ return currentItems.map(
35
+ (item) => item.id === existingItem.id ? __spreadProps(__spreadValues({}, item), { quantity: item.quantity + 1 }) : item
36
+ );
37
+ } else {
38
+ return [
39
+ ...currentItems,
40
+ __spreadProps(__spreadValues({}, newItem), {
41
+ id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
42
+ quantity: 1
43
+ })
44
+ ];
45
+ }
46
+ });
47
+ };
48
+ const removeItem = (id) => {
49
+ setItems((currentItems) => currentItems.filter((item) => item.id !== id));
50
+ };
51
+ const updateQuantity = (id, quantity) => {
52
+ if (quantity < 1) {
53
+ removeItem(id);
54
+ return;
55
+ }
56
+ setItems(
57
+ (currentItems) => currentItems.map(
58
+ (item) => item.id === id ? __spreadProps(__spreadValues({}, item), { quantity }) : item
59
+ )
60
+ );
61
+ };
62
+ const clearCart = () => {
63
+ setItems([]);
64
+ };
65
+ const itemCount = items.reduce((sum, item) => sum + item.quantity, 0);
66
+ const subtotal = items.reduce(
67
+ (sum, item) => sum + item.price * item.quantity,
68
+ 0
69
+ );
70
+ return /* @__PURE__ */ jsx(
71
+ CartContext.Provider,
72
+ {
73
+ value: {
74
+ items,
75
+ addItem,
76
+ removeItem,
77
+ updateQuantity,
78
+ clearCart,
79
+ itemCount,
80
+ subtotal
81
+ },
82
+ children
83
+ }
84
+ );
85
+ }
86
+ function useCart() {
87
+ const context = useContext(CartContext);
88
+ if (context === void 0) {
89
+ throw new Error("useCart must be used within a CartProvider");
90
+ }
91
+ return context;
92
+ }
93
+
94
+ export { CartProvider, useCart };
95
+ //# sourceMappingURL=chunk-WVC5GP24.mjs.map
96
+ //# sourceMappingURL=chunk-WVC5GP24.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contexts/cart-context.tsx"],"names":[],"mappings":"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","file":"chunk-WVC5GP24.mjs","sourcesContent":["\"use client\";\n\n/**\n * Cart Context\n * Full shopping cart functionality with localStorage persistence\n * Supports product variants (size, color, SKU, location)\n */\n\nimport React, { createContext, useContext, useState, useEffect } from \"react\";\nimport type { CartItem, CartContextType } from \"../types\";\n\nconst CartContext = createContext<CartContextType | undefined>(undefined);\n\nconst CART_STORAGE_KEY = \"onex-cart\";\n\n/**\n * Load cart from localStorage (client-side only)\n */\nfunction getInitialCart(): CartItem[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const savedCart = localStorage.getItem(CART_STORAGE_KEY);\n if (savedCart) {\n return JSON.parse(savedCart);\n }\n } catch (error) {\n console.error(\n \"[CartContext] Failed to load cart from localStorage:\",\n error\n );\n }\n return [];\n}\n\nexport function CartProvider({ children }: { children: React.ReactNode }) {\n // Use lazy initialization to load from localStorage\n const [items, setItems] = useState<CartItem[]>(() => getInitialCart());\n\n // Save cart to localStorage whenever it changes\n useEffect(() => {\n localStorage.setItem(CART_STORAGE_KEY, JSON.stringify(items));\n }, [items]);\n\n /**\n * Add item to cart\n * Checks for duplicates based on productId, size, color, and locationId\n */\n const addItem = (newItem: Omit<CartItem, \"id\" | \"quantity\">) => {\n setItems((currentItems) => {\n // Check if item already exists (same product, size, color, and location)\n const existingItem = currentItems.find(\n (item) =>\n item.productId === newItem.productId &&\n (item.size || \"\") === (newItem.size || \"\") &&\n (item.color || \"\") === (newItem.color || \"\") &&\n (item.locationId || \"\") === (newItem.locationId || \"\")\n );\n\n if (existingItem) {\n // Increase quantity\n return currentItems.map((item) =>\n item.id === existingItem.id\n ? { ...item, quantity: item.quantity + 1 }\n : item\n );\n } else {\n // Add new item\n return [\n ...currentItems,\n {\n ...newItem,\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n quantity: 1,\n },\n ];\n }\n });\n };\n\n /**\n * Remove item from cart by ID\n */\n const removeItem = (id: string) => {\n setItems((currentItems) => currentItems.filter((item) => item.id !== id));\n };\n\n /**\n * Update item quantity\n * Removes item if quantity < 1\n */\n const updateQuantity = (id: string, quantity: number) => {\n if (quantity < 1) {\n removeItem(id);\n return;\n }\n\n setItems((currentItems) =>\n currentItems.map((item) =>\n item.id === id ? { ...item, quantity } : item\n )\n );\n };\n\n /**\n * Clear all items from cart\n */\n const clearCart = () => {\n setItems([]);\n };\n\n // Calculate totals\n const itemCount = items.reduce((sum, item) => sum + item.quantity, 0);\n const subtotal = items.reduce(\n (sum, item) => sum + item.price * item.quantity,\n 0\n );\n\n return (\n <CartContext.Provider\n value={{\n items,\n addItem,\n removeItem,\n updateQuantity,\n clearCart,\n itemCount,\n subtotal,\n }}\n >\n {children}\n </CartContext.Provider>\n );\n}\n\n/**\n * Hook to access cart context\n */\nexport function useCart() {\n const context = useContext(CartContext);\n if (context === undefined) {\n throw new Error(\"useCart must be used within a CartProvider\");\n }\n return context;\n}\n\n// Re-export types for convenience\nexport type { CartItem, CartContextType };\n"]}
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __spreadValues = (a, b) => {
10
+ for (var prop in b || (b = {}))
11
+ if (__hasOwnProp.call(b, prop))
12
+ __defNormalProp(a, prop, b[prop]);
13
+ if (__getOwnPropSymbols)
14
+ for (var prop of __getOwnPropSymbols(b)) {
15
+ if (__propIsEnum.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ }
18
+ return a;
19
+ };
20
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ var __objRest = (source, exclude) => {
22
+ var target = {};
23
+ for (var prop in source)
24
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
25
+ target[prop] = source[prop];
26
+ if (source != null && __getOwnPropSymbols)
27
+ for (var prop of __getOwnPropSymbols(source)) {
28
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
29
+ target[prop] = source[prop];
30
+ }
31
+ return target;
32
+ };
33
+
34
+ export { __objRest, __spreadProps, __spreadValues };
35
+ //# sourceMappingURL=chunk-YOSPWY5K.mjs.map
36
+ //# sourceMappingURL=chunk-YOSPWY5K.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-YOSPWY5K.mjs"}
@@ -0,0 +1,205 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var zustand = require('zustand');
5
+ var middleware = require('zustand/middleware');
6
+
7
+ // src/features/cart/cart-service.ts
8
+ var CartService = class {
9
+ constructor(api) {
10
+ this.api = api;
11
+ }
12
+ /**
13
+ * Get current cart
14
+ */
15
+ async getCart() {
16
+ return await this.api.get("/cart");
17
+ }
18
+ /**
19
+ * Add item to cart
20
+ */
21
+ async addItem(data) {
22
+ return await this.api.post("/cart/items", data);
23
+ }
24
+ /**
25
+ * Update cart item quantity
26
+ */
27
+ async updateQuantity(data) {
28
+ return await this.api.put(`/cart/items/${data.itemId}`, {
29
+ quantity: data.quantity
30
+ });
31
+ }
32
+ /**
33
+ * Remove item from cart
34
+ */
35
+ async removeItem(itemId) {
36
+ await this.api.delete(`/cart/items/${itemId}`);
37
+ }
38
+ /**
39
+ * Clear entire cart
40
+ */
41
+ async clearCart() {
42
+ await this.api.delete("/cart");
43
+ }
44
+ };
45
+ var cartService = null;
46
+ var useCart = zustand.create()(
47
+ middleware.persist(
48
+ (set, get) => ({
49
+ // Initial state
50
+ items: [],
51
+ isLoading: false,
52
+ error: null,
53
+ // Computed properties (getters)
54
+ get total() {
55
+ return get().items.reduce(
56
+ (sum, item) => sum + item.price * item.quantity,
57
+ 0
58
+ );
59
+ },
60
+ get itemCount() {
61
+ return get().items.reduce((sum, item) => sum + item.quantity, 0);
62
+ },
63
+ get subtotal() {
64
+ return get().total;
65
+ },
66
+ /**
67
+ * Fetch cart from server
68
+ */
69
+ fetchCart: async () => {
70
+ if (!cartService) {
71
+ throw new Error(
72
+ "Cart service not initialized. Call initializeOnex() first."
73
+ );
74
+ }
75
+ set({ isLoading: true, error: null });
76
+ try {
77
+ const cart = await cartService.getCart();
78
+ set({ items: cart.items, isLoading: false });
79
+ } catch (error) {
80
+ set({ error: error.message, isLoading: false });
81
+ }
82
+ },
83
+ /**
84
+ * Add item to cart
85
+ */
86
+ addItem: async (data) => {
87
+ if (!cartService) {
88
+ throw new Error(
89
+ "Cart service not initialized. Call initializeOnex() first."
90
+ );
91
+ }
92
+ set({ isLoading: true, error: null });
93
+ try {
94
+ const item = await cartService.addItem(data);
95
+ set((state) => {
96
+ const existingItemIndex = state.items.findIndex(
97
+ (i) => i.productId === data.productId && i.variant === data.variant
98
+ );
99
+ if (existingItemIndex >= 0) {
100
+ const updatedItems = [...state.items];
101
+ updatedItems[existingItemIndex] = item;
102
+ return { items: updatedItems, isLoading: false };
103
+ } else {
104
+ return {
105
+ items: [...state.items, item],
106
+ isLoading: false
107
+ };
108
+ }
109
+ });
110
+ } catch (error) {
111
+ set({ error: error.message, isLoading: false });
112
+ throw error;
113
+ }
114
+ },
115
+ /**
116
+ * Update cart item quantity
117
+ * Supports both: updateQuantity({itemId, quantity}) and updateQuantity(itemId, quantity)
118
+ */
119
+ updateQuantity: async (dataOrItemId, quantity) => {
120
+ if (!cartService) {
121
+ throw new Error(
122
+ "Cart service not initialized. Call initializeOnex() first."
123
+ );
124
+ }
125
+ const data = typeof dataOrItemId === "string" ? { itemId: dataOrItemId, quantity } : dataOrItemId;
126
+ set({ isLoading: true, error: null });
127
+ try {
128
+ const updatedItem = await cartService.updateQuantity(data);
129
+ set((state) => ({
130
+ items: state.items.map(
131
+ (item) => item.id === data.itemId ? updatedItem : item
132
+ ),
133
+ isLoading: false
134
+ }));
135
+ } catch (error) {
136
+ set({ error: error.message, isLoading: false });
137
+ throw error;
138
+ }
139
+ },
140
+ /**
141
+ * Remove item from cart
142
+ */
143
+ removeItem: async (itemId) => {
144
+ if (!cartService) {
145
+ throw new Error(
146
+ "Cart service not initialized. Call initializeOnex() first."
147
+ );
148
+ }
149
+ set({ isLoading: true, error: null });
150
+ try {
151
+ await cartService.removeItem(itemId);
152
+ set((state) => ({
153
+ items: state.items.filter((item) => item.id !== itemId),
154
+ isLoading: false
155
+ }));
156
+ } catch (error) {
157
+ set({ error: error.message, isLoading: false });
158
+ throw error;
159
+ }
160
+ },
161
+ /**
162
+ * Clear entire cart
163
+ */
164
+ clearCart: async () => {
165
+ if (!cartService) {
166
+ throw new Error(
167
+ "Cart service not initialized. Call initializeOnex() first."
168
+ );
169
+ }
170
+ set({ isLoading: true, error: null });
171
+ try {
172
+ await cartService.clearCart();
173
+ set({ items: [], isLoading: false });
174
+ } catch (error) {
175
+ set({ error: error.message, isLoading: false });
176
+ throw error;
177
+ }
178
+ },
179
+ /**
180
+ * Clear error
181
+ */
182
+ clearError: () => {
183
+ set({ error: null });
184
+ }
185
+ }),
186
+ {
187
+ name: "onex-cart-storage",
188
+ // localStorage key
189
+ storage: middleware.createJSONStorage(
190
+ () => typeof window !== "undefined" ? localStorage : {}
191
+ ),
192
+ partialize: (state) => ({ items: state.items })
193
+ // Only persist items
194
+ }
195
+ )
196
+ );
197
+ function initializeCartService(service) {
198
+ cartService = service;
199
+ }
200
+
201
+ exports.CartService = CartService;
202
+ exports.initializeCartService = initializeCartService;
203
+ exports.useCart = useCart;
204
+ //# sourceMappingURL=chunk-ZFFXXLX7.js.map
205
+ //# sourceMappingURL=chunk-ZFFXXLX7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/features/cart/cart-service.ts","../src/features/cart/use-cart.ts"],"names":["create","persist","createJSONStorage"],"mappings":"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","file":"chunk-ZFFXXLX7.js","sourcesContent":["/**\n * Cart Service\n * Handles all cart-related API calls\n */\n\nimport { ApiClient } from \"../../api/client\";\nimport type {\n Cart,\n CartItem,\n AddToCartData,\n UpdateCartItemData,\n} from \"./types\";\n\nexport class CartService {\n constructor(private api: ApiClient) {}\n\n /**\n * Get current cart\n */\n async getCart(): Promise<Cart> {\n return await this.api.get<Cart>(\"/cart\");\n }\n\n /**\n * Add item to cart\n */\n async addItem(data: AddToCartData): Promise<CartItem> {\n return await this.api.post<CartItem>(\"/cart/items\", data);\n }\n\n /**\n * Update cart item quantity\n */\n async updateQuantity(data: UpdateCartItemData): Promise<CartItem> {\n return await this.api.put<CartItem>(`/cart/items/${data.itemId}`, {\n quantity: data.quantity,\n });\n }\n\n /**\n * Remove item from cart\n */\n async removeItem(itemId: string): Promise<void> {\n await this.api.delete(`/cart/items/${itemId}`);\n }\n\n /**\n * Clear entire cart\n */\n async clearCart(): Promise<void> {\n await this.api.delete(\"/cart\");\n }\n}\n","/**\n * Cart Hook\n * Zustand store for cart state and actions with persistence\n */\n\nimport { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport { CartService } from \"./cart-service\";\nimport type { CartItem, AddToCartData, UpdateCartItemData } from \"./types\";\n\ninterface CartState {\n // State\n items: CartItem[];\n isLoading: boolean;\n error: string | null;\n\n // Computed properties\n total: number;\n itemCount: number;\n subtotal: number;\n\n // Actions\n fetchCart: () => Promise<void>;\n addItem: (data: AddToCartData) => Promise<void>;\n updateQuantity: (\n dataOrItemId: UpdateCartItemData | string,\n quantity?: number\n ) => Promise<void>;\n removeItem: (itemId: string) => Promise<void>;\n clearCart: () => Promise<void>;\n clearError: () => void;\n}\n\nlet cartService: CartService | null = null;\n\nexport const useCart = create<CartState>()(\n persist(\n (set, get) => ({\n // Initial state\n items: [],\n isLoading: false,\n error: null,\n\n // Computed properties (getters)\n get total() {\n return get().items.reduce(\n (sum, item) => sum + item.price * item.quantity,\n 0\n );\n },\n\n get itemCount() {\n return get().items.reduce((sum, item) => sum + item.quantity, 0);\n },\n\n get subtotal() {\n return get().total; // Can add tax/shipping logic here\n },\n\n /**\n * Fetch cart from server\n */\n fetchCart: async () => {\n if (!cartService) {\n throw new Error(\n \"Cart service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const cart = await cartService.getCart();\n set({ items: cart.items, isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Add item to cart\n */\n addItem: async (data) => {\n if (!cartService) {\n throw new Error(\n \"Cart service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const item = await cartService.addItem(data);\n\n set((state) => {\n // Check if item already exists in cart\n const existingItemIndex = state.items.findIndex(\n (i) =>\n i.productId === data.productId && i.variant === data.variant\n );\n\n if (existingItemIndex >= 0) {\n // Update quantity if exists\n const updatedItems = [...state.items];\n updatedItems[existingItemIndex] = item;\n return { items: updatedItems, isLoading: false };\n } else {\n // Add new item\n return {\n items: [...state.items, item],\n isLoading: false,\n };\n }\n });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n throw error;\n }\n },\n\n /**\n * Update cart item quantity\n * Supports both: updateQuantity({itemId, quantity}) and updateQuantity(itemId, quantity)\n */\n updateQuantity: async (dataOrItemId, quantity?) => {\n if (!cartService) {\n throw new Error(\n \"Cart service not initialized. Call initializeOnex() first.\"\n );\n }\n\n // Normalize to UpdateCartItemData format\n const data: UpdateCartItemData =\n typeof dataOrItemId === \"string\"\n ? { itemId: dataOrItemId, quantity: quantity! }\n : dataOrItemId;\n\n set({ isLoading: true, error: null });\n try {\n const updatedItem = await cartService.updateQuantity(data);\n\n set((state) => ({\n items: state.items.map((item) =>\n item.id === data.itemId ? updatedItem : item\n ),\n isLoading: false,\n }));\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n throw error;\n }\n },\n\n /**\n * Remove item from cart\n */\n removeItem: async (itemId) => {\n if (!cartService) {\n throw new Error(\n \"Cart service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n await cartService.removeItem(itemId);\n\n set((state) => ({\n items: state.items.filter((item) => item.id !== itemId),\n isLoading: false,\n }));\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n throw error;\n }\n },\n\n /**\n * Clear entire cart\n */\n clearCart: async () => {\n if (!cartService) {\n throw new Error(\n \"Cart service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n await cartService.clearCart();\n set({ items: [], isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n throw error;\n }\n },\n\n /**\n * Clear error\n */\n clearError: () => {\n set({ error: null });\n },\n }),\n {\n name: \"onex-cart-storage\", // localStorage key\n storage: createJSONStorage(() =>\n typeof window !== \"undefined\" ? localStorage : ({} as Storage)\n ),\n partialize: (state) => ({ items: state.items }), // Only persist items\n }\n )\n);\n\n/**\n * Initialize cart service\n * @internal Called by initializeOnex()\n */\nexport function initializeCartService(service: CartService): void {\n cartService = service;\n}\n"]}