@payloadcms/plugin-ecommerce 3.57.0-internal.d758c66 → 3.57.0-internal.f26caed

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/collections/addresses/createAddressesCollection.d.ts +1 -1
  2. package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -1
  3. package/dist/collections/addresses/createAddressesCollection.js.map +1 -1
  4. package/dist/collections/addresses/defaultCountries.d.ts +1 -1
  5. package/dist/collections/addresses/defaultCountries.d.ts.map +1 -1
  6. package/dist/collections/addresses/defaultCountries.js.map +1 -1
  7. package/dist/collections/addresses/hooks/beforeChange.d.ts +1 -1
  8. package/dist/collections/addresses/hooks/beforeChange.d.ts.map +1 -1
  9. package/dist/collections/addresses/hooks/beforeChange.js.map +1 -1
  10. package/dist/collections/carts/createCartsCollection.d.ts +1 -1
  11. package/dist/collections/carts/createCartsCollection.d.ts.map +1 -1
  12. package/dist/collections/carts/createCartsCollection.js.map +1 -1
  13. package/dist/collections/orders/createOrdersCollection.d.ts +1 -1
  14. package/dist/collections/orders/createOrdersCollection.d.ts.map +1 -1
  15. package/dist/collections/orders/createOrdersCollection.js.map +1 -1
  16. package/dist/collections/products/createProductsCollection.d.ts +1 -1
  17. package/dist/collections/products/createProductsCollection.d.ts.map +1 -1
  18. package/dist/collections/products/createProductsCollection.js.map +1 -1
  19. package/dist/collections/transactions/createTransactionsCollection.d.ts +1 -1
  20. package/dist/collections/transactions/createTransactionsCollection.d.ts.map +1 -1
  21. package/dist/collections/transactions/createTransactionsCollection.js.map +1 -1
  22. package/dist/collections/variants/createVariantOptionsCollection.d.ts +1 -1
  23. package/dist/collections/variants/createVariantOptionsCollection.d.ts.map +1 -1
  24. package/dist/collections/variants/createVariantOptionsCollection.js.map +1 -1
  25. package/dist/collections/variants/createVariantTypesCollection.d.ts +1 -1
  26. package/dist/collections/variants/createVariantTypesCollection.d.ts.map +1 -1
  27. package/dist/collections/variants/createVariantTypesCollection.js.map +1 -1
  28. package/dist/collections/variants/createVariantsCollection/index.d.ts +1 -1
  29. package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -1
  30. package/dist/collections/variants/createVariantsCollection/index.js.map +1 -1
  31. package/dist/currencies/index.d.ts +1 -1
  32. package/dist/currencies/index.d.ts.map +1 -1
  33. package/dist/currencies/index.js.map +1 -1
  34. package/dist/endpoints/confirmOrder.d.ts +1 -1
  35. package/dist/endpoints/confirmOrder.d.ts.map +1 -1
  36. package/dist/endpoints/confirmOrder.js.map +1 -1
  37. package/dist/endpoints/initiatePayment.d.ts +1 -1
  38. package/dist/endpoints/initiatePayment.d.ts.map +1 -1
  39. package/dist/endpoints/initiatePayment.js.map +1 -1
  40. package/dist/exports/types.d.ts +1 -1
  41. package/dist/exports/types.d.ts.map +1 -1
  42. package/dist/exports/types.js.map +1 -1
  43. package/dist/fields/amountField.d.ts +1 -1
  44. package/dist/fields/amountField.d.ts.map +1 -1
  45. package/dist/fields/amountField.js.map +1 -1
  46. package/dist/fields/cartItemsField.d.ts +1 -1
  47. package/dist/fields/cartItemsField.d.ts.map +1 -1
  48. package/dist/fields/cartItemsField.js.map +1 -1
  49. package/dist/fields/currencyField.d.ts +1 -1
  50. package/dist/fields/currencyField.d.ts.map +1 -1
  51. package/dist/fields/currencyField.js.map +1 -1
  52. package/dist/fields/pricesField.d.ts +1 -1
  53. package/dist/fields/pricesField.d.ts.map +1 -1
  54. package/dist/fields/pricesField.js.map +1 -1
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +3 -13
  58. package/dist/index.js.map +1 -1
  59. package/dist/payments/adapters/stripe/confirmOrder.d.ts +1 -1
  60. package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -1
  61. package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
  62. package/dist/payments/adapters/stripe/index.d.ts +1 -1
  63. package/dist/payments/adapters/stripe/index.d.ts.map +1 -1
  64. package/dist/payments/adapters/stripe/index.js.map +1 -1
  65. package/dist/payments/adapters/stripe/initiatePayment.d.ts +1 -1
  66. package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -1
  67. package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -1
  68. package/dist/react/provider/index.d.ts +10 -15
  69. package/dist/react/provider/index.d.ts.map +1 -1
  70. package/dist/react/provider/index.js +22 -21
  71. package/dist/react/provider/index.js.map +1 -1
  72. package/dist/react/provider/types.d.ts +172 -0
  73. package/dist/react/provider/types.d.ts.map +1 -0
  74. package/dist/react/provider/types.js +3 -0
  75. package/dist/react/provider/types.js.map +1 -0
  76. package/dist/react/provider/utilities.d.ts +1 -1
  77. package/dist/react/provider/utilities.d.ts.map +1 -1
  78. package/dist/react/provider/utilities.js.map +1 -1
  79. package/dist/{types/index.d.ts → types.d.ts} +2 -177
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +3 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/ui/PriceCell/index.d.ts +1 -1
  84. package/dist/ui/PriceCell/index.d.ts.map +1 -1
  85. package/dist/ui/PriceCell/index.js.map +1 -1
  86. package/dist/ui/PriceInput/FormattedInput.d.ts +1 -1
  87. package/dist/ui/PriceInput/FormattedInput.d.ts.map +1 -1
  88. package/dist/ui/PriceInput/FormattedInput.js.map +1 -1
  89. package/dist/ui/PriceInput/index.d.ts +1 -1
  90. package/dist/ui/PriceInput/index.d.ts.map +1 -1
  91. package/dist/ui/PriceInput/index.js.map +1 -1
  92. package/dist/ui/PriceRowLabel/index.d.ts +1 -1
  93. package/dist/ui/PriceRowLabel/index.d.ts.map +1 -1
  94. package/dist/ui/PriceRowLabel/index.js.map +1 -1
  95. package/dist/ui/utilities.d.ts +1 -1
  96. package/dist/ui/utilities.d.ts.map +1 -1
  97. package/dist/ui/utilities.js.map +1 -1
  98. package/dist/utilities/defaultProductsValidation.d.ts +1 -1
  99. package/dist/utilities/defaultProductsValidation.d.ts.map +1 -1
  100. package/dist/utilities/defaultProductsValidation.js.map +1 -1
  101. package/dist/utilities/getCollectionSlugMap.d.ts +1 -1
  102. package/dist/utilities/getCollectionSlugMap.d.ts.map +1 -1
  103. package/dist/utilities/getCollectionSlugMap.js +4 -5
  104. package/dist/utilities/getCollectionSlugMap.js.map +1 -1
  105. package/dist/utilities/sanitizePluginConfig.d.ts +1 -1
  106. package/dist/utilities/sanitizePluginConfig.d.ts.map +1 -1
  107. package/dist/utilities/sanitizePluginConfig.js.map +1 -1
  108. package/package.json +9 -10
  109. package/dist/types/index.d.ts.map +0 -1
  110. package/dist/types/index.js +0 -3
  111. package/dist/types/index.js.map +0 -1
  112. package/dist/types/utilities.d.ts +0 -36
  113. package/dist/types/utilities.d.ts.map +0 -1
  114. package/dist/types/utilities.js +0 -3
  115. package/dist/types/utilities.js.map +0 -1
  116. package/dist/utilities/pushTypeScriptProperties.d.ts +0 -10
  117. package/dist/utilities/pushTypeScriptProperties.d.ts.map +0 -1
  118. package/dist/utilities/pushTypeScriptProperties.js +0 -40
  119. package/dist/utilities/pushTypeScriptProperties.js.map +0 -1
@@ -1,6 +1,7 @@
1
- import type { DefaultDocumentIDType } from 'payload';
1
+ import type { DefaultDocumentIDType, TypedCollection } from 'payload';
2
2
  import React from 'react';
3
- import type { AddressesCollection, CartsCollection, ContextProps, Currency, EcommerceContextType } from '../../types/index.js';
3
+ import type { Currency } from '../../types.js';
4
+ import type { ContextProps, EcommerceContext as EcommerceContextType } from './types.js';
4
5
  export declare const EcommerceProvider: React.FC<ContextProps>;
5
6
  export declare const useEcommerce: () => EcommerceContextType;
