@commercengine/checkout 0.1.1 → 0.1.2

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 CHANGED
@@ -89,6 +89,14 @@ function ProductCard({ product }) {
89
89
  </button>
90
90
  );
91
91
  }
92
+
93
+ // User state is also reactive
94
+ function UserGreeting() {
95
+ const { isLoggedIn, user } = useCheckout();
96
+
97
+ if (!isLoggedIn) return <span>Guest</span>;
98
+ return <span>Welcome, {user?.firstName || user?.email}</span>;
99
+ }
92
100
  ```
93
101
 
94
102
  ### Vue / Nuxt
@@ -297,6 +305,8 @@ initCheckout({
297
305
  | `cartCount` | `number` | Number of items in cart |
298
306
  | `cartTotal` | `number` | Cart subtotal amount |
299
307
  | `cartCurrency` | `string` | Currency code (e.g., "USD") |
308
+ | `isLoggedIn` | `boolean` | Whether user is logged in |
309
+ | `user` | `UserInfo \| null` | Current user info (null if not logged in) |
300
310
 
301
311
  | Method | Description |
302
312
  |--------|-------------|
package/dist/react.cjs CHANGED
@@ -4,43 +4,6 @@ let zustand_react_shallow = require("zustand/react/shallow");
4
4
 
5
5
  //#region src/react.ts
6
6
  /**
7
- * Commerce Engine Checkout - React Binding
8
- *
9
- * React hook for checkout integration with automatic state synchronization.
10
- *
11
- * @example
12
- * ```tsx
13
- * import { useCheckout, initCheckout } from "@commercengine/checkout/react";
14
- *
15
- * // Initialize once at app root
16
- * function App() {
17
- * useEffect(() => {
18
- * initCheckout({
19
- * storeId: "store_xxx",
20
- * apiKey: "ak_xxx",
21
- * onComplete: (order) => router.push("/thank-you"),
22
- * });
23
- * return () => destroyCheckout();
24
- * }, []);
25
- *
26
- * return <>{children}</>;
27
- * }
28
- *
29
- * // Use anywhere - no provider needed
30
- * function Header() {
31
- * const { cartCount, openCart, isReady } = useCheckout();
32
- *
33
- * return (
34
- * <button onClick={openCart} disabled={!isReady}>
35
- * Cart ({cartCount})
36
- * </button>
37
- * );
38
- * }
39
- * ```
40
- *
41
- * @packageDocumentation
42
- */
43
- /**
44
7
  * React hook for checkout integration
45
8
  *
46
9
  * Provides reactive access to checkout state and methods.
@@ -80,7 +43,9 @@ function useCheckout() {
80
43
  isOpen: s.isOpen,
81
44
  cartCount: s.cartCount,
82
45
  cartTotal: s.cartTotal,
83
- cartCurrency: s.cartCurrency
46
+ cartCurrency: s.cartCurrency,
47
+ isLoggedIn: s.isLoggedIn,
48
+ user: s.user
84
49
  })));
85
50
  const actions = (0, zustand.useStore)(require_store.checkoutStore, (0, zustand_react_shallow.useShallow)((s) => ({
86
51
  openCart: s.openCart,
@@ -1 +1 @@
1
- {"version":3,"file":"react.cjs","names":["checkoutStore"],"sources":["../src/react.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - React Binding\n *\n * React hook for checkout integration with automatic state synchronization.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/react\";\n *\n * // Initialize once at app root\n * function App() {\n * useEffect(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * onComplete: (order) => router.push(\"/thank-you\"),\n * });\n * return () => destroyCheckout();\n * }, []);\n *\n * return <>{children}</>;\n * }\n *\n * // Use anywhere - no provider needed\n * function Header() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport { useStore } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { type CheckoutActions, type CheckoutState, checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout hook\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use */\n isReady: boolean;\n /** Whether checkout overlay is currently open */\n isOpen: boolean;\n /** Number of items in cart */\n cartCount: number;\n /** Cart subtotal amount */\n cartTotal: number;\n /** Cart currency code */\n cartCurrency: string;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * React hook for checkout integration\n *\n * Provides reactive access to checkout state and methods.\n * No provider required - works anywhere in your component tree.\n *\n * @returns Checkout state and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard({ product }) {\n * const { addToCart } = useCheckout();\n *\n * return (\n * <button onClick={() => addToCart(product.id, product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Subscribe to state with shallow comparison to prevent unnecessary re-renders\n const state = useStore(\n checkoutStore,\n useShallow((s: CheckoutState) => ({\n isReady: s.isReady,\n isOpen: s.isOpen,\n cartCount: s.cartCount,\n cartTotal: s.cartTotal,\n cartCurrency: s.cartCurrency,\n }))\n );\n\n // Actions are stable references from the store\n const actions = useStore(\n checkoutStore,\n useShallow((s: CheckoutActions) => ({\n openCart: s.openCart,\n openCheckout: s.openCheckout,\n close: s.close,\n addToCart: s.addToCart,\n updateTokens: s.updateTokens,\n }))\n );\n\n return {\n ...state,\n ...actions,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6IA,SAAgB,cAAiC;CAE/C,MAAM,8BACJA,oEACY,OAAsB;EAChC,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,WAAW,EAAE;EACb,WAAW,EAAE;EACb,cAAc,EAAE;EACjB,EAAE,CACJ;CAGD,MAAM,gCACJA,oEACY,OAAwB;EAClC,UAAU,EAAE;EACZ,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,WAAW,EAAE;EACb,cAAc,EAAE;EACjB,EAAE,CACJ;AAED,QAAO;EACL,GAAG;EACH,GAAG;EACJ"}
1
+ {"version":3,"file":"react.cjs","names":["checkoutStore"],"sources":["../src/react.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - React Binding\n *\n * React hook for checkout integration with automatic state synchronization.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/react\";\n *\n * // Initialize once at app root\n * function App() {\n * useEffect(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * onComplete: (order) => router.push(\"/thank-you\"),\n * });\n * return () => destroyCheckout();\n * }, []);\n *\n * return <>{children}</>;\n * }\n *\n * // Use anywhere - no provider needed\n * function Header() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { UserInfo } from \"@commercengine/js\";\nimport { useStore } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { type CheckoutActions, type CheckoutState, checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout hook\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use */\n isReady: boolean;\n /** Whether checkout overlay is currently open */\n isOpen: boolean;\n /** Number of items in cart */\n cartCount: number;\n /** Cart subtotal amount */\n cartTotal: number;\n /** Cart currency code */\n cartCurrency: string;\n /** Whether user is logged in */\n isLoggedIn: boolean;\n /** Current user info (null if not logged in) */\n user: UserInfo | null;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * React hook for checkout integration\n *\n * Provides reactive access to checkout state and methods.\n * No provider required - works anywhere in your component tree.\n *\n * @returns Checkout state and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard({ product }) {\n * const { addToCart } = useCheckout();\n *\n * return (\n * <button onClick={() => addToCart(product.id, product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Subscribe to state with shallow comparison to prevent unnecessary re-renders\n const state = useStore(\n checkoutStore,\n useShallow((s: CheckoutState) => ({\n isReady: s.isReady,\n isOpen: s.isOpen,\n cartCount: s.cartCount,\n cartTotal: s.cartTotal,\n cartCurrency: s.cartCurrency,\n isLoggedIn: s.isLoggedIn,\n user: s.user,\n }))\n );\n\n // Actions are stable references from the store\n const actions = useStore(\n checkoutStore,\n useShallow((s: CheckoutActions) => ({\n openCart: s.openCart,\n openCheckout: s.openCheckout,\n close: s.close,\n addToCart: s.addToCart,\n updateTokens: s.updateTokens,\n }))\n );\n\n return {\n ...state,\n ...actions,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkJA,SAAgB,cAAiC;CAE/C,MAAM,8BACJA,oEACY,OAAsB;EAChC,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,WAAW,EAAE;EACb,WAAW,EAAE;EACb,cAAc,EAAE;EAChB,YAAY,EAAE;EACd,MAAM,EAAE;EACT,EAAE,CACJ;CAGD,MAAM,gCACJA,oEACY,OAAwB;EAClC,UAAU,EAAE;EACZ,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,WAAW,EAAE;EACb,cAAc,EAAE;EACjB,EAAE,CACJ;AAED,QAAO;EACL,GAAG;EACH,GAAG;EACJ"}
package/dist/react.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as destroyCheckout, c as subscribeToCheckout, i as checkoutStore, n as CheckoutState, o as getCheckout, r as CheckoutStore, s as initCheckout, t as CheckoutActions } from "./store.cjs";
2
- import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo } from "@commercengine/js";
2
+ import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo, UserInfo as UserInfo$1 } from "@commercengine/js";
3
3
 
4
4
  //#region src/react.d.ts
5
5
 
@@ -17,6 +17,10 @@ interface UseCheckoutReturn {
17
17
  cartTotal: number;
18
18
  /** Cart currency code */
19
19
  cartCurrency: string;
20
+ /** Whether user is logged in */
21
+ isLoggedIn: boolean;
22
+ /** Current user info (null if not logged in) */
23
+ user: UserInfo$1 | null;
20
24
  /** Open the cart drawer */
21
25
  openCart: () => void;
22
26
  /** Open the checkout drawer directly */
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.cts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAgFiB,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6DD,WAAA,CAAA,GAAe"}
1
+ {"version":3,"file":"react.d.cts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAiFiB,iBAAA;;;;;;;;;;;;;;QAcT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDQ,WAAA,CAAA,GAAe"}
package/dist/react.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as destroyCheckout, c as subscribeToCheckout, i as checkoutStore, n as CheckoutState, o as getCheckout, r as CheckoutStore, s as initCheckout, t as CheckoutActions } from "./store.js";
2
- import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo } from "@commercengine/js";
2
+ import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo, UserInfo as UserInfo$1 } from "@commercengine/js";
3
3
 
4
4
  //#region src/react.d.ts
5
5
 
@@ -17,6 +17,10 @@ interface UseCheckoutReturn {
17
17
  cartTotal: number;
18
18
  /** Cart currency code */
19
19
  cartCurrency: string;
20
+ /** Whether user is logged in */
21
+ isLoggedIn: boolean;
22
+ /** Current user info (null if not logged in) */
23
+ user: UserInfo$1 | null;
20
24
  /** Open the cart drawer */
21
25
  openCart: () => void;
22
26
  /** Open the checkout drawer directly */
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAgFiB,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6DD,WAAA,CAAA,GAAe"}
1
+ {"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAiFiB,iBAAA;;;;;;;;;;;;;;QAcT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDQ,WAAA,CAAA,GAAe"}
package/dist/react.js CHANGED
@@ -4,43 +4,6 @@ import { useShallow } from "zustand/react/shallow";
4
4
 
5
5
  //#region src/react.ts
6
6
  /**
7
- * Commerce Engine Checkout - React Binding
8
- *
9
- * React hook for checkout integration with automatic state synchronization.
10
- *
11
- * @example
12
- * ```tsx
13
- * import { useCheckout, initCheckout } from "@commercengine/checkout/react";
14
- *
15
- * // Initialize once at app root
16
- * function App() {
17
- * useEffect(() => {
18
- * initCheckout({
19
- * storeId: "store_xxx",
20
- * apiKey: "ak_xxx",
21
- * onComplete: (order) => router.push("/thank-you"),
22
- * });
23
- * return () => destroyCheckout();
24
- * }, []);
25
- *
26
- * return <>{children}</>;
27
- * }
28
- *
29
- * // Use anywhere - no provider needed
30
- * function Header() {
31
- * const { cartCount, openCart, isReady } = useCheckout();
32
- *
33
- * return (
34
- * <button onClick={openCart} disabled={!isReady}>
35
- * Cart ({cartCount})
36
- * </button>
37
- * );
38
- * }
39
- * ```
40
- *
41
- * @packageDocumentation
42
- */
43
- /**
44
7
  * React hook for checkout integration
45
8
  *
46
9
  * Provides reactive access to checkout state and methods.
@@ -80,7 +43,9 @@ function useCheckout() {
80
43
  isOpen: s.isOpen,
81
44
  cartCount: s.cartCount,
82
45
  cartTotal: s.cartTotal,
83
- cartCurrency: s.cartCurrency
46
+ cartCurrency: s.cartCurrency,
47
+ isLoggedIn: s.isLoggedIn,
48
+ user: s.user
84
49
  })));
85
50
  const actions = useStore(checkoutStore, useShallow((s) => ({
86
51
  openCart: s.openCart,
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","names":[],"sources":["../src/react.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - React Binding\n *\n * React hook for checkout integration with automatic state synchronization.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/react\";\n *\n * // Initialize once at app root\n * function App() {\n * useEffect(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * onComplete: (order) => router.push(\"/thank-you\"),\n * });\n * return () => destroyCheckout();\n * }, []);\n *\n * return <>{children}</>;\n * }\n *\n * // Use anywhere - no provider needed\n * function Header() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport { useStore } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { type CheckoutActions, type CheckoutState, checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout hook\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use */\n isReady: boolean;\n /** Whether checkout overlay is currently open */\n isOpen: boolean;\n /** Number of items in cart */\n cartCount: number;\n /** Cart subtotal amount */\n cartTotal: number;\n /** Cart currency code */\n cartCurrency: string;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * React hook for checkout integration\n *\n * Provides reactive access to checkout state and methods.\n * No provider required - works anywhere in your component tree.\n *\n * @returns Checkout state and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard({ product }) {\n * const { addToCart } = useCheckout();\n *\n * return (\n * <button onClick={() => addToCart(product.id, product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Subscribe to state with shallow comparison to prevent unnecessary re-renders\n const state = useStore(\n checkoutStore,\n useShallow((s: CheckoutState) => ({\n isReady: s.isReady,\n isOpen: s.isOpen,\n cartCount: s.cartCount,\n cartTotal: s.cartTotal,\n cartCurrency: s.cartCurrency,\n }))\n );\n\n // Actions are stable references from the store\n const actions = useStore(\n checkoutStore,\n useShallow((s: CheckoutActions) => ({\n openCart: s.openCart,\n openCheckout: s.openCheckout,\n close: s.close,\n addToCart: s.addToCart,\n updateTokens: s.updateTokens,\n }))\n );\n\n return {\n ...state,\n ...actions,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6IA,SAAgB,cAAiC;CAE/C,MAAM,QAAQ,SACZ,eACA,YAAY,OAAsB;EAChC,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,WAAW,EAAE;EACb,WAAW,EAAE;EACb,cAAc,EAAE;EACjB,EAAE,CACJ;CAGD,MAAM,UAAU,SACd,eACA,YAAY,OAAwB;EAClC,UAAU,EAAE;EACZ,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,WAAW,EAAE;EACb,cAAc,EAAE;EACjB,EAAE,CACJ;AAED,QAAO;EACL,GAAG;EACH,GAAG;EACJ"}
1
+ {"version":3,"file":"react.js","names":[],"sources":["../src/react.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - React Binding\n *\n * React hook for checkout integration with automatic state synchronization.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/react\";\n *\n * // Initialize once at app root\n * function App() {\n * useEffect(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * onComplete: (order) => router.push(\"/thank-you\"),\n * });\n * return () => destroyCheckout();\n * }, []);\n *\n * return <>{children}</>;\n * }\n *\n * // Use anywhere - no provider needed\n * function Header() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { UserInfo } from \"@commercengine/js\";\nimport { useStore } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { type CheckoutActions, type CheckoutState, checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout hook\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use */\n isReady: boolean;\n /** Whether checkout overlay is currently open */\n isOpen: boolean;\n /** Number of items in cart */\n cartCount: number;\n /** Cart subtotal amount */\n cartTotal: number;\n /** Cart currency code */\n cartCurrency: string;\n /** Whether user is logged in */\n isLoggedIn: boolean;\n /** Current user info (null if not logged in) */\n user: UserInfo | null;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * React hook for checkout integration\n *\n * Provides reactive access to checkout state and methods.\n * No provider required - works anywhere in your component tree.\n *\n * @returns Checkout state and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const { cartCount, openCart, isReady } = useCheckout();\n *\n * return (\n * <button onClick={openCart} disabled={!isReady}>\n * Cart ({cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard({ product }) {\n * const { addToCart } = useCheckout();\n *\n * return (\n * <button onClick={() => addToCart(product.id, product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Subscribe to state with shallow comparison to prevent unnecessary re-renders\n const state = useStore(\n checkoutStore,\n useShallow((s: CheckoutState) => ({\n isReady: s.isReady,\n isOpen: s.isOpen,\n cartCount: s.cartCount,\n cartTotal: s.cartTotal,\n cartCurrency: s.cartCurrency,\n isLoggedIn: s.isLoggedIn,\n user: s.user,\n }))\n );\n\n // Actions are stable references from the store\n const actions = useStore(\n checkoutStore,\n useShallow((s: CheckoutActions) => ({\n openCart: s.openCart,\n openCheckout: s.openCheckout,\n close: s.close,\n addToCart: s.addToCart,\n updateTokens: s.updateTokens,\n }))\n );\n\n return {\n ...state,\n ...actions,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkJA,SAAgB,cAAiC;CAE/C,MAAM,QAAQ,SACZ,eACA,YAAY,OAAsB;EAChC,SAAS,EAAE;EACX,QAAQ,EAAE;EACV,WAAW,EAAE;EACb,WAAW,EAAE;EACb,cAAc,EAAE;EAChB,YAAY,EAAE;EACd,MAAM,EAAE;EACT,EAAE,CACJ;CAGD,MAAM,UAAU,SACd,eACA,YAAY,OAAwB;EAClC,UAAU,EAAE;EACZ,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,WAAW,EAAE;EACb,cAAc,EAAE;EACjB,EAAE,CACJ;AAED,QAAO;EACL,GAAG;EACH,GAAG;EACJ"}
package/dist/solid.cjs CHANGED
@@ -3,42 +3,6 @@ let solid_js = require("solid-js");
3
3
 
4
4
  //#region src/solid.ts
5
5
  /**
6
- * Commerce Engine Checkout - Solid Binding
7
- *
8
- * Solid.js primitive for checkout integration with fine-grained reactivity.
9
- *
10
- * @example
11
- * ```tsx
12
- * import { useCheckout, initCheckout } from "@commercengine/checkout/solid";
13
- * import { onMount, onCleanup } from "solid-js";
14
- *
15
- * // Initialize once at app root
16
- * function App() {
17
- * onMount(() => {
18
- * initCheckout({
19
- * storeId: "store_xxx",
20
- * apiKey: "ak_xxx",
21
- * });
22
- * });
23
- *
24
- * return <>{props.children}</>;
25
- * }
26
- *
27
- * // Use anywhere
28
- * function Header() {
29
- * const checkout = useCheckout();
30
- *
31
- * return (
32
- * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>
33
- * Cart ({checkout.cartCount})
34
- * </button>
35
- * );
36
- * }
37
- * ```
38
- *
39
- * @packageDocumentation
40
- */
41
- /**
42
6
  * Solid.js primitive for checkout integration
43
7
  *
44
8
  * Returns an object with reactive getters for state and methods for actions.
@@ -80,12 +44,16 @@ function useCheckout() {
80
44
  const [cartCount, setCartCount] = (0, solid_js.createSignal)(initialState.cartCount);
81
45
  const [cartTotal, setCartTotal] = (0, solid_js.createSignal)(initialState.cartTotal);
82
46
  const [cartCurrency, setCartCurrency] = (0, solid_js.createSignal)(initialState.cartCurrency);
47
+ const [isLoggedIn, setIsLoggedIn] = (0, solid_js.createSignal)(initialState.isLoggedIn);
48
+ const [user, setUser] = (0, solid_js.createSignal)(initialState.user);
83
49
  const unsubscribe = require_store.checkoutStore.subscribe((state) => {
84
50
  setIsReady(state.isReady);
85
51
  setIsOpen(state.isOpen);
86
52
  setCartCount(state.cartCount);
87
53
  setCartTotal(state.cartTotal);
88
54
  setCartCurrency(state.cartCurrency);
55
+ setIsLoggedIn(state.isLoggedIn);
56
+ setUser(state.user);
89
57
  });
90
58
  (0, solid_js.onCleanup)(() => {
91
59
  unsubscribe();
@@ -106,6 +74,12 @@ function useCheckout() {
106
74
  get cartCurrency() {
107
75
  return cartCurrency();
108
76
  },
77
+ get isLoggedIn() {
78
+ return isLoggedIn();
79
+ },
80
+ get user() {
81
+ return user();
82
+ },
109
83
  openCart: () => require_store.checkoutStore.getState().openCart(),
110
84
  openCheckout: () => require_store.checkoutStore.getState().openCheckout(),
111
85
  close: () => require_store.checkoutStore.getState().close(),
@@ -1 +1 @@
1
- {"version":3,"file":"solid.cjs","names":["checkoutStore"],"sources":["../src/solid.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - Solid Binding\n *\n * Solid.js primitive for checkout integration with fine-grained reactivity.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/solid\";\n * import { onMount, onCleanup } from \"solid-js\";\n *\n * // Initialize once at app root\n * function App() {\n * onMount(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * });\n * });\n *\n * return <>{props.children}</>;\n * }\n *\n * // Use anywhere\n * function Header() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport { type Accessor, createSignal, onCleanup } from \"solid-js\";\nimport { checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout\n *\n * State properties are getters that return reactive values.\n * Actions are regular functions.\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use (reactive getter) */\n readonly isReady: boolean;\n /** Whether checkout overlay is currently open (reactive getter) */\n readonly isOpen: boolean;\n /** Number of items in cart (reactive getter) */\n readonly cartCount: number;\n /** Cart subtotal amount (reactive getter) */\n readonly cartTotal: number;\n /** Cart currency code (reactive getter) */\n readonly cartCurrency: string;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// PRIMITIVE\n// =============================================================================\n\n/**\n * Solid.js primitive for checkout integration\n *\n * Returns an object with reactive getters for state and methods for actions.\n * Uses Solid's fine-grained reactivity - components only re-render when\n * accessed values change.\n *\n * @returns Checkout state (reactive getters) and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard(props) {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.addToCart(props.product.id, props.product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Create signals for each piece of state\n const initialState = checkoutStore.getState();\n\n const [isReady, setIsReady] = createSignal(initialState.isReady);\n const [isOpen, setIsOpen] = createSignal(initialState.isOpen);\n const [cartCount, setCartCount] = createSignal(initialState.cartCount);\n const [cartTotal, setCartTotal] = createSignal(initialState.cartTotal);\n const [cartCurrency, setCartCurrency] = createSignal(initialState.cartCurrency);\n\n // Subscribe to store changes\n const unsubscribe = checkoutStore.subscribe((state) => {\n setIsReady(state.isReady);\n setIsOpen(state.isOpen);\n setCartCount(state.cartCount);\n setCartTotal(state.cartTotal);\n setCartCurrency(state.cartCurrency);\n });\n\n // Cleanup on component unmount\n onCleanup(() => {\n unsubscribe();\n });\n\n // Return object with reactive getters\n return {\n get isReady() {\n return isReady();\n },\n get isOpen() {\n return isOpen();\n },\n get cartCount() {\n return cartCount();\n },\n get cartTotal() {\n return cartTotal();\n },\n get cartCurrency() {\n return cartCurrency();\n },\n openCart: () => checkoutStore.getState().openCart(),\n openCheckout: () => checkoutStore.getState().openCheckout(),\n close: () => checkoutStore.getState().close(),\n addToCart: (productId, variantId, quantity) =>\n checkoutStore.getState().addToCart(productId, variantId, quantity),\n updateTokens: (accessToken, refreshToken) =>\n checkoutStore.getState().updateTokens(accessToken, refreshToken),\n };\n}\n\n// =============================================================================\n// INDIVIDUAL SIGNALS (for fine-grained subscriptions)\n// =============================================================================\n\n/**\n * Create a reactive signal for cart count only\n *\n * Use this when you only need cart count and want minimal re-renders.\n *\n * @example\n * ```tsx\n * function Badge() {\n * const count = createCartCountSignal();\n * return <span class=\"badge\">{count()}</span>;\n * }\n * ```\n */\nexport function createCartCountSignal(): Accessor<number> {\n const [cartCount, setCartCount] = createSignal(checkoutStore.getState().cartCount);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.cartCount !== prevState.cartCount) {\n setCartCount(state.cartCount);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return cartCount;\n}\n\n/**\n * Create a reactive signal for ready state only\n */\nexport function createIsReadySignal(): Accessor<boolean> {\n const [isReady, setIsReady] = createSignal(checkoutStore.getState().isReady);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.isReady !== prevState.isReady) {\n setIsReady(state.isReady);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return isReady;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+IA,SAAgB,cAAiC;CAE/C,MAAM,eAAeA,4BAAc,UAAU;CAE7C,MAAM,CAAC,SAAS,yCAA2B,aAAa,QAAQ;CAChE,MAAM,CAAC,QAAQ,wCAA0B,aAAa,OAAO;CAC7D,MAAM,CAAC,WAAW,2CAA6B,aAAa,UAAU;CACtE,MAAM,CAAC,WAAW,2CAA6B,aAAa,UAAU;CACtE,MAAM,CAAC,cAAc,8CAAgC,aAAa,aAAa;CAG/E,MAAM,cAAcA,4BAAc,WAAW,UAAU;AACrD,aAAW,MAAM,QAAQ;AACzB,YAAU,MAAM,OAAO;AACvB,eAAa,MAAM,UAAU;AAC7B,eAAa,MAAM,UAAU;AAC7B,kBAAgB,MAAM,aAAa;GACnC;AAGF,+BAAgB;AACd,eAAa;GACb;AAGF,QAAO;EACL,IAAI,UAAU;AACZ,UAAO,SAAS;;EAElB,IAAI,SAAS;AACX,UAAO,QAAQ;;EAEjB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,eAAe;AACjB,UAAO,cAAc;;EAEvB,gBAAgBA,4BAAc,UAAU,CAAC,UAAU;EACnD,oBAAoBA,4BAAc,UAAU,CAAC,cAAc;EAC3D,aAAaA,4BAAc,UAAU,CAAC,OAAO;EAC7C,YAAY,WAAW,WAAW,aAChCA,4BAAc,UAAU,CAAC,UAAU,WAAW,WAAW,SAAS;EACpE,eAAe,aAAa,iBAC1BA,4BAAc,UAAU,CAAC,aAAa,aAAa,aAAa;EACnE;;;;;;;;;;;;;;;AAoBH,SAAgB,wBAA0C;CACxD,MAAM,CAAC,WAAW,2CAA6BA,4BAAc,UAAU,CAAC,UAAU;CAElF,MAAM,cAAcA,4BAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,cAAc,UAAU,UAChC,cAAa,MAAM,UAAU;GAE/B;AAEF,+BAAgB;AACd,eAAa;GACb;AAEF,QAAO;;;;;AAMT,SAAgB,sBAAyC;CACvD,MAAM,CAAC,SAAS,yCAA2BA,4BAAc,UAAU,CAAC,QAAQ;CAE5E,MAAM,cAAcA,4BAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,YAAY,UAAU,QAC9B,YAAW,MAAM,QAAQ;GAE3B;AAEF,+BAAgB;AACd,eAAa;GACb;AAEF,QAAO"}
1
+ {"version":3,"file":"solid.cjs","names":["checkoutStore"],"sources":["../src/solid.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - Solid Binding\n *\n * Solid.js primitive for checkout integration with fine-grained reactivity.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/solid\";\n * import { onMount, onCleanup } from \"solid-js\";\n *\n * // Initialize once at app root\n * function App() {\n * onMount(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * });\n * });\n *\n * return <>{props.children}</>;\n * }\n *\n * // Use anywhere\n * function Header() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { UserInfo } from \"@commercengine/js\";\nimport { type Accessor, createSignal, onCleanup } from \"solid-js\";\nimport { checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout\n *\n * State properties are getters that return reactive values.\n * Actions are regular functions.\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use (reactive getter) */\n readonly isReady: boolean;\n /** Whether checkout overlay is currently open (reactive getter) */\n readonly isOpen: boolean;\n /** Number of items in cart (reactive getter) */\n readonly cartCount: number;\n /** Cart subtotal amount (reactive getter) */\n readonly cartTotal: number;\n /** Cart currency code (reactive getter) */\n readonly cartCurrency: string;\n /** Whether user is logged in (reactive getter) */\n readonly isLoggedIn: boolean;\n /** Current user info (reactive getter, null if not logged in) */\n readonly user: UserInfo | null;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// PRIMITIVE\n// =============================================================================\n\n/**\n * Solid.js primitive for checkout integration\n *\n * Returns an object with reactive getters for state and methods for actions.\n * Uses Solid's fine-grained reactivity - components only re-render when\n * accessed values change.\n *\n * @returns Checkout state (reactive getters) and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard(props) {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.addToCart(props.product.id, props.product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Create signals for each piece of state\n const initialState = checkoutStore.getState();\n\n const [isReady, setIsReady] = createSignal(initialState.isReady);\n const [isOpen, setIsOpen] = createSignal(initialState.isOpen);\n const [cartCount, setCartCount] = createSignal(initialState.cartCount);\n const [cartTotal, setCartTotal] = createSignal(initialState.cartTotal);\n const [cartCurrency, setCartCurrency] = createSignal(initialState.cartCurrency);\n const [isLoggedIn, setIsLoggedIn] = createSignal(initialState.isLoggedIn);\n const [user, setUser] = createSignal(initialState.user);\n\n // Subscribe to store changes\n const unsubscribe = checkoutStore.subscribe((state) => {\n setIsReady(state.isReady);\n setIsOpen(state.isOpen);\n setCartCount(state.cartCount);\n setCartTotal(state.cartTotal);\n setCartCurrency(state.cartCurrency);\n setIsLoggedIn(state.isLoggedIn);\n setUser(state.user);\n });\n\n // Cleanup on component unmount\n onCleanup(() => {\n unsubscribe();\n });\n\n // Return object with reactive getters\n return {\n get isReady() {\n return isReady();\n },\n get isOpen() {\n return isOpen();\n },\n get cartCount() {\n return cartCount();\n },\n get cartTotal() {\n return cartTotal();\n },\n get cartCurrency() {\n return cartCurrency();\n },\n get isLoggedIn() {\n return isLoggedIn();\n },\n get user() {\n return user();\n },\n openCart: () => checkoutStore.getState().openCart(),\n openCheckout: () => checkoutStore.getState().openCheckout(),\n close: () => checkoutStore.getState().close(),\n addToCart: (productId, variantId, quantity) =>\n checkoutStore.getState().addToCart(productId, variantId, quantity),\n updateTokens: (accessToken, refreshToken) =>\n checkoutStore.getState().updateTokens(accessToken, refreshToken),\n };\n}\n\n// =============================================================================\n// INDIVIDUAL SIGNALS (for fine-grained subscriptions)\n// =============================================================================\n\n/**\n * Create a reactive signal for cart count only\n *\n * Use this when you only need cart count and want minimal re-renders.\n *\n * @example\n * ```tsx\n * function Badge() {\n * const count = createCartCountSignal();\n * return <span class=\"badge\">{count()}</span>;\n * }\n * ```\n */\nexport function createCartCountSignal(): Accessor<number> {\n const [cartCount, setCartCount] = createSignal(checkoutStore.getState().cartCount);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.cartCount !== prevState.cartCount) {\n setCartCount(state.cartCount);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return cartCount;\n}\n\n/**\n * Create a reactive signal for ready state only\n */\nexport function createIsReadySignal(): Accessor<boolean> {\n const [isReady, setIsReady] = createSignal(checkoutStore.getState().isReady);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.isReady !== prevState.isReady) {\n setIsReady(state.isReady);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return isReady;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoJA,SAAgB,cAAiC;CAE/C,MAAM,eAAeA,4BAAc,UAAU;CAE7C,MAAM,CAAC,SAAS,yCAA2B,aAAa,QAAQ;CAChE,MAAM,CAAC,QAAQ,wCAA0B,aAAa,OAAO;CAC7D,MAAM,CAAC,WAAW,2CAA6B,aAAa,UAAU;CACtE,MAAM,CAAC,WAAW,2CAA6B,aAAa,UAAU;CACtE,MAAM,CAAC,cAAc,8CAAgC,aAAa,aAAa;CAC/E,MAAM,CAAC,YAAY,4CAA8B,aAAa,WAAW;CACzE,MAAM,CAAC,MAAM,sCAAwB,aAAa,KAAK;CAGvD,MAAM,cAAcA,4BAAc,WAAW,UAAU;AACrD,aAAW,MAAM,QAAQ;AACzB,YAAU,MAAM,OAAO;AACvB,eAAa,MAAM,UAAU;AAC7B,eAAa,MAAM,UAAU;AAC7B,kBAAgB,MAAM,aAAa;AACnC,gBAAc,MAAM,WAAW;AAC/B,UAAQ,MAAM,KAAK;GACnB;AAGF,+BAAgB;AACd,eAAa;GACb;AAGF,QAAO;EACL,IAAI,UAAU;AACZ,UAAO,SAAS;;EAElB,IAAI,SAAS;AACX,UAAO,QAAQ;;EAEjB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,eAAe;AACjB,UAAO,cAAc;;EAEvB,IAAI,aAAa;AACf,UAAO,YAAY;;EAErB,IAAI,OAAO;AACT,UAAO,MAAM;;EAEf,gBAAgBA,4BAAc,UAAU,CAAC,UAAU;EACnD,oBAAoBA,4BAAc,UAAU,CAAC,cAAc;EAC3D,aAAaA,4BAAc,UAAU,CAAC,OAAO;EAC7C,YAAY,WAAW,WAAW,aAChCA,4BAAc,UAAU,CAAC,UAAU,WAAW,WAAW,SAAS;EACpE,eAAe,aAAa,iBAC1BA,4BAAc,UAAU,CAAC,aAAa,aAAa,aAAa;EACnE;;;;;;;;;;;;;;;AAoBH,SAAgB,wBAA0C;CACxD,MAAM,CAAC,WAAW,2CAA6BA,4BAAc,UAAU,CAAC,UAAU;CAElF,MAAM,cAAcA,4BAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,cAAc,UAAU,UAChC,cAAa,MAAM,UAAU;GAE/B;AAEF,+BAAgB;AACd,eAAa;GACb;AAEF,QAAO;;;;;AAMT,SAAgB,sBAAyC;CACvD,MAAM,CAAC,SAAS,yCAA2BA,4BAAc,UAAU,CAAC,QAAQ;CAE5E,MAAM,cAAcA,4BAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,YAAY,UAAU,QAC9B,YAAW,MAAM,QAAQ;GAE3B;AAEF,+BAAgB;AACd,eAAa;GACb;AAEF,QAAO"}
package/dist/solid.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as destroyCheckout, c as subscribeToCheckout, i as checkoutStore, n as CheckoutState, o as getCheckout, r as CheckoutStore, s as initCheckout, t as CheckoutActions } from "./store.cjs";
2
- import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo } from "@commercengine/js";
2
+ import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo, UserInfo as UserInfo$1 } from "@commercengine/js";
3
3
  import { Accessor } from "solid-js";
