@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.
- package/README.md +44 -65
- package/THEME_API.md +36 -33
- package/dist/api.js +14 -0
- package/dist/api.js.map +1 -0
- package/dist/api.mjs +5 -0
- package/dist/api.mjs.map +1 -0
- package/dist/auth.js +23 -0
- package/dist/auth.js.map +1 -0
- package/dist/auth.mjs +6 -0
- package/dist/auth.mjs.map +1 -0
- package/dist/blog.js +22 -0
- package/dist/blog.js.map +1 -0
- package/dist/blog.mjs +5 -0
- package/dist/blog.mjs.map +1 -0
- package/dist/cart.js +27 -0
- package/dist/cart.js.map +1 -0
- package/dist/cart.mjs +6 -0
- package/dist/cart.mjs.map +1 -0
- package/dist/chunk-2CSWHI3L.js +210 -0
- package/dist/chunk-2CSWHI3L.js.map +1 -0
- package/dist/chunk-2FGHIDUV.js +99 -0
- package/dist/chunk-2FGHIDUV.js.map +1 -0
- package/dist/chunk-2NMEKWO5.js +40 -0
- package/dist/chunk-2NMEKWO5.js.map +1 -0
- package/dist/chunk-43BVHGDT.mjs +131 -0
- package/dist/chunk-43BVHGDT.mjs.map +1 -0
- package/dist/chunk-4JVQJI3I.mjs +290 -0
- package/dist/chunk-4JVQJI3I.mjs.map +1 -0
- package/dist/chunk-5N2EKK5O.js +9550 -0
- package/dist/chunk-5N2EKK5O.js.map +1 -0
- package/dist/chunk-5T6NDVSN.js +76 -0
- package/dist/chunk-5T6NDVSN.js.map +1 -0
- package/dist/chunk-73AINNCI.mjs +201 -0
- package/dist/chunk-73AINNCI.mjs.map +1 -0
- package/dist/chunk-AIXBDAVP.mjs +61 -0
- package/dist/chunk-AIXBDAVP.mjs.map +1 -0
- package/dist/chunk-ALYN5HAC.js +210 -0
- package/dist/chunk-ALYN5HAC.js.map +1 -0
- package/dist/chunk-AREMJR3Q.js +36 -0
- package/dist/chunk-AREMJR3Q.js.map +1 -0
- package/dist/chunk-DXAI6XOI.mjs +33 -0
- package/dist/chunk-DXAI6XOI.mjs.map +1 -0
- package/dist/chunk-F5TFNWFJ.mjs +257 -0
- package/dist/chunk-F5TFNWFJ.mjs.map +1 -0
- package/dist/chunk-FQ7FWUZN.js +265 -0
- package/dist/chunk-FQ7FWUZN.js.map +1 -0
- package/dist/{chunk-3SZX6LHT.js → chunk-J27VGXJH.js} +2 -24
- package/dist/chunk-J27VGXJH.js.map +1 -0
- package/dist/chunk-JZ46LLTZ.js +121 -0
- package/dist/chunk-JZ46LLTZ.js.map +1 -0
- package/dist/chunk-K24UHN6G.mjs +76 -0
- package/dist/chunk-K24UHN6G.mjs.map +1 -0
- package/dist/chunk-KCQGGU5R.mjs +344 -0
- package/dist/chunk-KCQGGU5R.mjs.map +1 -0
- package/dist/chunk-MT22NYKT.mjs +117 -0
- package/dist/chunk-MT22NYKT.mjs.map +1 -0
- package/dist/chunk-NDD472IZ.js +85 -0
- package/dist/chunk-NDD472IZ.js.map +1 -0
- package/dist/chunk-NHOIGGYU.mjs +833 -0
- package/dist/chunk-NHOIGGYU.mjs.map +1 -0
- package/dist/chunk-O3XR7TW3.mjs +12 -0
- package/dist/chunk-O3XR7TW3.mjs.map +1 -0
- package/dist/chunk-OAPYSC2X.mjs +206 -0
- package/dist/chunk-OAPYSC2X.mjs.map +1 -0
- package/dist/{chunk-XE4EOKS4.mjs → chunk-ONJREDYY.mjs} +3 -23
- package/dist/chunk-ONJREDYY.mjs.map +1 -0
- package/dist/chunk-OVT2LUAM.js +197 -0
- package/dist/chunk-OVT2LUAM.js.map +1 -0
- package/dist/chunk-OWNGNGKL.js +331 -0
- package/dist/chunk-OWNGNGKL.js.map +1 -0
- package/dist/chunk-P7SXNZSV.js +298 -0
- package/dist/chunk-P7SXNZSV.js.map +1 -0
- package/dist/chunk-PFJOL3HI.mjs +71 -0
- package/dist/chunk-PFJOL3HI.mjs.map +1 -0
- package/dist/chunk-PPULMWJ6.js +295 -0
- package/dist/chunk-PPULMWJ6.js.map +1 -0
- package/dist/chunk-RGIVKACG.js +359 -0
- package/dist/chunk-RGIVKACG.js.map +1 -0
- package/dist/chunk-RPP5K2LP.js +870 -0
- package/dist/chunk-RPP5K2LP.js.map +1 -0
- package/dist/{chunk-7EON6Q4L.mjs → chunk-RUCHWUD7.mjs} +7651 -6370
- package/dist/chunk-RUCHWUD7.mjs.map +1 -0
- package/dist/chunk-SEVUIX4H.js +137 -0
- package/dist/chunk-SEVUIX4H.js.map +1 -0
- package/dist/chunk-SK2FSHFM.mjs +208 -0
- package/dist/chunk-SK2FSHFM.mjs.map +1 -0
- package/dist/chunk-T6EJ2GAV.mjs +294 -0
- package/dist/chunk-T6EJ2GAV.mjs.map +1 -0
- package/dist/chunk-ULBDOFZI.mjs +302 -0
- package/dist/chunk-ULBDOFZI.mjs.map +1 -0
- package/dist/chunk-V3JIELNV.js +241 -0
- package/dist/chunk-V3JIELNV.js.map +1 -0
- package/dist/chunk-V5E2KWMA.mjs +238 -0
- package/dist/chunk-V5E2KWMA.mjs.map +1 -0
- package/dist/chunk-VJA3ER6A.js +14 -0
- package/dist/chunk-VJA3ER6A.js.map +1 -0
- package/dist/chunk-VLI7ULX5.js +66 -0
- package/dist/chunk-VLI7ULX5.js.map +1 -0
- package/dist/chunk-WFGS5OFH.mjs +189 -0
- package/dist/chunk-WFGS5OFH.mjs.map +1 -0
- package/dist/chunk-WVC5GP24.mjs +96 -0
- package/dist/chunk-WVC5GP24.mjs.map +1 -0
- package/dist/chunk-YOSPWY5K.mjs +36 -0
- package/dist/chunk-YOSPWY5K.mjs.map +1 -0
- package/dist/chunk-ZFFXXLX7.js +205 -0
- package/dist/chunk-ZFFXXLX7.js.map +1 -0
- package/dist/client.js +512 -249
- package/dist/client.mjs +21 -2
- package/dist/components.js +393 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +8 -0
- package/dist/components.mjs.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/config.mjs +4 -0
- package/dist/config.mjs.map +1 -0
- package/dist/contact.js +22 -0
- package/dist/contact.js.map +1 -0
- package/dist/contact.mjs +5 -0
- package/dist/contact.mjs.map +1 -0
- package/dist/contexts.js +51 -0
- package/dist/contexts.js.map +1 -0
- package/dist/contexts.mjs +6 -0
- package/dist/contexts.mjs.map +1 -0
- package/dist/finance.js +26 -0
- package/dist/finance.js.map +1 -0
- package/dist/finance.mjs +5 -0
- package/dist/finance.mjs.map +1 -0
- package/dist/icons.js +15 -0
- package/dist/icons.js.map +1 -0
- package/dist/icons.mjs +4 -0
- package/dist/icons.mjs.map +1 -0
- package/dist/index.js +512 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -2
- package/dist/index.mjs.map +1 -1
- package/dist/internal.js +1437 -0
- package/dist/internal.js.map +1 -0
- package/dist/internal.mjs +1404 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/motion.js +51 -0
- package/dist/motion.js.map +1 -0
- package/dist/motion.mjs +38 -0
- package/dist/motion.mjs.map +1 -0
- package/dist/orders.js +22 -0
- package/dist/orders.js.map +1 -0
- package/dist/orders.mjs +5 -0
- package/dist/orders.mjs.map +1 -0
- package/dist/products.js +27 -0
- package/dist/products.js.map +1 -0
- package/dist/products.mjs +6 -0
- package/dist/products.mjs.map +1 -0
- package/dist/registry.js +44 -0
- package/dist/registry.js.map +1 -0
- package/dist/registry.mjs +7 -0
- package/dist/registry.mjs.map +1 -0
- package/dist/renderers.js +51 -0
- package/dist/renderers.js.map +1 -0
- package/dist/renderers.mjs +6 -0
- package/dist/renderers.mjs.map +1 -0
- package/dist/server.js +11 -189
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +3 -186
- package/dist/server.mjs.map +1 -1
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +4 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.js +160 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +7 -0
- package/dist/utils.mjs.map +1 -0
- package/dist/wrappers.js +104 -0
- package/dist/wrappers.js.map +1 -0
- package/dist/wrappers.mjs +96 -0
- package/dist/wrappers.mjs.map +1 -0
- package/package.json +112 -9
- package/dist/api-vuL1Eg5L.d.mts +0 -2961
- package/dist/api-vuL1Eg5L.d.ts +0 -2961
- package/dist/chunk-3SZX6LHT.js.map +0 -1
- package/dist/chunk-7EON6Q4L.mjs.map +0 -1
- package/dist/chunk-WDY773GJ.js +0 -8308
- package/dist/chunk-WDY773GJ.js.map +0 -1
- package/dist/chunk-XE4EOKS4.mjs.map +0 -1
- package/dist/client.d.mts +0 -1461
- package/dist/client.d.ts +0 -1461
- package/dist/index.d.mts +0 -125
- package/dist/index.d.ts +0 -125
- package/dist/server.d.mts +0 -70
- 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"]}
|