6
7
  export declare const useCurrency: () => {
@@ -11,12 +12,12 @@ export declare const useCurrency: () => {
11
12
  setCurrency: (currency: string) => void;
12
13
  supportedCurrencies: Currency[];
13
14
  };
14
- export declare function useCart<T extends CartsCollection>(): {
15
+ export declare const useCart: () => {
15
16
  addItem: (item: {
16
17
  product: DefaultDocumentIDType;
17
18
  variant?: DefaultDocumentIDType;
18
19
  }, quantity?: number) => Promise<void>;
19
- cart: T;
20
+ cart: any;
20
21
  clearCart: () => Promise<void>;
21
22
  decrementItem: (item: DefaultDocumentIDType) => Promise<void>;
22
23
  incrementItem: (item: DefaultDocumentIDType) => Promise<void>;
@@ -29,18 +30,12 @@ export declare const usePayments: () => {
29
30
  initiatePayment: (paymentMethodID: string, options?: {
30
31
  additionalData: Record<string, unknown>;
31
32
  }) => Promise<unknown>;
32
- paymentMethods: import("../../types/index.js").PaymentAdapterClient[];
33
+ paymentMethods: import("../../types.js").PaymentAdapterClient[];
33
34
  selectedPaymentMethod: string | null | undefined;
34
35
  };
35
- export declare function useAddresses<T extends AddressesCollection>(): {
36
- addresses: T[];
37
- createAddress: (data: Partial<{
38
- [key: string]: any;
39
- id: DefaultDocumentIDType;
40
- }>) => Promise<void>;
41
- updateAddress: (addressID: DefaultDocumentIDType, data: Partial<{
42
- [key: string]: any;
43
- id: DefaultDocumentIDType;
44
- }>) => Promise<void>;
36
+ export declare const useAddresses: () => {
37
+ addresses: (import("payload").JsonObject & import("payload").TypeWithID)[] | undefined;
38
+ createAddress: (data: Partial<TypedCollection["addresses"]>) => Promise<void>;
39
+ updateAddress: (addressID: DefaultDocumentIDType, data: Partial<TypedCollection["addresses"]>) => Promise<void>;
45
40
  };
46
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/provider/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAa,MAAM,SAAS,CAAA;AAI/D,OAAO,KAAgF,MAAM,OAAO,CAAA;AAEpG,OAAO,KAAK,EACV,mBAAmB,EAEnB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,oBAAoB,EACrB,MAAM,sBAAsB,CAAA;AAwC7B,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAwvBpD,CAAA;AAED,eAAO,MAAM,YAAY,4BAQxB,CAAA;AAED,eAAO,MAAM,WAAW;;6BAIX,IAAI,GAAG,MAAM,YAAY;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;KAAE,KAAG,MAAM;;;CAkCrE,CAAA;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,eAAe;;;;;UAOf,CAAC;;;;;EAClC;AAED,eAAO,MAAM,WAAW;;;;;;;;;CAQvB,CAAA;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,mBAAmB;eAOvB,CAAC,EAAE;;;;;;;;;EACrC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/provider/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAa,MAAM,SAAS,CAAA;AAIhF,OAAO,KAAgF,MAAM,OAAO,CAAA;AAEpG,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AA0CxF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAyvBpD,CAAA;AAED,eAAO,MAAM,YAAY,4BAQxB,CAAA;AAED,eAAO,MAAM,WAAW;;6BAIX,IAAI,GAAG,MAAM,YAAY;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;KAAE,KAAG,MAAM;;;CAkCrE,CAAA;AAED,eAAO,MAAM,OAAO;;;;;;;;;;CAQnB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;CAQvB,CAAA;AAED,eAAO,MAAM,YAAY;;;;CAQxB,CAAA"}
@@ -62,6 +62,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
62
62
  * This is used to identify the cart in the database or local storage.
63
63
  * It can be null if no cart has been created yet.
64
64
  */ const [cartID, setCartID] = useState();
65
+ // @ts-ignore
65
66
  const [cart, setCart] = useState();
66
67
  const [selectedCurrency, setSelectedCurrency] = useState(()=>currenciesConfig.supportedCurrencies.find((c)=>c.code === currenciesConfig.defaultCurrency));
67
68
  const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);
@@ -201,14 +202,14 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
201
202
  return;
202
203
  }
203
204
  // Check if the item already exists in the cart
204
- const existingItemIndex = existingCart.items?.findIndex((cartItem)=>{
205
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>{
205
206
  const productID = typeof cartItem.product === 'object' ? cartItem.product.id : item.product;
206
207
  const variantID = cartItem.variant && typeof cartItem.variant === 'object' ? cartItem.variant.id : item.variant;
207
208
  return productID === item.product && (item.variant && variantID ? variantID === item.variant : true);
208
- }) ?? -1;
209
- let updatedItems = existingCart.items ? [
209
+ });
210
+ let updatedItems = [
210
211
  ...existingCart.items
211
- ] : [];
212
+ ];
212
213
  if (existingItemIndex !== -1) {
213
214
  // If the item exists, update its quantity
214
215
  updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity + quantity;
@@ -219,7 +220,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
219
220
  } else {
220
221
  // If the item does not exist, add it to the cart
221
222
  updatedItems = [
222
- ...existingCart.items ?? [],
223
+ ...existingCart.items,
223
224
  {
224
225
  ...item,
225
226
  quantity
@@ -261,12 +262,12 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
261
262
  return;
262
263
  }
263
264
  // Check if the item already exists in the cart
264
- const existingItemIndex = existingCart.items?.findIndex((cartItem)=>cartItem.id === targetID) ?? -1;
265
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>cartItem.id === targetID);
265
266
  if (existingItemIndex !== -1) {
266
267
  // If the item exists, remove it from the cart
267
- const updatedItems = existingCart.items ? [
268
+ const updatedItems = [
268
269
  ...existingCart.items
269
- ] : [];
270
+ ];
270
271
  updatedItems.splice(existingItemIndex, 1);
271
272
  // Update the cart with the new items
272
273
  await updateCart(cartID, {
@@ -290,10 +291,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
290
291
  return;
291
292
  }
292
293
  // Check if the item already exists in the cart
293
- const existingItemIndex = existingCart.items?.findIndex((cartItem)=>cartItem.id === targetID) ?? -1;
294
- let updatedItems = existingCart.items ? [
294
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>cartItem.id === targetID);
295
+ let updatedItems = [
295
296
  ...existingCart.items
296
- ] : [];
297
+ ];
297
298
  if (existingItemIndex !== -1) {
298
299
  // If the item exists, increment its quantity
299
300
  updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity + 1 // Increment by 1
@@ -305,7 +306,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
305
306
  } else {
306
307
  // If the item does not exist, add it to the cart with quantity 1
307
308
  updatedItems = [
308
- ...existingCart.items ?? [],
309
+ ...existingCart.items,
309
310
  {
310
311
  product: targetID,
311
312
  quantity: 1
@@ -333,10 +334,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
333
334
  return;
334
335
  }
335
336
  // Check if the item already exists in the cart
336
- const existingItemIndex = existingCart.items?.findIndex((cartItem)=>cartItem.id === targetID) ?? -1;
337
- const updatedItems = existingCart.items ? [
337
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>cartItem.id === targetID);
338
+ const updatedItems = [
338
339
  ...existingCart.items
339
- ] : [];
340
+ ];
340
341
  if (existingItemIndex !== -1) {
341
342
  // If the item exists, decrement its quantity
342
343
  updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity - 1 // Decrement by 1
@@ -748,20 +749,20 @@ export const useCurrency = ()=>{
748
749
  supportedCurrencies: currenciesConfig.supportedCurrencies
749
750
  };
750
751
  };
751
- export function useCart() {
752
+ export const useCart = ()=>{
752
753
  const { addItem, cart, clearCart, decrementItem, incrementItem, removeItem } = useEcommerce();
753
754
  if (!addItem) {
754
755
  throw new Error('useCart must be used within an EcommerceProvider');
755
756
  }
756
757
  return {
757
758
  addItem,
758
- cart: cart,
759
+ cart,
759
760
  clearCart,
760
761
  decrementItem,
761
762
  incrementItem,
762
763
  removeItem
763
764
  };
764
- }
765
+ };
765
766
  export const usePayments = ()=>{
766
767
  const { confirmOrder, initiatePayment, paymentMethods, selectedPaymentMethod } = useEcommerce();
767
768
  if (!initiatePayment) {
@@ -774,16 +775,16 @@ export const usePayments = ()=>{
774
775
  selectedPaymentMethod
775
776
  };
776
777
  };
777
- export function useAddresses() {
778
+ export const useAddresses = ()=>{
778
779
  const { addresses, createAddress, updateAddress } = useEcommerce();
779
780
  if (!createAddress) {
780
781
  throw new Error('usePayments must be used within an EcommerceProvider');
781
782
  }
782
783
  return {
783
- addresses: addresses,
784
+ addresses,
784
785
  createAddress,
785
786
  updateAddress
786
787
  };
787
- }
788
+ };
788
789
 
789
790
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/react/provider/index.tsx"],"sourcesContent":["'use client'\nimport type { DefaultDocumentIDType, TypedUser } from 'payload'\n\nimport { deepMergeSimple } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport type {\n AddressesCollection,\n CartItem,\n CartsCollection,\n ContextProps,\n Currency,\n EcommerceContextType,\n} from '../../types/index.js'\nimport type { TypedEcommerce } from '../../types/utilities.js'\n\nconst defaultContext: EcommerceContextType = {\n addItem: async () => {},\n clearCart: async () => {},\n confirmOrder: async () => {},\n createAddress: async () => {},\n currenciesConfig: {\n defaultCurrency: 'USD',\n supportedCurrencies: [\n {\n code: 'USD',\n decimals: 2,\n label: 'US Dollar',\n symbol: '$',\n },\n ],\n },\n currency: {\n code: 'USD',\n decimals: 2,\n label: 'US Dollar',\n symbol: '$',\n },\n decrementItem: async () => {},\n incrementItem: async () => {},\n initiatePayment: async () => {},\n paymentMethods: [],\n removeItem: async () => {},\n setCurrency: () => {},\n updateAddress: async () => {},\n}\n\nconst EcommerceContext = createContext<EcommerceContextType>(defaultContext)\n\nconst defaultLocalStorage = {\n key: 'cart',\n}\n\nexport const EcommerceProvider: React.FC<ContextProps> = ({\n addressesSlug = 'addresses',\n api,\n cartsSlug = 'carts',\n children,\n currenciesConfig = {\n defaultCurrency: 'USD',\n supportedCurrencies: [\n {\n code: 'USD',\n decimals: 2,\n label: 'US Dollar',\n symbol: '$',\n },\n ],\n },\n customersSlug = 'users',\n debug = false,\n paymentMethods = [],\n syncLocalStorage = true,\n}) => {\n const localStorageConfig =\n syncLocalStorage && typeof syncLocalStorage === 'object'\n ? {\n ...defaultLocalStorage,\n ...syncLocalStorage,\n }\n : defaultLocalStorage\n\n const { apiRoute = '/api', cartsFetchQuery = {}, serverURL = '' } = api || {}\n const baseAPIURL = `${serverURL}${apiRoute}`\n\n const [user, setUser] = useState<null | TypedUser>(null)\n\n const [addresses, setAddresses] = useState<AddressesCollection[]>()\n\n const hasRendered = useRef(false)\n\n /**\n * The ID of the cart associated with the current session.\n * This is used to identify the cart in the database or local storage.\n * It can be null if no cart has been created yet.\n */\n const [cartID, setCartID] = useState<DefaultDocumentIDType>()\n const [cart, setCart] = useState<CartsCollection>()\n\n const [selectedCurrency, setSelectedCurrency] = useState<Currency>(\n () =>\n currenciesConfig.supportedCurrencies.find(\n (c) => c.code === currenciesConfig.defaultCurrency,\n )!,\n )\n\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<null | string>(null)\n\n const cartQuery = useMemo(() => {\n const priceField = `priceIn${selectedCurrency.code}`\n\n const baseQuery = {\n depth: 0,\n populate: {\n products: {\n [priceField]: true,\n },\n variants: {\n options: true,\n [priceField]: true,\n },\n },\n select: {\n items: true,\n subtotal: true,\n },\n }\n\n return deepMergeSimple(baseQuery, cartsFetchQuery)\n }, [selectedCurrency.code, cartsFetchQuery])\n\n const createCart = useCallback(\n async (initialData: Record<string, unknown>) => {\n const query = qs.stringify(cartQuery)\n\n const response = await fetch(`${baseAPIURL}/${cartsSlug}?${query}`, {\n body: JSON.stringify({\n ...initialData,\n currency: selectedCurrency.code,\n customer: user?.id,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to create cart: ${errorText}`)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Cart creation error: ${data.error}`)\n }\n\n return data.doc as CartsCollection\n },\n [baseAPIURL, cartQuery, cartsSlug, selectedCurrency.code, user?.id],\n )\n\n const getCart = useCallback(\n async (cartID: DefaultDocumentIDType) => {\n const query = qs.stringify(cartQuery)\n\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to fetch cart: ${errorText}`)\n }\n const data = await response.json()\n if (data.error) {\n throw new Error(`Cart fetch error: ${data.error}`)\n }\n\n return data as CartsCollection\n },\n [baseAPIURL, cartQuery, cartsSlug],\n )\n\n const updateCart = useCallback(\n async (cartID: DefaultDocumentIDType, data: Partial<CartsCollection>) => {\n const query = qs.stringify(cartQuery)\n\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {\n body: JSON.stringify(data),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'PATCH',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update cart: ${errorText}`)\n }\n\n const updatedCart = await response.json()\n\n setCart(updatedCart.doc as CartsCollection)\n },\n [baseAPIURL, cartQuery, cartsSlug],\n )\n\n const deleteCart = useCallback(\n async (cartID: DefaultDocumentIDType) => {\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update cart: ${errorText}`)\n }\n\n setCart(undefined)\n setCartID(undefined)\n },\n [baseAPIURL, cartsSlug],\n )\n\n useEffect(() => {\n if (hasRendered.current) {\n if (syncLocalStorage && cartID) {\n localStorage.setItem(localStorageConfig.key, cartID as string)\n }\n }\n }, [cartID, localStorageConfig.key, syncLocalStorage])\n\n const addItem: EcommerceContextType['addItem'] = useCallback(\n async (item, quantity = 1) => {\n if (cartID) {\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex =\n existingCart.items?.findIndex((cartItem: CartItem) => {\n const productID =\n typeof cartItem.product === 'object' ? cartItem.product.id : item.product\n const variantID =\n cartItem.variant && typeof cartItem.variant === 'object'\n ? cartItem.variant.id\n : item.variant\n\n return (\n productID === item.product &&\n (item.variant && variantID ? variantID === item.variant : true)\n )\n }) ?? -1\n\n let updatedItems = existingCart.items ? [...existingCart.items] : []\n\n if (existingItemIndex !== -1) {\n // If the item exists, update its quantity\n updatedItems[existingItemIndex].quantity =\n updatedItems[existingItemIndex].quantity + quantity\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n } else {\n // If the item does not exist, add it to the cart\n updatedItems = [...(existingCart.items ?? []), { ...item, quantity }]\n }\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n } else {\n // If no cartID exists, create a new cart\n const newCart = await createCart({ items: [{ ...item, quantity }] })\n\n setCartID(newCart.id)\n setCart(newCart)\n }\n },\n [cartID, createCart, getCart, updateCart],\n )\n\n const removeItem: EcommerceContextType['removeItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex =\n existingCart.items?.findIndex((cartItem: CartItem) => cartItem.id === targetID) ?? -1\n\n if (existingItemIndex !== -1) {\n // If the item exists, remove it from the cart\n const updatedItems = existingCart.items ? [...existingCart.items] : []\n updatedItems.splice(existingItemIndex, 1)\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n }\n },\n [cartID, getCart, updateCart],\n )\n\n const incrementItem: EcommerceContextType['incrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex =\n existingCart.items?.findIndex((cartItem: CartItem) => cartItem.id === targetID) ?? -1\n\n let updatedItems = existingCart.items ? [...existingCart.items] : []\n\n if (existingItemIndex !== -1) {\n // If the item exists, increment its quantity\n updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity + 1 // Increment by 1\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n } else {\n // If the item does not exist, add it to the cart with quantity 1\n updatedItems = [...(existingCart.items ?? []), { product: targetID, quantity: 1 }]\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n }\n },\n [cartID, getCart, updateCart],\n )\n\n const decrementItem: EcommerceContextType['decrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex =\n existingCart.items?.findIndex((cartItem: CartItem) => cartItem.id === targetID) ?? -1\n\n const updatedItems = existingCart.items ? [...existingCart.items] : []\n\n if (existingItemIndex !== -1) {\n // If the item exists, decrement its quantity\n updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity - 1 // Decrement by 1\n\n // If the quantity reaches 0, remove the item from the cart\n if (updatedItems[existingItemIndex].quantity <= 0) {\n updatedItems.splice(existingItemIndex, 1)\n }\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n }\n },\n [cartID, getCart, updateCart],\n )\n\n const clearCart: EcommerceContextType['clearCart'] = useCallback(async () => {\n if (cartID) {\n await deleteCart(cartID)\n }\n }, [cartID, deleteCart])\n\n const setCurrency: EcommerceContextType['setCurrency'] = useCallback(\n (currency) => {\n if (selectedCurrency.code === currency) {\n return\n }\n\n const foundCurrency = currenciesConfig.supportedCurrencies.find((c) => c.code === currency)\n if (!foundCurrency) {\n throw new Error(`Currency with code \"${currency}\" not found in config`)\n }\n\n setSelectedCurrency(foundCurrency)\n },\n [currenciesConfig.supportedCurrencies, selectedCurrency.code],\n )\n\n const initiatePayment = useCallback<EcommerceContextType['initiatePayment']>(\n async (paymentMethodID, options) => {\n const paymentMethod = paymentMethods.find((method) => method.name === paymentMethodID)\n\n if (!paymentMethod) {\n throw new Error(`Payment method with ID \"${paymentMethodID}\" not found`)\n }\n\n if (!cartID) {\n throw new Error(`No cart is provided.`)\n }\n\n setSelectedPaymentMethod(paymentMethodID)\n\n if (paymentMethod.initiatePayment) {\n const fetchURL = `${baseAPIURL}/payments/${paymentMethodID}/initiate`\n\n const data = {\n cartID,\n currency: selectedCurrency.code,\n }\n\n try {\n const response = await fetch(fetchURL, {\n body: JSON.stringify({\n ...data,\n ...(options?.additionalData || {}),\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const responseError = await response.text()\n throw new Error(responseError)\n }\n\n const responseData = await response.json()\n\n if (responseData.error) {\n throw new Error(responseData.error)\n }\n\n return responseData\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error initiating payment:', error)\n }\n throw new Error(error instanceof Error ? error.message : 'Failed to initiate payment')\n }\n } else {\n throw new Error(`Payment method \"${paymentMethodID}\" does not support payment initiation`)\n }\n },\n [baseAPIURL, cartID, debug, paymentMethods, selectedCurrency.code],\n )\n\n const confirmOrder = useCallback<EcommerceContextType['initiatePayment']>(\n async (paymentMethodID, options) => {\n if (!cartID) {\n throw new Error(`Cart is empty.`)\n }\n\n const paymentMethod = paymentMethods.find((pm) => pm.name === paymentMethodID)\n\n if (!paymentMethod) {\n throw new Error(`Payment method with ID \"${paymentMethodID}\" not found`)\n }\n\n if (paymentMethod.confirmOrder) {\n const fetchURL = `${baseAPIURL}/payments/${paymentMethodID}/confirm-order`\n\n const data = {\n cartID,\n currency: selectedCurrency.code,\n }\n\n const response = await fetch(fetchURL, {\n body: JSON.stringify({\n ...data,\n ...(options?.additionalData || {}),\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const responseError = await response.text()\n throw new Error(responseError)\n }\n\n const responseData = await response.json()\n\n if (responseData.error) {\n throw new Error(responseData.error)\n }\n\n return responseData\n } else {\n throw new Error(`Payment method \"${paymentMethodID}\" does not support order confirmation`)\n }\n },\n [baseAPIURL, cartID, paymentMethods, selectedCurrency.code],\n )\n\n const getUser = useCallback(async () => {\n try {\n const query = qs.stringify({\n depth: 0,\n select: {\n id: true,\n carts: true,\n },\n })\n\n const response = await fetch(`${baseAPIURL}/${customersSlug}/me?${query}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to fetch user: ${errorText}`)\n }\n\n const userData = await response.json()\n\n if (userData.error) {\n throw new Error(`User fetch error: ${userData.error}`)\n }\n\n if (userData.user) {\n setUser(userData.user as TypedUser)\n return userData.user as TypedUser\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error fetching user:', error)\n }\n setUser(null)\n throw new Error(\n `Failed to fetch user: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n }, [baseAPIURL, customersSlug, debug])\n\n const getAddresses = useCallback(async () => {\n if (!user) {\n return\n }\n\n try {\n const query = qs.stringify({\n depth: 0,\n limit: 0,\n pagination: false,\n })\n\n const response = await fetch(`${baseAPIURL}/${addressesSlug}?${query}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n throw new Error(errorText)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Address fetch error: ${data.error}`)\n }\n\n if (data.docs && data.docs.length > 0) {\n setAddresses(data.docs)\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error fetching addresses:', error)\n }\n setAddresses(undefined)\n throw new Error(\n `Failed to fetch addresses: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n }, [user, baseAPIURL, addressesSlug, debug])\n\n const updateAddress = useCallback<EcommerceContextType['updateAddress']>(\n async (addressID, address) => {\n if (!user) {\n throw new Error('User must be logged in to update or create an address')\n }\n\n try {\n const response = await fetch(`${baseAPIURL}/${addressesSlug}/${addressID}`, {\n body: JSON.stringify(address),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'PATCH',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update or create address: ${errorText}`)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Address update/create error: ${data.error}`)\n }\n\n // Refresh addresses after updating or creating\n await getAddresses()\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error updating or creating address:', error)\n }\n\n throw new Error(\n `Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n },\n [user, baseAPIURL, addressesSlug, getAddresses, debug],\n )\n\n const createAddress = useCallback<EcommerceContextType['createAddress']>(\n async (address) => {\n if (!user) {\n throw new Error('User must be logged in to update or create an address')\n }\n\n try {\n const response = await fetch(`${baseAPIURL}/${addressesSlug}`, {\n body: JSON.stringify(address),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update or create address: ${errorText}`)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Address update/create error: ${data.error}`)\n }\n\n // Refresh addresses after updating or creating\n await getAddresses()\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error updating or creating address:', error)\n }\n\n throw new Error(\n `Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n },\n [user, baseAPIURL, addressesSlug, getAddresses, debug],\n )\n\n // If localStorage is enabled, we can add logic to persist the cart state\n useEffect(() => {\n if (!hasRendered.current) {\n if (syncLocalStorage) {\n const storedCart = localStorage.getItem(localStorageConfig.key)\n if (storedCart) {\n getCart(storedCart)\n .then((fetchedCart) => {\n setCart(fetchedCart)\n setCartID(storedCart as DefaultDocumentIDType)\n })\n .catch((_) => {\n // console.error('Error fetching cart from localStorage:', error)\n // If there's an error fetching the cart, we can clear it from localStorage\n localStorage.removeItem(localStorageConfig.key)\n setCartID(undefined)\n setCart(undefined)\n })\n }\n }\n\n hasRendered.current = true\n\n void getUser().then((user) => {\n if (user && user.cart?.docs && user.cart.docs.length > 0) {\n // If the user has carts, we can set the cartID to the first cart\n const cartID =\n typeof user.cart.docs[0] === 'object' ? user.cart.docs[0].id : user.cart.docs[0]\n\n if (cartID) {\n getCart(cartID)\n .then((fetchedCart) => {\n setCart(fetchedCart)\n setCartID(cartID)\n })\n .catch((error) => {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error fetching user cart:', error)\n }\n\n setCart(undefined)\n setCartID(undefined)\n\n throw new Error(`Failed to fetch user cart: ${error.message}`)\n })\n }\n }\n })\n }\n }, [debug, getAddresses, getCart, getUser, localStorageConfig.key, syncLocalStorage])\n\n useEffect(() => {\n if (user) {\n // If the user is logged in, fetch their addresses\n void getAddresses()\n } else {\n // If no user is logged in, clear addresses\n setAddresses(undefined)\n }\n }, [getAddresses, user])\n\n return (\n <EcommerceContext\n value={{\n addItem,\n addresses,\n cart,\n clearCart,\n confirmOrder,\n createAddress,\n currenciesConfig,\n currency: selectedCurrency,\n decrementItem,\n incrementItem,\n initiatePayment,\n paymentMethods,\n removeItem,\n selectedPaymentMethod,\n setCurrency,\n updateAddress,\n }}\n >\n {children}\n </EcommerceContext>\n )\n}\n\nexport const useEcommerce = () => {\n const context = use(EcommerceContext)\n\n if (!context) {\n throw new Error('useEcommerce must be used within an EcommerceProvider')\n }\n\n return context\n}\n\nexport const useCurrency = () => {\n const { currenciesConfig, currency, setCurrency } = useEcommerce()\n\n const formatCurrency = useCallback(\n (value?: null | number, options?: { currency?: Currency }): string => {\n if (value === undefined || value === null) {\n return ''\n }\n\n const currencyToUse = options?.currency || currency\n\n if (!currencyToUse) {\n return value.toString()\n }\n\n if (value === 0) {\n return `${currencyToUse.symbol}0.${'0'.repeat(currencyToUse.decimals)}`\n }\n\n // Convert from base value (e.g., cents) to decimal value (e.g., dollars)\n const decimalValue = value / Math.pow(10, currencyToUse.decimals)\n\n // Format with the correct number of decimal places\n return `${currencyToUse.symbol}${decimalValue.toFixed(currencyToUse.decimals)}`\n },\n [currency],\n )\n\n if (!currency) {\n throw new Error('useCurrency must be used within an EcommerceProvider')\n }\n\n return {\n currency,\n formatCurrency,\n setCurrency,\n supportedCurrencies: currenciesConfig.supportedCurrencies,\n }\n}\n\nexport function useCart<T extends CartsCollection>() {\n const { addItem, cart, clearCart, decrementItem, incrementItem, removeItem } = useEcommerce()\n\n if (!addItem) {\n throw new Error('useCart must be used within an EcommerceProvider')\n }\n\n return { addItem, cart: cart as T, clearCart, decrementItem, incrementItem, removeItem }\n}\n\nexport const usePayments = () => {\n const { confirmOrder, initiatePayment, paymentMethods, selectedPaymentMethod } = useEcommerce()\n\n if (!initiatePayment) {\n throw new Error('usePayments must be used within an EcommerceProvider')\n }\n\n return { confirmOrder, initiatePayment, paymentMethods, selectedPaymentMethod }\n}\n\nexport function useAddresses<T extends AddressesCollection>() {\n const { addresses, createAddress, updateAddress } = useEcommerce()\n\n if (!createAddress) {\n throw new Error('usePayments must be used within an EcommerceProvider')\n }\n\n return { addresses: addresses as T[], createAddress, updateAddress }\n}\n"],"names":["deepMergeSimple","qs","React","createContext","use","useCallback","useEffect","useMemo","useRef","useState","defaultContext","addItem","clearCart","confirmOrder","createAddress","currenciesConfig","defaultCurrency","supportedCurrencies","code","decimals","label","symbol","currency","decrementItem","incrementItem","initiatePayment","paymentMethods","removeItem","setCurrency","updateAddress","EcommerceContext","defaultLocalStorage","key","EcommerceProvider","addressesSlug","api","cartsSlug","children","customersSlug","debug","syncLocalStorage","localStorageConfig","apiRoute","cartsFetchQuery","serverURL","baseAPIURL","user","setUser","addresses","setAddresses","hasRendered","cartID","setCartID","cart","setCart","selectedCurrency","setSelectedCurrency","find","c","selectedPaymentMethod","setSelectedPaymentMethod","cartQuery","priceField","baseQuery","depth","populate","products","variants","options","select","items","subtotal","createCart","initialData","query","stringify","response","fetch","body","JSON","customer","id","credentials","headers","method","ok","errorText","text","Error","data","json","error","doc","getCart","updateCart","updatedCart","deleteCart","undefined","current","localStorage","setItem","item","quantity","existingCart","existingItemIndex","findIndex","cartItem","productID","product","variantID","variant","updatedItems","newCart","targetID","splice","foundCurrency","paymentMethodID","paymentMethod","name","fetchURL","additionalData","responseError","responseData","console","message","pm","getUser","carts","userData","getAddresses","limit","pagination","docs","length","addressID","address","storedCart","getItem","then","fetchedCart","catch","_","value","useEcommerce","context","useCurrency","formatCurrency","currencyToUse","toString","repeat","decimalValue","Math","pow","toFixed","useCart","usePayments","useAddresses"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/react/provider/index.tsx"],"sourcesContent":["'use client'\nimport type { DefaultDocumentIDType, TypedCollection, TypedUser } from 'payload'\n\nimport { deepMergeSimple } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport type { CartItem, Currency } from '../../types.js'\nimport type { ContextProps, EcommerceContext as EcommerceContextType } from './types.js'\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype GeneratedTypes = import('payload').GeneratedTypes\n\nconst defaultContext: EcommerceContextType = {\n addItem: async () => {},\n clearCart: async () => {},\n confirmOrder: async () => {},\n createAddress: async () => {},\n currenciesConfig: {\n defaultCurrency: 'USD',\n supportedCurrencies: [\n {\n code: 'USD',\n decimals: 2,\n label: 'US Dollar',\n symbol: '$',\n },\n ],\n },\n currency: {\n code: 'USD',\n decimals: 2,\n label: 'US Dollar',\n symbol: '$',\n },\n decrementItem: async () => {},\n incrementItem: async () => {},\n initiatePayment: async () => {},\n paymentMethods: [],\n removeItem: async () => {},\n setCurrency: () => {},\n updateAddress: async () => {},\n}\n\nconst EcommerceContext = createContext<EcommerceContextType>(defaultContext)\n\nconst defaultLocalStorage = {\n key: 'cart',\n}\n\nexport const EcommerceProvider: React.FC<ContextProps> = ({\n addressesSlug = 'addresses',\n api,\n cartsSlug = 'carts',\n children,\n currenciesConfig = {\n defaultCurrency: 'USD',\n supportedCurrencies: [\n {\n code: 'USD',\n decimals: 2,\n label: 'US Dollar',\n symbol: '$',\n },\n ],\n },\n customersSlug = 'users',\n debug = false,\n paymentMethods = [],\n syncLocalStorage = true,\n}) => {\n const localStorageConfig =\n syncLocalStorage && typeof syncLocalStorage === 'object'\n ? {\n ...defaultLocalStorage,\n ...syncLocalStorage,\n }\n : defaultLocalStorage\n\n const { apiRoute = '/api', cartsFetchQuery = {}, serverURL = '' } = api || {}\n const baseAPIURL = `${serverURL}${apiRoute}`\n\n const [user, setUser] = useState<null | TypedUser>(null)\n\n const [addresses, setAddresses] = useState<TypedCollection['addresses'][]>()\n\n const hasRendered = useRef(false)\n\n /**\n * The ID of the cart associated with the current session.\n * This is used to identify the cart in the database or local storage.\n * It can be null if no cart has been created yet.\n */\n const [cartID, setCartID] = useState<DefaultDocumentIDType>()\n // @ts-ignore\n const [cart, setCart] = useState<GeneratedTypes['collections']['carts']>()\n\n const [selectedCurrency, setSelectedCurrency] = useState<Currency>(\n () =>\n currenciesConfig.supportedCurrencies.find(\n (c) => c.code === currenciesConfig.defaultCurrency,\n )!,\n )\n\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<null | string>(null)\n\n const cartQuery = useMemo(() => {\n const priceField = `priceIn${selectedCurrency.code}`\n\n const baseQuery = {\n depth: 0,\n populate: {\n products: {\n [priceField]: true,\n },\n variants: {\n options: true,\n [priceField]: true,\n },\n },\n select: {\n items: true,\n subtotal: true,\n },\n }\n\n return deepMergeSimple(baseQuery, cartsFetchQuery)\n }, [selectedCurrency.code, cartsFetchQuery])\n\n const createCart = useCallback(\n async (initialData: Record<string, unknown>) => {\n const query = qs.stringify(cartQuery)\n\n const response = await fetch(`${baseAPIURL}/${cartsSlug}?${query}`, {\n body: JSON.stringify({\n ...initialData,\n currency: selectedCurrency.code,\n customer: user?.id,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to create cart: ${errorText}`)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Cart creation error: ${data.error}`)\n }\n\n return data.doc as TypedCollection['carts']\n },\n [baseAPIURL, cartQuery, cartsSlug, selectedCurrency.code, user?.id],\n )\n\n const getCart = useCallback(\n async (cartID: DefaultDocumentIDType) => {\n const query = qs.stringify(cartQuery)\n\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to fetch cart: ${errorText}`)\n }\n const data = await response.json()\n if (data.error) {\n throw new Error(`Cart fetch error: ${data.error}`)\n }\n\n return data as TypedCollection['carts']\n },\n [baseAPIURL, cartQuery, cartsSlug],\n )\n\n const updateCart = useCallback(\n async (cartID: DefaultDocumentIDType, data: Partial<TypedCollection['carts']>) => {\n const query = qs.stringify(cartQuery)\n\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {\n body: JSON.stringify(data),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'PATCH',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update cart: ${errorText}`)\n }\n\n const updatedCart = await response.json()\n setCart(updatedCart.doc as TypedCollection['carts'])\n },\n [baseAPIURL, cartQuery, cartsSlug],\n )\n\n const deleteCart = useCallback(\n async (cartID: DefaultDocumentIDType) => {\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update cart: ${errorText}`)\n }\n\n setCart(undefined)\n setCartID(undefined)\n },\n [baseAPIURL, cartsSlug],\n )\n\n useEffect(() => {\n if (hasRendered.current) {\n if (syncLocalStorage && cartID) {\n localStorage.setItem(localStorageConfig.key, cartID as string)\n }\n }\n }, [cartID, localStorageConfig.key, syncLocalStorage])\n\n const addItem: EcommerceContextType['addItem'] = useCallback(\n async (item, quantity = 1) => {\n if (cartID) {\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex = existingCart.items.findIndex((cartItem: CartItem) => {\n const productID =\n typeof cartItem.product === 'object' ? cartItem.product.id : item.product\n const variantID =\n cartItem.variant && typeof cartItem.variant === 'object'\n ? cartItem.variant.id\n : item.variant\n\n return (\n productID === item.product &&\n (item.variant && variantID ? variantID === item.variant : true)\n )\n })\n\n let updatedItems = [...existingCart.items]\n if (existingItemIndex !== -1) {\n // If the item exists, update its quantity\n updatedItems[existingItemIndex].quantity =\n updatedItems[existingItemIndex].quantity + quantity\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n } else {\n // If the item does not exist, add it to the cart\n updatedItems = [...existingCart.items, { ...item, quantity }]\n }\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n } else {\n // If no cartID exists, create a new cart\n const newCart = await createCart({ items: [{ ...item, quantity }] })\n\n setCartID(newCart.id)\n setCart(newCart)\n }\n },\n [cartID, createCart, getCart, updateCart],\n )\n\n const removeItem: EcommerceContextType['removeItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex = existingCart.items.findIndex(\n (cartItem: CartItem) => cartItem.id === targetID,\n )\n\n if (existingItemIndex !== -1) {\n // If the item exists, remove it from the cart\n const updatedItems = [...existingCart.items]\n updatedItems.splice(existingItemIndex, 1)\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n }\n },\n [cartID, getCart, updateCart],\n )\n\n const incrementItem: EcommerceContextType['incrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex = existingCart.items.findIndex(\n (cartItem: CartItem) => cartItem.id === targetID,\n )\n\n let updatedItems = [...existingCart.items]\n\n if (existingItemIndex !== -1) {\n // If the item exists, increment its quantity\n updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity + 1 // Increment by 1\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n } else {\n // If the item does not exist, add it to the cart with quantity 1\n updatedItems = [...existingCart.items, { product: targetID, quantity: 1 }]\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n }\n },\n [cartID, getCart, updateCart],\n )\n\n const decrementItem: EcommerceContextType['decrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n const existingCart = await getCart(cartID)\n\n if (!existingCart) {\n // console.error(`Cart with ID \"${cartID}\" not found`)\n setCartID(undefined)\n setCart(undefined)\n return\n }\n\n // Check if the item already exists in the cart\n const existingItemIndex = existingCart.items.findIndex(\n (cartItem: CartItem) => cartItem.id === targetID,\n )\n\n const updatedItems = [...existingCart.items]\n\n if (existingItemIndex !== -1) {\n // If the item exists, decrement its quantity\n updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity - 1 // Decrement by 1\n\n // If the quantity reaches 0, remove the item from the cart\n if (updatedItems[existingItemIndex].quantity <= 0) {\n updatedItems.splice(existingItemIndex, 1)\n }\n\n // Update the cart with the new items\n await updateCart(cartID, {\n items: updatedItems,\n })\n }\n },\n [cartID, getCart, updateCart],\n )\n\n const clearCart: EcommerceContextType['clearCart'] = useCallback(async () => {\n if (cartID) {\n await deleteCart(cartID)\n }\n }, [cartID, deleteCart])\n\n const setCurrency: EcommerceContextType['setCurrency'] = useCallback(\n (currency) => {\n if (selectedCurrency.code === currency) {\n return\n }\n\n const foundCurrency = currenciesConfig.supportedCurrencies.find((c) => c.code === currency)\n if (!foundCurrency) {\n throw new Error(`Currency with code \"${currency}\" not found in config`)\n }\n\n setSelectedCurrency(foundCurrency)\n },\n [currenciesConfig.supportedCurrencies, selectedCurrency.code],\n )\n\n const initiatePayment = useCallback<EcommerceContextType['initiatePayment']>(\n async (paymentMethodID, options) => {\n const paymentMethod = paymentMethods.find((method) => method.name === paymentMethodID)\n\n if (!paymentMethod) {\n throw new Error(`Payment method with ID \"${paymentMethodID}\" not found`)\n }\n\n if (!cartID) {\n throw new Error(`No cart is provided.`)\n }\n\n setSelectedPaymentMethod(paymentMethodID)\n\n if (paymentMethod.initiatePayment) {\n const fetchURL = `${baseAPIURL}/payments/${paymentMethodID}/initiate`\n\n const data = {\n cartID,\n currency: selectedCurrency.code,\n }\n\n try {\n const response = await fetch(fetchURL, {\n body: JSON.stringify({\n ...data,\n ...(options?.additionalData || {}),\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const responseError = await response.text()\n throw new Error(responseError)\n }\n\n const responseData = await response.json()\n\n if (responseData.error) {\n throw new Error(responseData.error)\n }\n\n return responseData\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error initiating payment:', error)\n }\n throw new Error(error instanceof Error ? error.message : 'Failed to initiate payment')\n }\n } else {\n throw new Error(`Payment method \"${paymentMethodID}\" does not support payment initiation`)\n }\n },\n [baseAPIURL, cartID, debug, paymentMethods, selectedCurrency.code],\n )\n\n const confirmOrder = useCallback<EcommerceContextType['initiatePayment']>(\n async (paymentMethodID, options) => {\n if (!cartID) {\n throw new Error(`Cart is empty.`)\n }\n\n const paymentMethod = paymentMethods.find((pm) => pm.name === paymentMethodID)\n\n if (!paymentMethod) {\n throw new Error(`Payment method with ID \"${paymentMethodID}\" not found`)\n }\n\n if (paymentMethod.confirmOrder) {\n const fetchURL = `${baseAPIURL}/payments/${paymentMethodID}/confirm-order`\n\n const data = {\n cartID,\n currency: selectedCurrency.code,\n }\n\n const response = await fetch(fetchURL, {\n body: JSON.stringify({\n ...data,\n ...(options?.additionalData || {}),\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const responseError = await response.text()\n throw new Error(responseError)\n }\n\n const responseData = await response.json()\n\n if (responseData.error) {\n throw new Error(responseData.error)\n }\n\n return responseData\n } else {\n throw new Error(`Payment method \"${paymentMethodID}\" does not support order confirmation`)\n }\n },\n [baseAPIURL, cartID, paymentMethods, selectedCurrency.code],\n )\n\n const getUser = useCallback(async () => {\n try {\n const query = qs.stringify({\n depth: 0,\n select: {\n id: true,\n carts: true,\n },\n })\n\n const response = await fetch(`${baseAPIURL}/${customersSlug}/me?${query}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to fetch user: ${errorText}`)\n }\n\n const userData = await response.json()\n\n if (userData.error) {\n throw new Error(`User fetch error: ${userData.error}`)\n }\n\n if (userData.user) {\n setUser(userData.user as TypedUser)\n return userData.user as TypedUser\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error fetching user:', error)\n }\n setUser(null)\n throw new Error(\n `Failed to fetch user: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n }, [baseAPIURL, customersSlug, debug])\n\n const getAddresses = useCallback(async () => {\n if (!user) {\n return\n }\n\n try {\n const query = qs.stringify({\n depth: 0,\n limit: 0,\n pagination: false,\n })\n\n const response = await fetch(`${baseAPIURL}/${addressesSlug}?${query}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n throw new Error(errorText)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Address fetch error: ${data.error}`)\n }\n\n if (data.docs && data.docs.length > 0) {\n setAddresses(data.docs)\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error fetching addresses:', error)\n }\n setAddresses(undefined)\n throw new Error(\n `Failed to fetch addresses: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n }, [user, baseAPIURL, addressesSlug, debug])\n\n const updateAddress = useCallback<EcommerceContextType['updateAddress']>(\n async (addressID, address) => {\n if (!user) {\n throw new Error('User must be logged in to update or create an address')\n }\n\n try {\n const response = await fetch(`${baseAPIURL}/${addressesSlug}/${addressID}`, {\n body: JSON.stringify(address),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'PATCH',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update or create address: ${errorText}`)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Address update/create error: ${data.error}`)\n }\n\n // Refresh addresses after updating or creating\n await getAddresses()\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error updating or creating address:', error)\n }\n\n throw new Error(\n `Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n },\n [user, baseAPIURL, addressesSlug, getAddresses, debug],\n )\n\n const createAddress = useCallback<EcommerceContextType['createAddress']>(\n async (address) => {\n if (!user) {\n throw new Error('User must be logged in to update or create an address')\n }\n\n try {\n const response = await fetch(`${baseAPIURL}/${addressesSlug}`, {\n body: JSON.stringify(address),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to update or create address: ${errorText}`)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Address update/create error: ${data.error}`)\n }\n\n // Refresh addresses after updating or creating\n await getAddresses()\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error updating or creating address:', error)\n }\n\n throw new Error(\n `Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n },\n [user, baseAPIURL, addressesSlug, getAddresses, debug],\n )\n\n // If localStorage is enabled, we can add logic to persist the cart state\n useEffect(() => {\n if (!hasRendered.current) {\n if (syncLocalStorage) {\n const storedCart = localStorage.getItem(localStorageConfig.key)\n if (storedCart) {\n getCart(storedCart)\n .then((fetchedCart) => {\n setCart(fetchedCart)\n setCartID(storedCart as DefaultDocumentIDType)\n })\n .catch((_) => {\n // console.error('Error fetching cart from localStorage:', error)\n // If there's an error fetching the cart, we can clear it from localStorage\n localStorage.removeItem(localStorageConfig.key)\n setCartID(undefined)\n setCart(undefined)\n })\n }\n }\n\n hasRendered.current = true\n\n void getUser().then((user) => {\n if (user && user.cart?.docs && user.cart.docs.length > 0) {\n // If the user has carts, we can set the cartID to the first cart\n const cartID =\n typeof user.cart.docs[0] === 'object' ? user.cart.docs[0].id : user.cart.docs[0]\n\n if (cartID) {\n getCart(cartID)\n .then((fetchedCart) => {\n setCart(fetchedCart)\n setCartID(cartID)\n })\n .catch((error) => {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error fetching user cart:', error)\n }\n\n setCart(undefined)\n setCartID(undefined)\n\n throw new Error(`Failed to fetch user cart: ${error.message}`)\n })\n }\n }\n })\n }\n }, [debug, getAddresses, getCart, getUser, localStorageConfig.key, syncLocalStorage])\n\n useEffect(() => {\n if (user) {\n // If the user is logged in, fetch their addresses\n void getAddresses()\n } else {\n // If no user is logged in, clear addresses\n setAddresses(undefined)\n }\n }, [getAddresses, user])\n\n return (\n <EcommerceContext\n value={{\n addItem,\n addresses,\n cart,\n clearCart,\n confirmOrder,\n createAddress,\n currenciesConfig,\n currency: selectedCurrency,\n decrementItem,\n incrementItem,\n initiatePayment,\n paymentMethods,\n removeItem,\n selectedPaymentMethod,\n setCurrency,\n updateAddress,\n }}\n >\n {children}\n </EcommerceContext>\n )\n}\n\nexport const useEcommerce = () => {\n const context = use(EcommerceContext)\n\n if (!context) {\n throw new Error('useEcommerce must be used within an EcommerceProvider')\n }\n\n return context\n}\n\nexport const useCurrency = () => {\n const { currenciesConfig, currency, setCurrency } = useEcommerce()\n\n const formatCurrency = useCallback(\n (value?: null | number, options?: { currency?: Currency }): string => {\n if (value === undefined || value === null) {\n return ''\n }\n\n const currencyToUse = options?.currency || currency\n\n if (!currencyToUse) {\n return value.toString()\n }\n\n if (value === 0) {\n return `${currencyToUse.symbol}0.${'0'.repeat(currencyToUse.decimals)}`\n }\n\n // Convert from base value (e.g., cents) to decimal value (e.g., dollars)\n const decimalValue = value / Math.pow(10, currencyToUse.decimals)\n\n // Format with the correct number of decimal places\n return `${currencyToUse.symbol}${decimalValue.toFixed(currencyToUse.decimals)}`\n },\n [currency],\n )\n\n if (!currency) {\n throw new Error('useCurrency must be used within an EcommerceProvider')\n }\n\n return {\n currency,\n formatCurrency,\n setCurrency,\n supportedCurrencies: currenciesConfig.supportedCurrencies,\n }\n}\n\nexport const useCart = () => {\n const { addItem, cart, clearCart, decrementItem, incrementItem, removeItem } = useEcommerce()\n\n if (!addItem) {\n throw new Error('useCart must be used within an EcommerceProvider')\n }\n\n return { addItem, cart, clearCart, decrementItem, incrementItem, removeItem }\n}\n\nexport const usePayments = () => {\n const { confirmOrder, initiatePayment, paymentMethods, selectedPaymentMethod } = useEcommerce()\n\n if (!initiatePayment) {\n throw new Error('usePayments must be used within an EcommerceProvider')\n }\n\n return { confirmOrder, initiatePayment, paymentMethods, selectedPaymentMethod }\n}\n\nexport const useAddresses = () => {\n const { addresses, createAddress, updateAddress } = useEcommerce()\n\n if (!createAddress) {\n throw new Error('usePayments must be used within an EcommerceProvider')\n }\n\n return { addresses, createAddress, updateAddress }\n}\n"],"names":["deepMergeSimple","qs","React","createContext","use","useCallback","useEffect","useMemo","useRef","useState","defaultContext","addItem","clearCart","confirmOrder","createAddress","currenciesConfig","defaultCurrency","supportedCurrencies","code","decimals","label","symbol","currency","decrementItem","incrementItem","initiatePayment","paymentMethods","removeItem","setCurrency","updateAddress","EcommerceContext","defaultLocalStorage","key","EcommerceProvider","addressesSlug","api","cartsSlug","children","customersSlug","debug","syncLocalStorage","localStorageConfig","apiRoute","cartsFetchQuery","serverURL","baseAPIURL","user","setUser","addresses","setAddresses","hasRendered","cartID","setCartID","cart","setCart","selectedCurrency","setSelectedCurrency","find","c","selectedPaymentMethod","setSelectedPaymentMethod","cartQuery","priceField","baseQuery","depth","populate","products","variants","options","select","items","subtotal","createCart","initialData","query","stringify","response","fetch","body","JSON","customer","id","credentials","headers","method","ok","errorText","text","Error","data","json","error","doc","getCart","updateCart","updatedCart","deleteCart","undefined","current","localStorage","setItem","item","quantity","existingCart","existingItemIndex","findIndex","cartItem","productID","product","variantID","variant","updatedItems","newCart","targetID","splice","foundCurrency","paymentMethodID","paymentMethod","name","fetchURL","additionalData","responseError","responseData","console","message","pm","getUser","carts","userData","getAddresses","limit","pagination","docs","length","addressID","address","storedCart","getItem","then","fetchedCart","catch","_","value","useEcommerce","context","useCurrency","formatCurrency","currencyToUse","toString","repeat","decimalValue","Math","pow","toFixed","useCart","usePayments","useAddresses"],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ import type { DefaultDocumentIDType, PopulateType, SelectType, TypedCollection } from 'payload';
2
+ import type React from 'react';
3
+ import type { CurrenciesConfig, Currency, PaymentAdapterClient } from '../../types.js';
4
+ type GeneratedTypes = import('payload').GeneratedTypes;
5
+ export type SyncLocalStorageConfig = {
6
+ /**
7
+ * Key to use for localStorage.
8
+ * Defaults to 'cart'.
9
+ */
10
+ key?: string;
11
+ };
12
+ type APIProps = {
13
+ /**
14
+ * The route for the Payload API, defaults to `/api`.
15
+ */
16
+ apiRoute?: string;
17
+ /**
18
+ * Customise the query used to fetch carts. Use this when you need to fetch additional data and optimise queries using depth, select and populate.
19
+ *
20
+ * Defaults to `{ depth: 0 }`.
21
+ */
22
+ cartsFetchQuery?: {
23
+ depth?: number;
24
+ populate?: PopulateType;
25
+ select?: SelectType;
26
+ };
27
+ /**
28
+ * The route for the Payload API, defaults to ``. Eg for a Payload app running on `http://localhost:3000`, the default serverURL would be `http://localhost:3000`.
29
+ */
30
+ serverURL?: string;
31
+ };
32
+ export type ContextProps = {
33
+ /**
34
+ * The slug for the addresses collection.
35
+ *
36
+ * Defaults to 'addresses'.
37
+ */
38
+ addressesSlug?: string;
39
+ api?: APIProps;
40
+ /**
41
+ * The slug for the carts collection.
42
+ *
43
+ * Defaults to 'carts'.
44
+ */
45
+ cartsSlug?: string;
46
+ children?: React.ReactNode;
47
+ /**
48
+ * The configuration for currencies used in the ecommerce context.
49
+ * This is used to handle currency formatting and calculations, defaults to USD.
50
+ */
51
+ currenciesConfig?: CurrenciesConfig;
52
+ /**
53
+ * The slug for the customers collection.
54
+ *
55
+ * Defaults to 'users'.
56
+ */
57
+ customersSlug?: string;
58
+ /**
59
+ * Enable debug mode for the ecommerce context. This will log additional information to the console.
60
+ * Defaults to false.
61
+ */
62
+ debug?: boolean;
63
+ /**
64
+ * Whether to enable support for variants in the cart.
65
+ * This allows adding products with specific variants to the cart.
66
+ * Defaults to false.
67
+ */
68
+ enableVariants?: boolean;
69
+ /**
70
+ * Supported payment methods for the ecommerce context.
71
+ */
72
+ paymentMethods?: PaymentAdapterClient[];
73
+ /**
74
+ * Whether to enable localStorage for cart persistence.
75
+ * Defaults to true.
76
+ */
77
+ syncLocalStorage?: boolean | SyncLocalStorageConfig;
78
+ };
79
+ /**
80
+ * Type used internally to represent the cart item to be added.
81
+ */
82
+ type CartItemArgument = {
83
+ /**
84
+ * The ID of the product to add to the cart. Always required.
85
+ */
86
+ product: DefaultDocumentIDType;
87
+ /**
88
+ * The ID of the variant to add to the cart. Optional, if not provided, the product will be added without a variant.
89
+ */
90
+ variant?: DefaultDocumentIDType;
91
+ };
92
+ export type EcommerceContext = {
93
+ /**
94
+ * Add an item to the cart.
95
+ */
96
+ addItem: (item: CartItemArgument, quantity?: number) => Promise<void>;
97
+ /**
98
+ * All current addresses for the current user.
99
+ * This is used to manage shipping and billing addresses.
100
+ */
101
+ addresses?: TypedCollection['addresses'][];
102
+ /**
103
+ * The current data of the cart.
104
+ */
105
+ cart?: GeneratedTypes['collections']['carts'];
106
+ /**
107
+ * The ID of the current cart corresponding to the cart in the database or local storage.
108
+ */
109
+ cartID?: DefaultDocumentIDType;
110
+ /**
111
+ * Clear the cart, removing all items.
112
+ */
113
+ clearCart: () => Promise<void>;
114
+ /**
115
+ * Initiate a payment using the selected payment method.
116
+ * This method should be called after the cart is ready for checkout.
117
+ * It requires the payment method ID and any necessary payment data.
118
+ */
119
+ confirmOrder: (paymentMethodID: string, options?: {
120
+ additionalData: Record<string, unknown>;
121
+ }) => Promise<unknown>;
122
+ /**
123
+ * Create a new address by providing the data.
124
+ */
125
+ createAddress: (data: Partial<TypedCollection['addresses']>) => Promise<void>;
126
+ /**
127
+ * The configuration for the currencies used in the ecommerce context.
128
+ */
129
+ currenciesConfig: CurrenciesConfig;
130
+ /**
131
+ * The currently selected currency used for the cart and price formatting automatically.
132
+ */
133
+ currency: Currency;
134
+ /**
135
+ * Decrement an item in the cart by its index ID.
136
+ * If quantity reaches 0, the item will be removed from the cart.
137
+ */
138
+ decrementItem: (item: DefaultDocumentIDType) => Promise<void>;
139
+ /**
140
+ * Increment an item in the cart by its index ID.
141
+ */
142
+ incrementItem: (item: DefaultDocumentIDType) => Promise<void>;
143
+ /**
144
+ * Initiate a payment using the selected payment method.
145
+ * This method should be called after the cart is ready for checkout.
146
+ * It requires the payment method ID and any necessary payment data.
147
+ */
148
+ initiatePayment: (paymentMethodID: string, options?: {
149
+ additionalData: Record<string, unknown>;
150
+ }) => Promise<unknown>;
151
+ paymentMethods: PaymentAdapterClient[];
152
+ /**
153
+ * Remove an item from the cart by its index ID.
154
+ */
155
+ removeItem: (item: DefaultDocumentIDType) => Promise<void>;
156
+ /**
157
+ * The name of the currently selected payment method.
158
+ * This is used to determine which payment method to use when initiating a payment.
159
+ */
160
+ selectedPaymentMethod?: null | string;
161
+ /**
162
+ * Change the currency for the cart, it defaults to the configured currency.
163
+ * This will update the currency used for pricing and calculations.
164
+ */
165
+ setCurrency: (currency: string) => void;
166
+ /**
167
+ * Update an address by providing the data and the ID.
168
+ */
169
+ updateAddress: (addressID: DefaultDocumentIDType, data: Partial<TypedCollection['addresses']>) => Promise<void>;
170
+ };
171
+ export {};
172
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/react/provider/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/react/provider/types.ts"],"sourcesContent":["import type { DefaultDocumentIDType, PopulateType, SelectType, TypedCollection } from 'payload'\nimport type React from 'react'\n\nimport type { CurrenciesConfig, Currency, PaymentAdapterClient } from '../../types.js'\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype GeneratedTypes = import('payload').GeneratedTypes\n\nexport type SyncLocalStorageConfig = {\n /**\n * Key to use for localStorage.\n * Defaults to 'cart'.\n */\n key?: string\n}\n\ntype APIProps = {\n /**\n * The route for the Payload API, defaults to `/api`.\n */\n apiRoute?: string\n /**\n * Customise the query used to fetch carts. Use this when you need to fetch additional data and optimise queries using depth, select and populate.\n *\n * Defaults to `{ depth: 0 }`.\n */\n cartsFetchQuery?: {\n depth?: number\n populate?: PopulateType\n select?: SelectType\n }\n /**\n * The route for the Payload API, defaults to ``. Eg for a Payload app running on `http://localhost:3000`, the default serverURL would be `http://localhost:3000`.\n */\n serverURL?: string\n}\n\nexport type ContextProps = {\n /**\n * The slug for the addresses collection.\n *\n * Defaults to 'addresses'.\n */\n addressesSlug?: string\n api?: APIProps\n /**\n * The slug for the carts collection.\n *\n * Defaults to 'carts'.\n */\n cartsSlug?: string\n children?: React.ReactNode\n /**\n * The configuration for currencies used in the ecommerce context.\n * This is used to handle currency formatting and calculations, defaults to USD.\n */\n currenciesConfig?: CurrenciesConfig\n /**\n * The slug for the customers collection.\n *\n * Defaults to 'users'.\n */\n customersSlug?: string\n /**\n * Enable debug mode for the ecommerce context. This will log additional information to the console.\n * Defaults to false.\n */\n debug?: boolean\n /**\n * Whether to enable support for variants in the cart.\n * This allows adding products with specific variants to the cart.\n * Defaults to false.\n */\n enableVariants?: boolean\n /**\n * Supported payment methods for the ecommerce context.\n */\n paymentMethods?: PaymentAdapterClient[]\n /**\n * Whether to enable localStorage for cart persistence.\n * Defaults to true.\n */\n syncLocalStorage?: boolean | SyncLocalStorageConfig\n}\n\n/**\n * Type used internally to represent the cart item to be added.\n */\ntype CartItemArgument = {\n /**\n * The ID of the product to add to the cart. Always required.\n */\n product: DefaultDocumentIDType\n /**\n * The ID of the variant to add to the cart. Optional, if not provided, the product will be added without a variant.\n */\n variant?: DefaultDocumentIDType\n}\n\nexport type EcommerceContext = {\n /**\n * Add an item to the cart.\n */\n addItem: (item: CartItemArgument, quantity?: number) => Promise<void>\n /**\n * All current addresses for the current user.\n * This is used to manage shipping and billing addresses.\n */\n addresses?: TypedCollection['addresses'][]\n /**\n * The current data of the cart.\n */\n // @ts-ignore\n cart?: GeneratedTypes['collections']['carts']\n /**\n * The ID of the current cart corresponding to the cart in the database or local storage.\n */\n cartID?: DefaultDocumentIDType\n /**\n * Clear the cart, removing all items.\n */\n clearCart: () => Promise<void>\n /**\n * Initiate a payment using the selected payment method.\n * This method should be called after the cart is ready for checkout.\n * It requires the payment method ID and any necessary payment data.\n */\n confirmOrder: (\n paymentMethodID: string,\n options?: { additionalData: Record<string, unknown> },\n ) => Promise<unknown>\n /**\n * Create a new address by providing the data.\n */\n createAddress: (data: Partial<TypedCollection['addresses']>) => Promise<void>\n /**\n * The configuration for the currencies used in the ecommerce context.\n */\n currenciesConfig: CurrenciesConfig\n /**\n * The currently selected currency used for the cart and price formatting automatically.\n */\n currency: Currency\n /**\n * Decrement an item in the cart by its index ID.\n * If quantity reaches 0, the item will be removed from the cart.\n */\n decrementItem: (item: DefaultDocumentIDType) => Promise<void>\n /**\n * Increment an item in the cart by its index ID.\n */\n incrementItem: (item: DefaultDocumentIDType) => Promise<void>\n /**\n * Initiate a payment using the selected payment method.\n * This method should be called after the cart is ready for checkout.\n * It requires the payment method ID and any necessary payment data.\n */\n initiatePayment: (\n paymentMethodID: string,\n options?: { additionalData: Record<string, unknown> },\n ) => Promise<unknown>\n paymentMethods: PaymentAdapterClient[]\n /**\n * Remove an item from the cart by its index ID.\n */\n removeItem: (item: DefaultDocumentIDType) => Promise<void>\n /**\n * The name of the currently selected payment method.\n * This is used to determine which payment method to use when initiating a payment.\n */\n selectedPaymentMethod?: null | string\n /**\n * Change the currency for the cart, it defaults to the configured currency.\n * This will update the currency used for pricing and calculations.\n */\n setCurrency: (currency: string) => void\n /**\n * Update an address by providing the data and the ID.\n */\n updateAddress: (\n addressID: DefaultDocumentIDType,\n data: Partial<TypedCollection['addresses']>,\n ) => Promise<void>\n}\n"],"names":[],"mappings":"AAmGA,WAoFC"}
@@ -1,4 +1,4 @@
1
- import type { Currency } from '../../types/index.js';
1
+ import type { Currency } from '../../types.js';
2
2
  /**
3
3
  * Convert base value to display value with decimal point (e.g., 2500 to $25.00)
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../../src/react/provider/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,oBAAoB,6BAG9B;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAA;CACnB,KAAG,MAUH,CAAA"}
1
+ {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../../src/react/provider/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C;;GAEG;AACH,eAAO,MAAM,oBAAoB,6BAG9B;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAA;CACnB,KAAG,MAUH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/react/provider/utilities.ts"],"sourcesContent":["import type { Currency } from '../../types/index.js'\n\n/**\n * Convert base value to display value with decimal point (e.g., 2500 to $25.00)\n */\nexport const convertFromBaseValue = ({\n baseValue,\n currency,\n}: {\n baseValue: number\n currency: Currency\n}): string => {\n if (!currency) {\n return baseValue.toString()\n }\n\n // Convert from base value (e.g., cents) to decimal value (e.g., dollars)\n const decimalValue = baseValue / Math.pow(10, currency.decimals)\n\n // Format with the correct number of decimal places\n return decimalValue.toFixed(currency.decimals)\n}\n"],"names":["convertFromBaseValue","baseValue","currency","toString","decimalValue","Math","pow","decimals","toFixed"],"mappings":"AAEA;;CAEC,GACD,OAAO,MAAMA,uBAAuB,CAAC,EACnCC,SAAS,EACTC,QAAQ,EAIT;IACC,IAAI,CAACA,UAAU;QACb,OAAOD,UAAUE,QAAQ;IAC3B;IAEA,yEAAyE;IACzE,MAAMC,eAAeH,YAAYI,KAAKC,GAAG,CAAC,IAAIJ,SAASK,QAAQ;IAE/D,mDAAmD;IACnD,OAAOH,aAAaI,OAAO,CAACN,SAASK,QAAQ;AAC/C,EAAC"}
1
+ {"version":3,"sources":["../../../src/react/provider/utilities.ts"],"sourcesContent":["import type { Currency } from '../../types.js'\n\n/**\n * Convert base value to display value with decimal point (e.g., 2500 to $25.00)\n */\nexport const convertFromBaseValue = ({\n baseValue,\n currency,\n}: {\n baseValue: number\n currency: Currency\n}): string => {\n if (!currency) {\n return baseValue.toString()\n }\n\n // Convert from base value (e.g., cents) to decimal value (e.g., dollars)\n const decimalValue = baseValue / Math.pow(10, currency.decimals)\n\n // Format with the correct number of decimal places\n return decimalValue.toFixed(currency.decimals)\n}\n"],"names":["convertFromBaseValue","baseValue","currency","toString","decimalValue","Math","pow","decimals","toFixed"],"mappings":"AAEA;;CAEC,GACD,OAAO,MAAMA,uBAAuB,CAAC,EACnCC,SAAS,EACTC,QAAQ,EAIT;IACC,IAAI,CAACA,UAAU;QACb,OAAOD,UAAUE,QAAQ;IAC3B;IAEA,yEAAyE;IACzE,MAAMC,eAAeH,YAAYI,KAAKC,GAAG,CAAC,IAAIJ,SAASK,QAAQ;IAE/D,mDAAmD;IACnD,OAAOH,aAAaI,OAAO,CAACN,SAASK,QAAQ;AAC/C,EAAC"}