4
4
 
5
5
  //#region src/solid.d.ts
@@ -21,6 +21,10 @@ interface UseCheckoutReturn {
21
21
  readonly cartTotal: number;
22
22
  /** Cart currency code (reactive getter) */
23
23
  readonly cartCurrency: string;
24
+ /** Whether user is logged in (reactive getter) */
25
+ readonly isLoggedIn: boolean;
26
+ /** Current user info (reactive getter, null if not logged in) */
27
+ readonly user: UserInfo$1 | null;
24
28
  /** Open the cart drawer */
25
29
  openCart: () => void;
26
30
  /** Open the checkout drawer directly */
@@ -1 +1 @@
1
- {"version":3,"file":"solid.d.cts","names":[],"sources":["../src/solid.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAiFiB,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8DD,WAAA,CAAA,GAAe;;;;;;;;;;;;;;iBAoEf,qBAAA,CAAA,GAAyB;;;;iBAmBzB,mBAAA,CAAA,GAAuB"}
1
+ {"version":3,"file":"solid.d.cts","names":[],"sources":["../src/solid.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAkFiB,iBAAA;;;;;;;;;;;;;;iBAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoDD,WAAA,CAAA,GAAe;;;;;;;;;;;;;;iBA8Ef,qBAAA,CAAA,GAAyB;;;;iBAmBzB,mBAAA,CAAA,GAAuB"}
package/dist/solid.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as destroyCheckout, c as subscribeToCheckout, i as checkoutStore, n as CheckoutState, o as getCheckout, r as CheckoutStore, s as initCheckout, t as CheckoutActions } from "./store.js";
2
- import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo } from "@commercengine/js";
2
+ import { AddToCartItem, AuthLoginData, AuthLogoutData, AuthMode, AuthRefreshData, CartData, Channel, CheckoutConfig, CheckoutEventType, Environment, ErrorData, LoginMethod, OrderData, QuickBuyConfig, SessionMode, UserInfo, UserInfo as UserInfo$1 } from "@commercengine/js";
3
3
  import { Accessor } from "solid-js";
4
4
 
5
5
  //#region src/solid.d.ts
@@ -21,6 +21,10 @@ interface UseCheckoutReturn {
21
21
  readonly cartTotal: number;
22
22
  /** Cart currency code (reactive getter) */
23
23
  readonly cartCurrency: string;
24
+ /** Whether user is logged in (reactive getter) */
25
+ readonly isLoggedIn: boolean;
26
+ /** Current user info (reactive getter, null if not logged in) */
27
+ readonly user: UserInfo$1 | null;
24
28
  /** Open the cart drawer */
25
29
  openCart: () => void;
26
30
  /** Open the checkout drawer directly */
@@ -1 +1 @@
1
- {"version":3,"file":"solid.d.ts","names":[],"sources":["../src/solid.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAiFiB,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8DD,WAAA,CAAA,GAAe;;;;;;;;;;;;;;iBAoEf,qBAAA,CAAA,GAAyB;;;;iBAmBzB,mBAAA,CAAA,GAAuB"}
1
+ {"version":3,"file":"solid.d.ts","names":[],"sources":["../src/solid.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAkFiB,iBAAA;;;;;;;;;;;;;;iBAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoDD,WAAA,CAAA,GAAe;;;;;;;;;;;;;;iBA8Ef,qBAAA,CAAA,GAAyB;;;;iBAmBzB,mBAAA,CAAA,GAAuB"}
package/dist/solid.js CHANGED
@@ -3,42 +3,6 @@ import { createSignal, onCleanup } from "solid-js";
3
3
 
4
4
  //#region src/solid.ts
5
5
  /**
6
- * Commerce Engine Checkout - Solid Binding
7
- *
8
- * Solid.js primitive for checkout integration with fine-grained reactivity.
9
- *
10
- * @example
11
- * ```tsx
12
- * import { useCheckout, initCheckout } from "@commercengine/checkout/solid";
13
- * import { onMount, onCleanup } from "solid-js";
14
- *
15
- * // Initialize once at app root
16
- * function App() {
17
- * onMount(() => {
18
- * initCheckout({
19
- * storeId: "store_xxx",
20
- * apiKey: "ak_xxx",
21
- * });
22
- * });
23
- *
24
- * return <>{props.children}</>;
25
- * }
26
- *
27
- * // Use anywhere
28
- * function Header() {
29
- * const checkout = useCheckout();
30
- *
31
- * return (
32
- * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>
33
- * Cart ({checkout.cartCount})
34
- * </button>
35
- * );
36
- * }
37
- * ```
38
- *
39
- * @packageDocumentation
40
- */
41
- /**
42
6
  * Solid.js primitive for checkout integration
43
7
  *
44
8
  * Returns an object with reactive getters for state and methods for actions.
@@ -80,12 +44,16 @@ function useCheckout() {
80
44
  const [cartCount, setCartCount] = createSignal(initialState.cartCount);
81
45
  const [cartTotal, setCartTotal] = createSignal(initialState.cartTotal);
82
46
  const [cartCurrency, setCartCurrency] = createSignal(initialState.cartCurrency);
47
+ const [isLoggedIn, setIsLoggedIn] = createSignal(initialState.isLoggedIn);
48
+ const [user, setUser] = createSignal(initialState.user);
83
49
  const unsubscribe = checkoutStore.subscribe((state) => {
84
50
  setIsReady(state.isReady);
85
51
  setIsOpen(state.isOpen);
86
52
  setCartCount(state.cartCount);
87
53
  setCartTotal(state.cartTotal);
88
54
  setCartCurrency(state.cartCurrency);
55
+ setIsLoggedIn(state.isLoggedIn);
56
+ setUser(state.user);
89
57
  });
90
58
  onCleanup(() => {
91
59
  unsubscribe();
@@ -106,6 +74,12 @@ function useCheckout() {
106
74
  get cartCurrency() {
107
75
  return cartCurrency();
108
76
  },
77
+ get isLoggedIn() {
78
+ return isLoggedIn();
79
+ },
80
+ get user() {
81
+ return user();
82
+ },
109
83
  openCart: () => checkoutStore.getState().openCart(),
110
84
  openCheckout: () => checkoutStore.getState().openCheckout(),
111
85
  close: () => checkoutStore.getState().close(),
package/dist/solid.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"solid.js","names":[],"sources":["../src/solid.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - Solid Binding\n *\n * Solid.js primitive for checkout integration with fine-grained reactivity.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/solid\";\n * import { onMount, onCleanup } from \"solid-js\";\n *\n * // Initialize once at app root\n * function App() {\n * onMount(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * });\n * });\n *\n * return <>{props.children}</>;\n * }\n *\n * // Use anywhere\n * function Header() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport { type Accessor, createSignal, onCleanup } from \"solid-js\";\nimport { checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout\n *\n * State properties are getters that return reactive values.\n * Actions are regular functions.\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use (reactive getter) */\n readonly isReady: boolean;\n /** Whether checkout overlay is currently open (reactive getter) */\n readonly isOpen: boolean;\n /** Number of items in cart (reactive getter) */\n readonly cartCount: number;\n /** Cart subtotal amount (reactive getter) */\n readonly cartTotal: number;\n /** Cart currency code (reactive getter) */\n readonly cartCurrency: string;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// PRIMITIVE\n// =============================================================================\n\n/**\n * Solid.js primitive for checkout integration\n *\n * Returns an object with reactive getters for state and methods for actions.\n * Uses Solid's fine-grained reactivity - components only re-render when\n * accessed values change.\n *\n * @returns Checkout state (reactive getters) and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard(props) {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.addToCart(props.product.id, props.product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Create signals for each piece of state\n const initialState = checkoutStore.getState();\n\n const [isReady, setIsReady] = createSignal(initialState.isReady);\n const [isOpen, setIsOpen] = createSignal(initialState.isOpen);\n const [cartCount, setCartCount] = createSignal(initialState.cartCount);\n const [cartTotal, setCartTotal] = createSignal(initialState.cartTotal);\n const [cartCurrency, setCartCurrency] = createSignal(initialState.cartCurrency);\n\n // Subscribe to store changes\n const unsubscribe = checkoutStore.subscribe((state) => {\n setIsReady(state.isReady);\n setIsOpen(state.isOpen);\n setCartCount(state.cartCount);\n setCartTotal(state.cartTotal);\n setCartCurrency(state.cartCurrency);\n });\n\n // Cleanup on component unmount\n onCleanup(() => {\n unsubscribe();\n });\n\n // Return object with reactive getters\n return {\n get isReady() {\n return isReady();\n },\n get isOpen() {\n return isOpen();\n },\n get cartCount() {\n return cartCount();\n },\n get cartTotal() {\n return cartTotal();\n },\n get cartCurrency() {\n return cartCurrency();\n },\n openCart: () => checkoutStore.getState().openCart(),\n openCheckout: () => checkoutStore.getState().openCheckout(),\n close: () => checkoutStore.getState().close(),\n addToCart: (productId, variantId, quantity) =>\n checkoutStore.getState().addToCart(productId, variantId, quantity),\n updateTokens: (accessToken, refreshToken) =>\n checkoutStore.getState().updateTokens(accessToken, refreshToken),\n };\n}\n\n// =============================================================================\n// INDIVIDUAL SIGNALS (for fine-grained subscriptions)\n// =============================================================================\n\n/**\n * Create a reactive signal for cart count only\n *\n * Use this when you only need cart count and want minimal re-renders.\n *\n * @example\n * ```tsx\n * function Badge() {\n * const count = createCartCountSignal();\n * return <span class=\"badge\">{count()}</span>;\n * }\n * ```\n */\nexport function createCartCountSignal(): Accessor<number> {\n const [cartCount, setCartCount] = createSignal(checkoutStore.getState().cartCount);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.cartCount !== prevState.cartCount) {\n setCartCount(state.cartCount);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return cartCount;\n}\n\n/**\n * Create a reactive signal for ready state only\n */\nexport function createIsReadySignal(): Accessor<boolean> {\n const [isReady, setIsReady] = createSignal(checkoutStore.getState().isReady);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.isReady !== prevState.isReady) {\n setIsReady(state.isReady);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return isReady;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+IA,SAAgB,cAAiC;CAE/C,MAAM,eAAe,cAAc,UAAU;CAE7C,MAAM,CAAC,SAAS,cAAc,aAAa,aAAa,QAAQ;CAChE,MAAM,CAAC,QAAQ,aAAa,aAAa,aAAa,OAAO;CAC7D,MAAM,CAAC,WAAW,gBAAgB,aAAa,aAAa,UAAU;CACtE,MAAM,CAAC,WAAW,gBAAgB,aAAa,aAAa,UAAU;CACtE,MAAM,CAAC,cAAc,mBAAmB,aAAa,aAAa,aAAa;CAG/E,MAAM,cAAc,cAAc,WAAW,UAAU;AACrD,aAAW,MAAM,QAAQ;AACzB,YAAU,MAAM,OAAO;AACvB,eAAa,MAAM,UAAU;AAC7B,eAAa,MAAM,UAAU;AAC7B,kBAAgB,MAAM,aAAa;GACnC;AAGF,iBAAgB;AACd,eAAa;GACb;AAGF,QAAO;EACL,IAAI,UAAU;AACZ,UAAO,SAAS;;EAElB,IAAI,SAAS;AACX,UAAO,QAAQ;;EAEjB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,eAAe;AACjB,UAAO,cAAc;;EAEvB,gBAAgB,cAAc,UAAU,CAAC,UAAU;EACnD,oBAAoB,cAAc,UAAU,CAAC,cAAc;EAC3D,aAAa,cAAc,UAAU,CAAC,OAAO;EAC7C,YAAY,WAAW,WAAW,aAChC,cAAc,UAAU,CAAC,UAAU,WAAW,WAAW,SAAS;EACpE,eAAe,aAAa,iBAC1B,cAAc,UAAU,CAAC,aAAa,aAAa,aAAa;EACnE;;;;;;;;;;;;;;;AAoBH,SAAgB,wBAA0C;CACxD,MAAM,CAAC,WAAW,gBAAgB,aAAa,cAAc,UAAU,CAAC,UAAU;CAElF,MAAM,cAAc,cAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,cAAc,UAAU,UAChC,cAAa,MAAM,UAAU;GAE/B;AAEF,iBAAgB;AACd,eAAa;GACb;AAEF,QAAO;;;;;AAMT,SAAgB,sBAAyC;CACvD,MAAM,CAAC,SAAS,cAAc,aAAa,cAAc,UAAU,CAAC,QAAQ;CAE5E,MAAM,cAAc,cAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,YAAY,UAAU,QAC9B,YAAW,MAAM,QAAQ;GAE3B;AAEF,iBAAgB;AACd,eAAa;GACb;AAEF,QAAO"}
1
+ {"version":3,"file":"solid.js","names":[],"sources":["../src/solid.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - Solid Binding\n *\n * Solid.js primitive for checkout integration with fine-grained reactivity.\n *\n * @example\n * ```tsx\n * import { useCheckout, initCheckout } from \"@commercengine/checkout/solid\";\n * import { onMount, onCleanup } from \"solid-js\";\n *\n * // Initialize once at app root\n * function App() {\n * onMount(() => {\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * });\n * });\n *\n * return <>{props.children}</>;\n * }\n *\n * // Use anywhere\n * function Header() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { UserInfo } from \"@commercengine/js\";\nimport { type Accessor, createSignal, onCleanup } from \"solid-js\";\nimport { checkoutStore } from \"./store\";\n\n// Re-export types from @commercengine/js\nexport type {\n AddToCartItem,\n AuthLoginData,\n AuthLogoutData,\n AuthMode,\n AuthRefreshData,\n CartData,\n Channel,\n CheckoutConfig,\n CheckoutEventType,\n Environment,\n ErrorData,\n LoginMethod,\n OrderData,\n QuickBuyConfig,\n SessionMode,\n UserInfo,\n} from \"@commercengine/js\";\n// Re-export everything from vanilla for convenience\nexport {\n type CheckoutActions,\n type CheckoutState,\n type CheckoutStore,\n checkoutStore,\n destroyCheckout,\n getCheckout,\n initCheckout,\n subscribeToCheckout,\n} from \"./store\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Return type from useCheckout\n *\n * State properties are getters that return reactive values.\n * Actions are regular functions.\n */\nexport interface UseCheckoutReturn {\n /** Whether checkout is ready to use (reactive getter) */\n readonly isReady: boolean;\n /** Whether checkout overlay is currently open (reactive getter) */\n readonly isOpen: boolean;\n /** Number of items in cart (reactive getter) */\n readonly cartCount: number;\n /** Cart subtotal amount (reactive getter) */\n readonly cartTotal: number;\n /** Cart currency code (reactive getter) */\n readonly cartCurrency: string;\n /** Whether user is logged in (reactive getter) */\n readonly isLoggedIn: boolean;\n /** Current user info (reactive getter, null if not logged in) */\n readonly user: UserInfo | null;\n /** Open the cart drawer */\n openCart: () => void;\n /** Open the checkout drawer directly */\n openCheckout: () => void;\n /** Close the checkout overlay */\n close: () => void;\n /** Add item to cart */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n /** Update authentication tokens */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n// =============================================================================\n// PRIMITIVE\n// =============================================================================\n\n/**\n * Solid.js primitive for checkout integration\n *\n * Returns an object with reactive getters for state and methods for actions.\n * Uses Solid's fine-grained reactivity - components only re-render when\n * accessed values change.\n *\n * @returns Checkout state (reactive getters) and methods\n *\n * @example Basic usage\n * ```tsx\n * function CartButton() {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.openCart()} disabled={!checkout.isReady}>\n * Cart ({checkout.cartCount})\n * </button>\n * );\n * }\n * ```\n *\n * @example Add to cart\n * ```tsx\n * function ProductCard(props) {\n * const checkout = useCheckout();\n *\n * return (\n * <button onClick={() => checkout.addToCart(props.product.id, props.product.variantId, 1)}>\n * Add to Cart\n * </button>\n * );\n * }\n * ```\n */\nexport function useCheckout(): UseCheckoutReturn {\n // Create signals for each piece of state\n const initialState = checkoutStore.getState();\n\n const [isReady, setIsReady] = createSignal(initialState.isReady);\n const [isOpen, setIsOpen] = createSignal(initialState.isOpen);\n const [cartCount, setCartCount] = createSignal(initialState.cartCount);\n const [cartTotal, setCartTotal] = createSignal(initialState.cartTotal);\n const [cartCurrency, setCartCurrency] = createSignal(initialState.cartCurrency);\n const [isLoggedIn, setIsLoggedIn] = createSignal(initialState.isLoggedIn);\n const [user, setUser] = createSignal(initialState.user);\n\n // Subscribe to store changes\n const unsubscribe = checkoutStore.subscribe((state) => {\n setIsReady(state.isReady);\n setIsOpen(state.isOpen);\n setCartCount(state.cartCount);\n setCartTotal(state.cartTotal);\n setCartCurrency(state.cartCurrency);\n setIsLoggedIn(state.isLoggedIn);\n setUser(state.user);\n });\n\n // Cleanup on component unmount\n onCleanup(() => {\n unsubscribe();\n });\n\n // Return object with reactive getters\n return {\n get isReady() {\n return isReady();\n },\n get isOpen() {\n return isOpen();\n },\n get cartCount() {\n return cartCount();\n },\n get cartTotal() {\n return cartTotal();\n },\n get cartCurrency() {\n return cartCurrency();\n },\n get isLoggedIn() {\n return isLoggedIn();\n },\n get user() {\n return user();\n },\n openCart: () => checkoutStore.getState().openCart(),\n openCheckout: () => checkoutStore.getState().openCheckout(),\n close: () => checkoutStore.getState().close(),\n addToCart: (productId, variantId, quantity) =>\n checkoutStore.getState().addToCart(productId, variantId, quantity),\n updateTokens: (accessToken, refreshToken) =>\n checkoutStore.getState().updateTokens(accessToken, refreshToken),\n };\n}\n\n// =============================================================================\n// INDIVIDUAL SIGNALS (for fine-grained subscriptions)\n// =============================================================================\n\n/**\n * Create a reactive signal for cart count only\n *\n * Use this when you only need cart count and want minimal re-renders.\n *\n * @example\n * ```tsx\n * function Badge() {\n * const count = createCartCountSignal();\n * return <span class=\"badge\">{count()}</span>;\n * }\n * ```\n */\nexport function createCartCountSignal(): Accessor<number> {\n const [cartCount, setCartCount] = createSignal(checkoutStore.getState().cartCount);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.cartCount !== prevState.cartCount) {\n setCartCount(state.cartCount);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return cartCount;\n}\n\n/**\n * Create a reactive signal for ready state only\n */\nexport function createIsReadySignal(): Accessor<boolean> {\n const [isReady, setIsReady] = createSignal(checkoutStore.getState().isReady);\n\n const unsubscribe = checkoutStore.subscribe((state, prevState) => {\n if (state.isReady !== prevState.isReady) {\n setIsReady(state.isReady);\n }\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return isReady;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoJA,SAAgB,cAAiC;CAE/C,MAAM,eAAe,cAAc,UAAU;CAE7C,MAAM,CAAC,SAAS,cAAc,aAAa,aAAa,QAAQ;CAChE,MAAM,CAAC,QAAQ,aAAa,aAAa,aAAa,OAAO;CAC7D,MAAM,CAAC,WAAW,gBAAgB,aAAa,aAAa,UAAU;CACtE,MAAM,CAAC,WAAW,gBAAgB,aAAa,aAAa,UAAU;CACtE,MAAM,CAAC,cAAc,mBAAmB,aAAa,aAAa,aAAa;CAC/E,MAAM,CAAC,YAAY,iBAAiB,aAAa,aAAa,WAAW;CACzE,MAAM,CAAC,MAAM,WAAW,aAAa,aAAa,KAAK;CAGvD,MAAM,cAAc,cAAc,WAAW,UAAU;AACrD,aAAW,MAAM,QAAQ;AACzB,YAAU,MAAM,OAAO;AACvB,eAAa,MAAM,UAAU;AAC7B,eAAa,MAAM,UAAU;AAC7B,kBAAgB,MAAM,aAAa;AACnC,gBAAc,MAAM,WAAW;AAC/B,UAAQ,MAAM,KAAK;GACnB;AAGF,iBAAgB;AACd,eAAa;GACb;AAGF,QAAO;EACL,IAAI,UAAU;AACZ,UAAO,SAAS;;EAElB,IAAI,SAAS;AACX,UAAO,QAAQ;;EAEjB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,YAAY;AACd,UAAO,WAAW;;EAEpB,IAAI,eAAe;AACjB,UAAO,cAAc;;EAEvB,IAAI,aAAa;AACf,UAAO,YAAY;;EAErB,IAAI,OAAO;AACT,UAAO,MAAM;;EAEf,gBAAgB,cAAc,UAAU,CAAC,UAAU;EACnD,oBAAoB,cAAc,UAAU,CAAC,cAAc;EAC3D,aAAa,cAAc,UAAU,CAAC,OAAO;EAC7C,YAAY,WAAW,WAAW,aAChC,cAAc,UAAU,CAAC,UAAU,WAAW,WAAW,SAAS;EACpE,eAAe,aAAa,iBAC1B,cAAc,UAAU,CAAC,aAAa,aAAa,aAAa;EACnE;;;;;;;;;;;;;;;AAoBH,SAAgB,wBAA0C;CACxD,MAAM,CAAC,WAAW,gBAAgB,aAAa,cAAc,UAAU,CAAC,UAAU;CAElF,MAAM,cAAc,cAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,cAAc,UAAU,UAChC,cAAa,MAAM,UAAU;GAE/B;AAEF,iBAAgB;AACd,eAAa;GACb;AAEF,QAAO;;;;;AAMT,SAAgB,sBAAyC;CACvD,MAAM,CAAC,SAAS,cAAc,aAAa,cAAc,UAAU,CAAC,QAAQ;CAE5E,MAAM,cAAc,cAAc,WAAW,OAAO,cAAc;AAChE,MAAI,MAAM,YAAY,UAAU,QAC9B,YAAW,MAAM,QAAQ;GAE3B;AAEF,iBAAgB;AACd,eAAa;GACb;AAEF,QAAO"}
package/dist/store.cjs CHANGED
@@ -32,7 +32,9 @@ const DEFAULT_STATE = {
32
32
  isOpen: false,
33
33
  cartCount: 0,
34
34
  cartTotal: 0,
35
- cartCurrency: "INR"
35
+ cartCurrency: "INR",
36
+ isLoggedIn: false,
37
+ user: null
36
38
  };
37
39
  /**
38
40
  * Vanilla Zustand store for checkout state
@@ -90,15 +92,27 @@ const checkoutStore = (0, zustand_vanilla.createStore)()((0, zustand_middleware.
90
92
  config.onComplete?.(order);
91
93
  },
92
94
  onLogin: (data) => {
95
+ if (data.user) set({
96
+ user: data.user,
97
+ isLoggedIn: data.user.isLoggedIn
98
+ });
93
99
  config.onLogin?.(data);
94
100
  },
95
101
  onLogout: (data) => {
102
+ set({
103
+ user: data.user ?? null,
104
+ isLoggedIn: false
105
+ });
96
106
  config.onLogout?.(data);
97
107
  },
98
108
  onTokenRefresh: (data) => {
99
109
  config.onTokenRefresh?.(data);
100
110
  },
101
111
  onSessionError: () => {
112
+ set({
113
+ user: null,
114
+ isLoggedIn: false
115
+ });
102
116
  config.onSessionError?.();
103
117
  },
104
118
  onError: (error) => {
@@ -185,6 +199,8 @@ function getCheckout() {
185
199
  cartCount: state.cartCount,
186
200
  cartTotal: state.cartTotal,
187
201
  cartCurrency: state.cartCurrency,
202
+ isLoggedIn: state.isLoggedIn,
203
+ user: state.user,
188
204
  openCart: state.openCart,
189
205
  openCheckout: state.openCheckout,
190
206
  close: state.close,
@@ -1 +1 @@
1
- {"version":3,"file":"store.cjs","names":["Checkout"],"sources":["../src/store.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - Universal Store\n *\n * Framework-agnostic state management using Zustand vanilla.\n * This is the core store that all framework bindings use.\n *\n * ## Architecture\n *\n * - **Singleton**: One store instance shared across all components/routes\n * - **Non-blocking**: Checkout iframe loads asynchronously in the background\n * - **SSR-safe**: Initialization is skipped on server, only runs on client\n * - **Zero CWV impact**: Hidden iframe, no layout shifts, no main thread blocking\n *\n * ## Lifecycle\n *\n * 1. `initCheckout()` creates a hidden iframe and returns immediately\n * 2. Iframe loads in background (non-blocking)\n * 3. `onReady` callback fires when checkout is ready\n * 4. `useCheckout()` can be called from any component to access state\n * 5. Same instance persists across route changes (SPA navigation)\n *\n * @commercengine/checkout\n */\n\nimport {\n type AuthLoginData,\n type AuthLogoutData,\n type AuthRefreshData,\n type CartData,\n Checkout,\n type CheckoutConfig,\n type ErrorData,\n type OrderData,\n} from \"@commercengine/js\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { createStore } from \"zustand/vanilla\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Checkout state\n */\nexport interface CheckoutState {\n /** Internal checkout instance */\n checkout: Checkout | null;\n /** Whether checkout is ready to use */\n isReady: boolean;\n /** Whether checkout overlay is currently open */\n isOpen: boolean;\n /** Number of items in cart */\n cartCount: number;\n /** Cart subtotal amount */\n cartTotal: number;\n /** Cart currency code */\n cartCurrency: string;\n}\n\n/**\n * Checkout actions\n */\nexport interface CheckoutActions {\n /**\n * Initialize checkout with configuration\n * Call this once at app startup\n */\n init: (config: CheckoutConfig) => void;\n\n /**\n * Destroy checkout instance and reset state\n */\n destroy: () => void;\n\n /**\n * Open the cart drawer\n */\n openCart: () => void;\n\n /**\n * Open the checkout drawer directly (for Buy Now flow)\n */\n openCheckout: () => void;\n\n /**\n * Close the checkout overlay\n */\n close: () => void;\n\n /**\n * Add item to cart\n * @param productId - Product ID (required)\n * @param variantId - Variant ID (required, null for non-variant products)\n * @param quantity - Quantity to add (default: 1)\n */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n\n /**\n * Update authentication tokens\n * Use this when user logs in/out on the parent site\n */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n/**\n * Complete checkout store type\n */\nexport type CheckoutStore = CheckoutState & CheckoutActions;\n\n// =============================================================================\n// DEFAULT STATE\n// =============================================================================\n\nconst DEFAULT_STATE: CheckoutState = {\n checkout: null,\n isReady: false,\n isOpen: false,\n cartCount: 0,\n cartTotal: 0,\n cartCurrency: \"INR\",\n};\n\n// =============================================================================\n// STORE\n// =============================================================================\n\n/**\n * Vanilla Zustand store for checkout state\n *\n * This is framework-agnostic and can be used directly or via framework bindings.\n *\n * @example Direct usage (vanilla JS)\n * ```ts\n * import { checkoutStore } from \"@commercengine/checkout\";\n *\n * // Initialize\n * checkoutStore.getState().init({ storeId: \"...\", apiKey: \"...\" });\n *\n * // Get current state\n * const { cartCount, isReady } = checkoutStore.getState();\n *\n * // Subscribe to changes\n * checkoutStore.subscribe((state) => {\n * console.log(\"Cart count:\", state.cartCount);\n * });\n *\n * // Call actions\n * checkoutStore.getState().openCart();\n * ```\n */\nexport const checkoutStore = createStore<CheckoutStore>()(\n subscribeWithSelector((set, get) => ({\n // State\n ...DEFAULT_STATE,\n\n // Actions\n init: (config) => {\n // Skip on server\n if (typeof window === \"undefined\") return;\n\n // Destroy existing instance if reinitializing\n const existing = get().checkout;\n if (existing) {\n existing.destroy();\n }\n\n // Create new checkout instance with callbacks that update store\n const checkout = new Checkout({\n ...config,\n onReady: () => {\n set({ isReady: true });\n config.onReady?.();\n },\n onOpen: () => {\n set({ isOpen: true });\n config.onOpen?.();\n },\n onClose: () => {\n set({ isOpen: false });\n config.onClose?.();\n },\n onCartUpdate: (cart: CartData) => {\n set({\n cartCount: cart.count,\n cartTotal: cart.total,\n cartCurrency: cart.currency,\n });\n config.onCartUpdate?.(cart);\n },\n onComplete: (order: OrderData) => {\n config.onComplete?.(order);\n },\n onLogin: (data: AuthLoginData) => {\n config.onLogin?.(data);\n },\n onLogout: (data: AuthLogoutData) => {\n config.onLogout?.(data);\n },\n onTokenRefresh: (data: AuthRefreshData) => {\n config.onTokenRefresh?.(data);\n },\n onSessionError: () => {\n config.onSessionError?.();\n },\n onError: (error: ErrorData) => {\n // Still set ready so buttons are enabled (error drawer will show)\n set({ isReady: true });\n config.onError?.(error);\n },\n });\n\n set({ checkout });\n },\n\n destroy: () => {\n const { checkout } = get();\n if (checkout) {\n checkout.destroy();\n }\n set(DEFAULT_STATE);\n },\n\n openCart: () => {\n get().checkout?.openCart();\n },\n\n openCheckout: () => {\n get().checkout?.openCheckout();\n },\n\n close: () => {\n get().checkout?.close();\n },\n\n addToCart: (productId, variantId, quantity) => {\n get().checkout?.addToCart(productId, variantId, quantity);\n },\n\n updateTokens: (accessToken, refreshToken) => {\n get().checkout?.updateTokens(accessToken, refreshToken);\n },\n }))\n);\n\n// =============================================================================\n// CONVENIENCE EXPORTS\n// =============================================================================\n\n/**\n * Initialize checkout\n *\n * @example\n * ```ts\n * import { initCheckout } from \"@commercengine/checkout\";\n *\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * onComplete: (order) => console.log(\"Order placed:\", order.orderNumber),\n * });\n * ```\n */\nexport function initCheckout(config: CheckoutConfig): void {\n checkoutStore.getState().init(config);\n}\n\n/**\n * Destroy checkout instance\n *\n * @example\n * ```ts\n * import { destroyCheckout } from \"@commercengine/checkout\";\n *\n * destroyCheckout();\n * ```\n */\nexport function destroyCheckout(): void {\n checkoutStore.getState().destroy();\n}\n\n/**\n * Get checkout state and methods (non-reactive)\n *\n * Use this outside of reactive frameworks or when you don't need reactivity.\n *\n * @example\n * ```ts\n * import { getCheckout } from \"@commercengine/checkout\";\n *\n * document.getElementById(\"cart-btn\").onclick = () => {\n * getCheckout().openCart();\n * };\n *\n * // Check state\n * if (getCheckout().isReady) {\n * console.log(\"Cart has\", getCheckout().cartCount, \"items\");\n * }\n * ```\n */\nexport function getCheckout(): Omit<CheckoutStore, \"checkout\" | \"init\" | \"destroy\"> {\n const state = checkoutStore.getState();\n return {\n isReady: state.isReady,\n isOpen: state.isOpen,\n cartCount: state.cartCount,\n cartTotal: state.cartTotal,\n cartCurrency: state.cartCurrency,\n openCart: state.openCart,\n openCheckout: state.openCheckout,\n close: state.close,\n addToCart: state.addToCart,\n updateTokens: state.updateTokens,\n };\n}\n\n/**\n * Subscribe to checkout state changes\n *\n * @example\n * ```ts\n * import { subscribeToCheckout } from \"@commercengine/checkout\";\n *\n * // Subscribe to all changes\n * const unsubscribe = subscribeToCheckout((state) => {\n * console.log(\"State changed:\", state);\n * });\n *\n * // Subscribe to specific state with selector\n * const unsubscribe = subscribeToCheckout(\n * (state) => state.cartCount,\n * (cartCount) => console.log(\"Cart count:\", cartCount)\n * );\n *\n * // Cleanup\n * unsubscribe();\n * ```\n */\nexport const subscribeToCheckout = checkoutStore.subscribe;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiHA,MAAM,gBAA+B;CACnC,UAAU;CACV,SAAS;CACT,QAAQ;CACR,WAAW;CACX,WAAW;CACX,cAAc;CACf;;;;;;;;;;;;;;;;;;;;;;;;;AA8BD,MAAa,kDAA4C,gDAChC,KAAK,SAAS;CAEnC,GAAG;CAGH,OAAO,WAAW;AAEhB,MAAI,OAAO,WAAW,YAAa;EAGnC,MAAM,WAAW,KAAK,CAAC;AACvB,MAAI,SACF,UAAS,SAAS;AAgDpB,MAAI,EAAE,UA5CW,IAAIA,2BAAS;GAC5B,GAAG;GACH,eAAe;AACb,QAAI,EAAE,SAAS,MAAM,CAAC;AACtB,WAAO,WAAW;;GAEpB,cAAc;AACZ,QAAI,EAAE,QAAQ,MAAM,CAAC;AACrB,WAAO,UAAU;;GAEnB,eAAe;AACb,QAAI,EAAE,QAAQ,OAAO,CAAC;AACtB,WAAO,WAAW;;GAEpB,eAAe,SAAmB;AAChC,QAAI;KACF,WAAW,KAAK;KAChB,WAAW,KAAK;KAChB,cAAc,KAAK;KACpB,CAAC;AACF,WAAO,eAAe,KAAK;;GAE7B,aAAa,UAAqB;AAChC,WAAO,aAAa,MAAM;;GAE5B,UAAU,SAAwB;AAChC,WAAO,UAAU,KAAK;;GAExB,WAAW,SAAyB;AAClC,WAAO,WAAW,KAAK;;GAEzB,iBAAiB,SAA0B;AACzC,WAAO,iBAAiB,KAAK;;GAE/B,sBAAsB;AACpB,WAAO,kBAAkB;;GAE3B,UAAU,UAAqB;AAE7B,QAAI,EAAE,SAAS,MAAM,CAAC;AACtB,WAAO,UAAU,MAAM;;GAE1B,CAAC,EAEc,CAAC;;CAGnB,eAAe;EACb,MAAM,EAAE,aAAa,KAAK;AAC1B,MAAI,SACF,UAAS,SAAS;AAEpB,MAAI,cAAc;;CAGpB,gBAAgB;AACd,OAAK,CAAC,UAAU,UAAU;;CAG5B,oBAAoB;AAClB,OAAK,CAAC,UAAU,cAAc;;CAGhC,aAAa;AACX,OAAK,CAAC,UAAU,OAAO;;CAGzB,YAAY,WAAW,WAAW,aAAa;AAC7C,OAAK,CAAC,UAAU,UAAU,WAAW,WAAW,SAAS;;CAG3D,eAAe,aAAa,iBAAiB;AAC3C,OAAK,CAAC,UAAU,aAAa,aAAa,aAAa;;CAE1D,EAAE,CACJ;;;;;;;;;;;;;;;AAoBD,SAAgB,aAAa,QAA8B;AACzD,eAAc,UAAU,CAAC,KAAK,OAAO;;;;;;;;;;;;AAavC,SAAgB,kBAAwB;AACtC,eAAc,UAAU,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;AAsBpC,SAAgB,cAAoE;CAClF,MAAM,QAAQ,cAAc,UAAU;AACtC,QAAO;EACL,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,cAAc,MAAM;EACpB,UAAU,MAAM;EAChB,cAAc,MAAM;EACpB,OAAO,MAAM;EACb,WAAW,MAAM;EACjB,cAAc,MAAM;EACrB;;;;;;;;;;;;;;;;;;;;;;;;AAyBH,MAAa,sBAAsB,cAAc"}
1
+ {"version":3,"file":"store.cjs","names":["Checkout"],"sources":["../src/store.ts"],"sourcesContent":["/**\n * Commerce Engine Checkout - Universal Store\n *\n * Framework-agnostic state management using Zustand vanilla.\n * This is the core store that all framework bindings use.\n *\n * ## Architecture\n *\n * - **Singleton**: One store instance shared across all components/routes\n * - **Non-blocking**: Checkout iframe loads asynchronously in the background\n * - **SSR-safe**: Initialization is skipped on server, only runs on client\n * - **Zero CWV impact**: Hidden iframe, no layout shifts, no main thread blocking\n *\n * ## Lifecycle\n *\n * 1. `initCheckout()` creates a hidden iframe and returns immediately\n * 2. Iframe loads in background (non-blocking)\n * 3. `onReady` callback fires when checkout is ready\n * 4. `useCheckout()` can be called from any component to access state\n * 5. Same instance persists across route changes (SPA navigation)\n *\n * @commercengine/checkout\n */\n\nimport {\n type AuthLoginData,\n type AuthLogoutData,\n type AuthRefreshData,\n type CartData,\n Checkout,\n type CheckoutConfig,\n type ErrorData,\n type OrderData,\n type UserInfo,\n} from \"@commercengine/js\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { createStore } from \"zustand/vanilla\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Checkout state\n */\nexport interface CheckoutState {\n /** Internal checkout instance */\n checkout: Checkout | null;\n /** Whether checkout is ready to use */\n isReady: boolean;\n /** Whether checkout overlay is currently open */\n isOpen: boolean;\n /** Number of items in cart */\n cartCount: number;\n /** Cart subtotal amount */\n cartTotal: number;\n /** Cart currency code */\n cartCurrency: string;\n /** Whether user is logged in */\n isLoggedIn: boolean;\n /** Current user info (null if not logged in) */\n user: UserInfo | null;\n}\n\n/**\n * Checkout actions\n */\nexport interface CheckoutActions {\n /**\n * Initialize checkout with configuration\n * Call this once at app startup\n */\n init: (config: CheckoutConfig) => void;\n\n /**\n * Destroy checkout instance and reset state\n */\n destroy: () => void;\n\n /**\n * Open the cart drawer\n */\n openCart: () => void;\n\n /**\n * Open the checkout drawer directly (for Buy Now flow)\n */\n openCheckout: () => void;\n\n /**\n * Close the checkout overlay\n */\n close: () => void;\n\n /**\n * Add item to cart\n * @param productId - Product ID (required)\n * @param variantId - Variant ID (required, null for non-variant products)\n * @param quantity - Quantity to add (default: 1)\n */\n addToCart: (productId: string, variantId: string | null, quantity?: number) => void;\n\n /**\n * Update authentication tokens\n * Use this when user logs in/out on the parent site\n */\n updateTokens: (accessToken: string, refreshToken?: string) => void;\n}\n\n/**\n * Complete checkout store type\n */\nexport type CheckoutStore = CheckoutState & CheckoutActions;\n\n// =============================================================================\n// DEFAULT STATE\n// =============================================================================\n\nconst DEFAULT_STATE: CheckoutState = {\n checkout: null,\n isReady: false,\n isOpen: false,\n cartCount: 0,\n cartTotal: 0,\n cartCurrency: \"INR\",\n isLoggedIn: false,\n user: null,\n};\n\n// =============================================================================\n// STORE\n// =============================================================================\n\n/**\n * Vanilla Zustand store for checkout state\n *\n * This is framework-agnostic and can be used directly or via framework bindings.\n *\n * @example Direct usage (vanilla JS)\n * ```ts\n * import { checkoutStore } from \"@commercengine/checkout\";\n *\n * // Initialize\n * checkoutStore.getState().init({ storeId: \"...\", apiKey: \"...\" });\n *\n * // Get current state\n * const { cartCount, isReady } = checkoutStore.getState();\n *\n * // Subscribe to changes\n * checkoutStore.subscribe((state) => {\n * console.log(\"Cart count:\", state.cartCount);\n * });\n *\n * // Call actions\n * checkoutStore.getState().openCart();\n * ```\n */\nexport const checkoutStore = createStore<CheckoutStore>()(\n subscribeWithSelector((set, get) => ({\n // State\n ...DEFAULT_STATE,\n\n // Actions\n init: (config) => {\n // Skip on server\n if (typeof window === \"undefined\") return;\n\n // Destroy existing instance if reinitializing\n const existing = get().checkout;\n if (existing) {\n existing.destroy();\n }\n\n // Create new checkout instance with callbacks that update store\n const checkout = new Checkout({\n ...config,\n onReady: () => {\n set({ isReady: true });\n config.onReady?.();\n },\n onOpen: () => {\n set({ isOpen: true });\n config.onOpen?.();\n },\n onClose: () => {\n set({ isOpen: false });\n config.onClose?.();\n },\n onCartUpdate: (cart: CartData) => {\n set({\n cartCount: cart.count,\n cartTotal: cart.total,\n cartCurrency: cart.currency,\n });\n config.onCartUpdate?.(cart);\n },\n onComplete: (order: OrderData) => {\n config.onComplete?.(order);\n },\n onLogin: (data: AuthLoginData) => {\n if (data.user) {\n set({ user: data.user, isLoggedIn: data.user.isLoggedIn });\n }\n config.onLogin?.(data);\n },\n onLogout: (data: AuthLogoutData) => {\n // On logout, user becomes anonymous\n set({ user: data.user ?? null, isLoggedIn: false });\n config.onLogout?.(data);\n },\n onTokenRefresh: (data: AuthRefreshData) => {\n config.onTokenRefresh?.(data);\n },\n onSessionError: () => {\n // Session corrupted - clear user state\n set({ user: null, isLoggedIn: false });\n config.onSessionError?.();\n },\n onError: (error: ErrorData) => {\n // Still set ready so buttons are enabled (error drawer will show)\n set({ isReady: true });\n config.onError?.(error);\n },\n });\n\n set({ checkout });\n },\n\n destroy: () => {\n const { checkout } = get();\n if (checkout) {\n checkout.destroy();\n }\n set(DEFAULT_STATE);\n },\n\n openCart: () => {\n get().checkout?.openCart();\n },\n\n openCheckout: () => {\n get().checkout?.openCheckout();\n },\n\n close: () => {\n get().checkout?.close();\n },\n\n addToCart: (productId, variantId, quantity) => {\n get().checkout?.addToCart(productId, variantId, quantity);\n },\n\n updateTokens: (accessToken, refreshToken) => {\n get().checkout?.updateTokens(accessToken, refreshToken);\n },\n }))\n);\n\n// =============================================================================\n// CONVENIENCE EXPORTS\n// =============================================================================\n\n/**\n * Initialize checkout\n *\n * @example\n * ```ts\n * import { initCheckout } from \"@commercengine/checkout\";\n *\n * initCheckout({\n * storeId: \"store_xxx\",\n * apiKey: \"ak_xxx\",\n * onComplete: (order) => console.log(\"Order placed:\", order.orderNumber),\n * });\n * ```\n */\nexport function initCheckout(config: CheckoutConfig): void {\n checkoutStore.getState().init(config);\n}\n\n/**\n * Destroy checkout instance\n *\n * @example\n * ```ts\n * import { destroyCheckout } from \"@commercengine/checkout\";\n *\n * destroyCheckout();\n * ```\n */\nexport function destroyCheckout(): void {\n checkoutStore.getState().destroy();\n}\n\n/**\n * Get checkout state and methods (non-reactive)\n *\n * Use this outside of reactive frameworks or when you don't need reactivity.\n *\n * @example\n * ```ts\n * import { getCheckout } from \"@commercengine/checkout\";\n *\n * document.getElementById(\"cart-btn\").onclick = () => {\n * getCheckout().openCart();\n * };\n *\n * // Check state\n * if (getCheckout().isReady) {\n * console.log(\"Cart has\", getCheckout().cartCount, \"items\");\n * }\n * ```\n */\nexport function getCheckout(): Omit<CheckoutStore, \"checkout\" | \"init\" | \"destroy\"> {\n const state = checkoutStore.getState();\n return {\n isReady: state.isReady,\n isOpen: state.isOpen,\n cartCount: state.cartCount,\n cartTotal: state.cartTotal,\n cartCurrency: state.cartCurrency,\n isLoggedIn: state.isLoggedIn,\n user: state.user,\n openCart: state.openCart,\n openCheckout: state.openCheckout,\n close: state.close,\n addToCart: state.addToCart,\n updateTokens: state.updateTokens,\n };\n}\n\n/**\n * Subscribe to checkout state changes\n *\n * @example\n * ```ts\n * import { subscribeToCheckout } from \"@commercengine/checkout\";\n *\n * // Subscribe to all changes\n * const unsubscribe = subscribeToCheckout((state) => {\n * console.log(\"State changed:\", state);\n * });\n *\n * // Subscribe to specific state with selector\n * const unsubscribe = subscribeToCheckout(\n * (state) => state.cartCount,\n * (cartCount) => console.log(\"Cart count:\", cartCount)\n * );\n *\n * // Cleanup\n * unsubscribe();\n * ```\n */\nexport const subscribeToCheckout = checkoutStore.subscribe;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsHA,MAAM,gBAA+B;CACnC,UAAU;CACV,SAAS;CACT,QAAQ;CACR,WAAW;CACX,WAAW;CACX,cAAc;CACd,YAAY;CACZ,MAAM;CACP;;;;;;;;;;;;;;;;;;;;;;;;;AA8BD,MAAa,kDAA4C,gDAChC,KAAK,SAAS;CAEnC,GAAG;CAGH,OAAO,WAAW;AAEhB,MAAI,OAAO,WAAW,YAAa;EAGnC,MAAM,WAAW,KAAK,CAAC;AACvB,MAAI,SACF,UAAS,SAAS;AAuDpB,MAAI,EAAE,UAnDW,IAAIA,2BAAS;GAC5B,GAAG;GACH,eAAe;AACb,QAAI,EAAE,SAAS,MAAM,CAAC;AACtB,WAAO,WAAW;;GAEpB,cAAc;AACZ,QAAI,EAAE,QAAQ,MAAM,CAAC;AACrB,WAAO,UAAU;;GAEnB,eAAe;AACb,QAAI,EAAE,QAAQ,OAAO,CAAC;AACtB,WAAO,WAAW;;GAEpB,eAAe,SAAmB;AAChC,QAAI;KACF,WAAW,KAAK;KAChB,WAAW,KAAK;KAChB,cAAc,KAAK;KACpB,CAAC;AACF,WAAO,eAAe,KAAK;;GAE7B,aAAa,UAAqB;AAChC,WAAO,aAAa,MAAM;;GAE5B,UAAU,SAAwB;AAChC,QAAI,KAAK,KACP,KAAI;KAAE,MAAM,KAAK;KAAM,YAAY,KAAK,KAAK;KAAY,CAAC;AAE5D,WAAO,UAAU,KAAK;;GAExB,WAAW,SAAyB;AAElC,QAAI;KAAE,MAAM,KAAK,QAAQ;KAAM,YAAY;KAAO,CAAC;AACnD,WAAO,WAAW,KAAK;;GAEzB,iBAAiB,SAA0B;AACzC,WAAO,iBAAiB,KAAK;;GAE/B,sBAAsB;AAEpB,QAAI;KAAE,MAAM;KAAM,YAAY;KAAO,CAAC;AACtC,WAAO,kBAAkB;;GAE3B,UAAU,UAAqB;AAE7B,QAAI,EAAE,SAAS,MAAM,CAAC;AACtB,WAAO,UAAU,MAAM;;GAE1B,CAAC,EAEc,CAAC;;CAGnB,eAAe;EACb,MAAM,EAAE,aAAa,KAAK;AAC1B,MAAI,SACF,UAAS,SAAS;AAEpB,MAAI,cAAc;;CAGpB,gBAAgB;AACd,OAAK,CAAC,UAAU,UAAU;;CAG5B,oBAAoB;AAClB,OAAK,CAAC,UAAU,cAAc;;CAGhC,aAAa;AACX,OAAK,CAAC,UAAU,OAAO;;CAGzB,YAAY,WAAW,WAAW,aAAa;AAC7C,OAAK,CAAC,UAAU,UAAU,WAAW,WAAW,SAAS;;CAG3D,eAAe,aAAa,iBAAiB;AAC3C,OAAK,CAAC,UAAU,aAAa,aAAa,aAAa;;CAE1D,EAAE,CACJ;;;;;;;;;;;;;;;AAoBD,SAAgB,aAAa,QAA8B;AACzD,eAAc,UAAU,CAAC,KAAK,OAAO;;;;;;;;;;;;AAavC,SAAgB,kBAAwB;AACtC,eAAc,UAAU,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;AAsBpC,SAAgB,cAAoE;CAClF,MAAM,QAAQ,cAAc,UAAU;AACtC,QAAO;EACL,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,cAAc,MAAM;EACpB,YAAY,MAAM;EAClB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,cAAc,MAAM;EACpB,OAAO,MAAM;EACb,WAAW,MAAM;EACjB,cAAc,MAAM;EACrB;;;;;;;;;;;;;;;;;;;;;;;;AAyBH,MAAa,sBAAsB,cAAc"}