@payloadcms/plugin-ecommerce 0.0.1-beta.0 → 3.57.0-internal.36ffe2b

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 (284) hide show
  1. package/dist/collections/addresses/createAddressesCollection.d.ts +21 -0
  2. package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -0
  3. package/dist/collections/addresses/createAddressesCollection.js +71 -0
  4. package/dist/collections/addresses/createAddressesCollection.js.map +1 -0
  5. package/dist/collections/addresses/defaultAddressFields.d.ts +3 -0
  6. package/dist/collections/addresses/defaultAddressFields.d.ts.map +1 -0
  7. package/dist/collections/addresses/defaultAddressFields.js +72 -0
  8. package/dist/collections/addresses/defaultAddressFields.js.map +1 -0
  9. package/dist/collections/addresses/defaultCountries.d.ts +9 -0
  10. package/dist/collections/addresses/defaultCountries.d.ts.map +1 -0
  11. package/dist/collections/addresses/defaultCountries.js +169 -0
  12. package/dist/collections/addresses/defaultCountries.js.map +1 -0
  13. package/dist/collections/addresses/hooks/beforeChange.d.ts +8 -0
  14. package/dist/collections/addresses/hooks/beforeChange.d.ts.map +1 -0
  15. package/dist/collections/addresses/hooks/beforeChange.js +12 -0
  16. package/dist/collections/addresses/hooks/beforeChange.js.map +1 -0
  17. package/dist/collections/carts/beforeChange.d.ts +8 -0
  18. package/dist/collections/carts/beforeChange.d.ts.map +1 -0
  19. package/dist/collections/carts/beforeChange.js +37 -0
  20. package/dist/collections/carts/beforeChange.js.map +1 -0
  21. package/dist/collections/carts/createCartsCollection.d.ts +29 -0
  22. package/dist/collections/carts/createCartsCollection.d.ts.map +1 -0
  23. package/dist/collections/carts/createCartsCollection.js +138 -0
  24. package/dist/collections/carts/createCartsCollection.js.map +1 -0
  25. package/dist/collections/carts/statusBeforeRead.d.ts +3 -0
  26. package/dist/collections/carts/statusBeforeRead.d.ts.map +1 -0
  27. package/dist/collections/carts/statusBeforeRead.js +18 -0
  28. package/dist/collections/carts/statusBeforeRead.js.map +1 -0
  29. package/dist/collections/orders/createOrdersCollection.d.ts +34 -0
  30. package/dist/collections/orders/createOrdersCollection.d.ts.map +1 -0
  31. package/dist/collections/orders/createOrdersCollection.js +162 -0
  32. package/dist/collections/orders/createOrdersCollection.js.map +1 -0
  33. package/dist/collections/products/createProductsCollection.d.ts +26 -0
  34. package/dist/collections/products/createProductsCollection.d.ts.map +1 -0
  35. package/dist/collections/products/createProductsCollection.js +62 -0
  36. package/dist/collections/products/createProductsCollection.js.map +1 -0
  37. package/dist/collections/transactions/createTransactionsCollection.d.ts +40 -0
  38. package/dist/collections/transactions/createTransactionsCollection.d.ts.map +1 -0
  39. package/dist/collections/transactions/createTransactionsCollection.js +157 -0
  40. package/dist/collections/transactions/createTransactionsCollection.js.map +1 -0
  41. package/dist/collections/variants/createVariantOptionsCollection.d.ts +15 -0
  42. package/dist/collections/variants/createVariantOptionsCollection.d.ts.map +1 -0
  43. package/dist/collections/variants/createVariantOptionsCollection.js +53 -0
  44. package/dist/collections/variants/createVariantOptionsCollection.js.map +1 -0
  45. package/dist/collections/variants/createVariantTypesCollection.d.ts +15 -0
  46. package/dist/collections/variants/createVariantTypesCollection.d.ts.map +1 -0
  47. package/dist/collections/variants/createVariantTypesCollection.js +49 -0
  48. package/dist/collections/variants/createVariantTypesCollection.js.map +1 -0
  49. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts +8 -0
  50. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts.map +1 -0
  51. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js +38 -0
  52. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js.map +1 -0
  53. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts +7 -0
  54. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts.map +1 -0
  55. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js +53 -0
  56. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js.map +1 -0
  57. package/dist/collections/variants/createVariantsCollection/index.d.ts +24 -0
  58. package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -0
  59. package/dist/collections/variants/createVariantsCollection/index.js +101 -0
  60. package/dist/collections/variants/createVariantsCollection/index.js.map +1 -0
  61. package/dist/currencies/index.d.ts +5 -0
  62. package/dist/currencies/index.d.ts.map +1 -0
  63. package/dist/currencies/index.js +20 -0
  64. package/dist/currencies/index.js.map +1 -0
  65. package/dist/endpoints/confirmOrder.d.ts +42 -0
  66. package/dist/endpoints/confirmOrder.d.ts.map +1 -0
  67. package/dist/endpoints/confirmOrder.js +143 -0
  68. package/dist/endpoints/confirmOrder.js.map +1 -0
  69. package/dist/endpoints/initiatePayment.d.ts +43 -0
  70. package/dist/endpoints/initiatePayment.d.ts.map +1 -0
  71. package/dist/endpoints/initiatePayment.js +220 -0
  72. package/dist/endpoints/initiatePayment.js.map +1 -0
  73. package/dist/exports/client/index.d.ts +3 -0
  74. package/dist/exports/client/index.d.ts.map +1 -0
  75. package/dist/exports/client/index.js +4 -0
  76. package/dist/exports/client/index.js.map +1 -0
  77. package/dist/exports/client/react.d.ts +4 -0
  78. package/dist/exports/client/react.d.ts.map +1 -0
  79. package/dist/exports/client/react.js +5 -0
  80. package/dist/exports/client/react.js.map +1 -0
  81. package/dist/exports/payments/stripe.d.ts +2 -0
  82. package/dist/exports/payments/stripe.d.ts.map +1 -0
  83. package/dist/exports/payments/stripe.js +3 -0
  84. package/dist/exports/payments/stripe.js.map +1 -0
  85. package/dist/exports/rsc.d.ts +3 -0
  86. package/dist/exports/rsc.d.ts.map +1 -0
  87. package/dist/exports/rsc.js +4 -0
  88. package/dist/exports/rsc.js.map +1 -0
  89. package/dist/exports/translations.d.ts +2 -0
  90. package/dist/exports/translations.d.ts.map +1 -0
  91. package/dist/exports/translations.js +3 -0
  92. package/dist/exports/translations.js.map +1 -0
  93. package/dist/exports/types.d.ts +2 -0
  94. package/dist/exports/types.d.ts.map +1 -0
  95. package/dist/exports/types.js +3 -0
  96. package/dist/exports/types.js.map +1 -0
  97. package/dist/fields/amountField.d.ts +13 -0
  98. package/dist/fields/amountField.d.ts.map +1 -0
  99. package/dist/fields/amountField.js +33 -0
  100. package/dist/fields/amountField.js.map +1 -0
  101. package/dist/fields/cartItemsField.d.ts +26 -0
  102. package/dist/fields/cartItemsField.d.ts.map +1 -0
  103. package/dist/fields/cartItemsField.js +55 -0
  104. package/dist/fields/cartItemsField.js.map +1 -0
  105. package/dist/fields/currencyField.d.ts +9 -0
  106. package/dist/fields/currencyField.d.ts.map +1 -0
  107. package/dist/fields/currencyField.js +29 -0
  108. package/dist/fields/currencyField.js.map +1 -0
  109. package/dist/fields/inventoryField.d.ts +7 -0
  110. package/dist/fields/inventoryField.d.ts.map +1 -0
  111. package/dist/fields/inventoryField.js +16 -0
  112. package/dist/fields/inventoryField.js.map +1 -0
  113. package/dist/fields/pricesField.d.ts +12 -0
  114. package/dist/fields/pricesField.d.ts.map +1 -0
  115. package/dist/fields/pricesField.js +54 -0
  116. package/dist/fields/pricesField.js.map +1 -0
  117. package/dist/fields/statusField.d.ts +8 -0
  118. package/dist/fields/statusField.d.ts.map +1 -0
  119. package/dist/fields/statusField.js +49 -0
  120. package/dist/fields/statusField.js.map +1 -0
  121. package/dist/fields/variantsFields.d.ts +14 -0
  122. package/dist/fields/variantsFields.d.ts.map +1 -0
  123. package/dist/fields/variantsFields.js +48 -0
  124. package/dist/fields/variantsFields.js.map +1 -0
  125. package/dist/index.d.ts +19 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +238 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/payments/adapters/stripe/confirmOrder.d.ts +11 -0
  130. package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -0
  131. package/dist/payments/adapters/stripe/confirmOrder.js +101 -0
  132. package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -0
  133. package/dist/payments/adapters/stripe/endpoints/webhooks.d.ts +13 -0
  134. package/dist/payments/adapters/stripe/endpoints/webhooks.d.ts.map +1 -0
  135. package/dist/payments/adapters/stripe/endpoints/webhooks.js +53 -0
  136. package/dist/payments/adapters/stripe/endpoints/webhooks.js.map +1 -0
  137. package/dist/payments/adapters/stripe/index.d.ts +60 -0
  138. package/dist/payments/adapters/stripe/index.d.ts.map +1 -0
  139. package/dist/payments/adapters/stripe/index.js +68 -0
  140. package/dist/payments/adapters/stripe/index.js.map +1 -0
  141. package/dist/payments/adapters/stripe/initiatePayment.d.ts +11 -0
  142. package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -0
  143. package/dist/payments/adapters/stripe/initiatePayment.js +102 -0
  144. package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -0
  145. package/dist/react/provider/index.d.ts +41 -0
  146. package/dist/react/provider/index.d.ts.map +1 -0
  147. package/dist/react/provider/index.js +790 -0
  148. package/dist/react/provider/index.js.map +1 -0
  149. package/dist/react/provider/types.d.ts +171 -0
  150. package/dist/react/provider/types.d.ts.map +1 -0
  151. package/dist/react/provider/types.js +3 -0
  152. package/dist/react/provider/types.js.map +1 -0
  153. package/dist/react/provider/utilities.d.ts +9 -0
  154. package/dist/react/provider/utilities.d.ts.map +1 -0
  155. package/dist/react/provider/utilities.js +13 -0
  156. package/dist/react/provider/utilities.js.map +1 -0
  157. package/dist/translations/en.d.ts +3 -0
  158. package/dist/translations/en.d.ts.map +1 -0
  159. package/dist/translations/en.js +86 -0
  160. package/dist/translations/en.js.map +1 -0
  161. package/dist/translations/index.d.ts +7 -0
  162. package/dist/translations/index.d.ts.map +1 -0
  163. package/dist/translations/index.js +6 -0
  164. package/dist/translations/index.js.map +1 -0
  165. package/dist/types.d.ts +658 -0
  166. package/dist/types.d.ts.map +1 -0
  167. package/dist/types.js +3 -0
  168. package/dist/types.js.map +1 -0
  169. package/dist/ui/PriceCell/index.d.ts +12 -0
  170. package/dist/ui/PriceCell/index.d.ts.map +1 -0
  171. package/dist/ui/PriceCell/index.js +38 -0
  172. package/dist/ui/PriceCell/index.js.map +1 -0
  173. package/dist/ui/PriceInput/FormattedInput.d.ts +17 -0
  174. package/dist/ui/PriceInput/FormattedInput.d.ts.map +1 -0
  175. package/dist/ui/PriceInput/FormattedInput.js +146 -0
  176. package/dist/ui/PriceInput/FormattedInput.js.map +1 -0
  177. package/{src/ui/PriceInput/index.scss → dist/ui/PriceInput/index.css} +7 -0
  178. package/dist/ui/PriceInput/index.d.ts +11 -0
  179. package/dist/ui/PriceInput/index.d.ts.map +1 -0
  180. package/dist/ui/PriceInput/index.js +20 -0
  181. package/dist/ui/PriceInput/index.js.map +1 -0
  182. package/dist/ui/PriceRowLabel/index.d.ts +8 -0
  183. package/dist/ui/PriceRowLabel/index.d.ts.map +1 -0
  184. package/dist/ui/PriceRowLabel/index.js +66 -0
  185. package/dist/ui/PriceRowLabel/index.js.map +1 -0
  186. package/dist/ui/VariantOptionsSelector/ErrorBox.d.ts +8 -0
  187. package/dist/ui/VariantOptionsSelector/ErrorBox.d.ts.map +1 -0
  188. package/dist/ui/VariantOptionsSelector/ErrorBox.js +28 -0
  189. package/dist/ui/VariantOptionsSelector/ErrorBox.js.map +1 -0
  190. package/dist/ui/VariantOptionsSelector/OptionsSelect.d.ts +13 -0
  191. package/dist/ui/VariantOptionsSelector/OptionsSelect.d.ts.map +1 -0
  192. package/dist/ui/VariantOptionsSelector/OptionsSelect.js +71 -0
  193. package/dist/ui/VariantOptionsSelector/OptionsSelect.js.map +1 -0
  194. package/dist/ui/VariantOptionsSelector/index.d.ts +6 -0
  195. package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -0
  196. package/dist/ui/VariantOptionsSelector/index.js +78 -0
  197. package/dist/ui/VariantOptionsSelector/index.js.map +1 -0
  198. package/dist/ui/utilities.d.ts +16 -0
  199. package/dist/ui/utilities.d.ts.map +1 -0
  200. package/dist/ui/utilities.js +26 -0
  201. package/dist/ui/utilities.js.map +1 -0
  202. package/dist/utilities/defaultProductsValidation.d.ts +3 -0
  203. package/dist/utilities/defaultProductsValidation.d.ts.map +1 -0
  204. package/dist/utilities/defaultProductsValidation.js +40 -0
  205. package/dist/utilities/defaultProductsValidation.js.map +1 -0
  206. package/dist/utilities/errorCodes.d.ts +3 -0
  207. package/dist/utilities/errorCodes.d.ts.map +1 -0
  208. package/dist/utilities/errorCodes.js +4 -0
  209. package/dist/utilities/errorCodes.js.map +1 -0
  210. package/dist/utilities/getCollectionSlugMap.d.ts +11 -0
  211. package/dist/utilities/getCollectionSlugMap.d.ts.map +1 -0
  212. package/dist/utilities/getCollectionSlugMap.js +25 -0
  213. package/dist/utilities/getCollectionSlugMap.js.map +1 -0
  214. package/dist/utilities/sanitizePluginConfig.d.ts +7 -0
  215. package/dist/utilities/sanitizePluginConfig.d.ts.map +1 -0
  216. package/dist/utilities/sanitizePluginConfig.js +67 -0
  217. package/dist/utilities/sanitizePluginConfig.js.map +1 -0
  218. package/package.json +98 -1
  219. package/.prettierignore +0 -12
  220. package/.swcrc +0 -24
  221. package/eslint.config.js +0 -18
  222. package/src/addresses/addressesCollection.ts +0 -76
  223. package/src/addresses/defaultAddressFields.ts +0 -83
  224. package/src/addresses/defaultCountries.ts +0 -50
  225. package/src/carts/beforeChange.ts +0 -51
  226. package/src/carts/cartsCollection.ts +0 -146
  227. package/src/currencies/index.ts +0 -29
  228. package/src/endpoints/confirmOrder.ts +0 -312
  229. package/src/endpoints/initiatePayment.ts +0 -322
  230. package/src/exports/addresses.ts +0 -2
  231. package/src/exports/currencies.ts +0 -1
  232. package/src/exports/fields.ts +0 -5
  233. package/src/exports/orders.ts +0 -1
  234. package/src/exports/payments/stripe.ts +0 -1
  235. package/src/exports/plugin.ts +0 -1
  236. package/src/exports/products.ts +0 -1
  237. package/src/exports/react.ts +0 -8
  238. package/src/exports/transactions.ts +0 -1
  239. package/src/exports/translations.ts +0 -1
  240. package/src/exports/types.ts +0 -7
  241. package/src/exports/ui.ts +0 -3
  242. package/src/exports/variants.ts +0 -5
  243. package/src/fields/amountField.ts +0 -43
  244. package/src/fields/cartItemsField.ts +0 -84
  245. package/src/fields/currencyField.ts +0 -39
  246. package/src/fields/inventoryField.ts +0 -22
  247. package/src/fields/pricesField.ts +0 -65
  248. package/src/fields/statusField.ts +0 -57
  249. package/src/fields/variantsFields.ts +0 -56
  250. package/src/index.ts +0 -275
  251. package/src/orders/ordersCollection.ts +0 -157
  252. package/src/payments/adapters/stripe/confirmOrder.ts +0 -123
  253. package/src/payments/adapters/stripe/endpoints/webhooks.ts +0 -69
  254. package/src/payments/adapters/stripe/index.ts +0 -135
  255. package/src/payments/adapters/stripe/initiatePayment.ts +0 -131
  256. package/src/products/productsCollection.ts +0 -78
  257. package/src/react/provider/index.tsx +0 -893
  258. package/src/react/provider/types.ts +0 -184
  259. package/src/react/provider/utilities.ts +0 -22
  260. package/src/transactions/transactionsCollection.ts +0 -166
  261. package/src/translations/en.ts +0 -64
  262. package/src/translations/index.ts +0 -11
  263. package/src/types.ts +0 -403
  264. package/src/ui/PriceInput/FormattedInput.tsx +0 -134
  265. package/src/ui/PriceInput/index.tsx +0 -43
  266. package/src/ui/PriceInput/utilities.ts +0 -46
  267. package/src/ui/PriceRowLabel/index.tsx +0 -56
  268. package/src/ui/VariantOptionsSelector/ErrorBox.tsx +0 -27
  269. package/src/ui/VariantOptionsSelector/OptionsSelect.tsx +0 -78
  270. package/src/ui/VariantOptionsSelector/index.tsx +0 -83
  271. package/src/utilities/defaultProductsValidation.ts +0 -42
  272. package/src/utilities/errorCodes.ts +0 -14
  273. package/src/utilities/getCollectionSlugMap.ts +0 -84
  274. package/src/utilities/sanitizePluginConfig.ts +0 -80
  275. package/src/variants/variantOptionsCollection.ts +0 -59
  276. package/src/variants/variantTypesCollection.ts +0 -55
  277. package/src/variants/variantsCollection/hooks/beforeChange.ts +0 -47
  278. package/src/variants/variantsCollection/hooks/validateOptions.ts +0 -72
  279. package/src/variants/variantsCollection/index.ts +0 -119
  280. package/tsconfig.json +0 -7
  281. package/tsconfig.tsbuildinfo +0 -1
  282. /package/{src → dist}/translations/translation-schema.json +0 -0
  283. /package/{src → dist}/ui/PriceRowLabel/index.css +0 -0
  284. /package/{src → dist}/ui/VariantOptionsSelector/index.css +0 -0
@@ -0,0 +1,790 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { deepMergeSimple } from 'payload/shared';
4
+ import * as qs from 'qs-esm';
5
+ import React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ const defaultContext = {
7
+ addItem: async ()=>{},
8
+ clearCart: async ()=>{},
9
+ confirmOrder: async ()=>{},
10
+ createAddress: async ()=>{},
11
+ currenciesConfig: {
12
+ defaultCurrency: 'USD',
13
+ supportedCurrencies: [
14
+ {
15
+ code: 'USD',
16
+ decimals: 2,
17
+ label: 'US Dollar',
18
+ symbol: '$'
19
+ }
20
+ ]
21
+ },
22
+ currency: {
23
+ code: 'USD',
24
+ decimals: 2,
25
+ label: 'US Dollar',
26
+ symbol: '$'
27
+ },
28
+ decrementItem: async ()=>{},
29
+ incrementItem: async ()=>{},
30
+ initiatePayment: async ()=>{},
31
+ paymentMethods: [],
32
+ removeItem: async ()=>{},
33
+ setCurrency: ()=>{},
34
+ updateAddress: async ()=>{}
35
+ };
36
+ const EcommerceContext = /*#__PURE__*/ createContext(defaultContext);
37
+ const defaultLocalStorage = {
38
+ key: 'cart'
39
+ };
40
+ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug = 'carts', children, currenciesConfig = {
41
+ defaultCurrency: 'USD',
42
+ supportedCurrencies: [
43
+ {
44
+ code: 'USD',
45
+ decimals: 2,
46
+ label: 'US Dollar',
47
+ symbol: '$'
48
+ }
49
+ ]
50
+ }, customersSlug = 'users', debug = false, paymentMethods = [], syncLocalStorage = true })=>{
51
+ const localStorageConfig = syncLocalStorage && typeof syncLocalStorage === 'object' ? {
52
+ ...defaultLocalStorage,
53
+ ...syncLocalStorage
54
+ } : defaultLocalStorage;
55
+ const { apiRoute = '/api', cartsFetchQuery = {}, serverURL = '' } = api || {};
56
+ const baseAPIURL = `${serverURL}${apiRoute}`;
57
+ const [user, setUser] = useState(null);
58
+ const [addresses, setAddresses] = useState();
59
+ const hasRendered = useRef(false);
60
+ /**
61
+ * The ID of the cart associated with the current session.
62
+ * This is used to identify the cart in the database or local storage.
63
+ * It can be null if no cart has been created yet.
64
+ */ const [cartID, setCartID] = useState();
65
+ // @ts-ignore
66
+ const [cart, setCart] = useState();
67
+ const [selectedCurrency, setSelectedCurrency] = useState(()=>currenciesConfig.supportedCurrencies.find((c)=>c.code === currenciesConfig.defaultCurrency));
68
+ const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);
69
+ const cartQuery = useMemo(()=>{
70
+ const priceField = `priceIn${selectedCurrency.code}`;
71
+ const baseQuery = {
72
+ depth: 0,
73
+ populate: {
74
+ products: {
75
+ [priceField]: true
76
+ },
77
+ variants: {
78
+ options: true,
79
+ [priceField]: true
80
+ }
81
+ },
82
+ select: {
83
+ items: true,
84
+ subtotal: true
85
+ }
86
+ };
87
+ return deepMergeSimple(baseQuery, cartsFetchQuery);
88
+ }, [
89
+ selectedCurrency.code,
90
+ cartsFetchQuery
91
+ ]);
92
+ const createCart = useCallback(async (initialData)=>{
93
+ const query = qs.stringify(cartQuery);
94
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}?${query}`, {
95
+ body: JSON.stringify({
96
+ ...initialData,
97
+ currency: selectedCurrency.code,
98
+ customer: user?.id
99
+ }),
100
+ credentials: 'include',
101
+ headers: {
102
+ 'Content-Type': 'application/json'
103
+ },
104
+ method: 'POST'
105
+ });
106
+ if (!response.ok) {
107
+ const errorText = await response.text();
108
+ throw new Error(`Failed to create cart: ${errorText}`);
109
+ }
110
+ const data = await response.json();
111
+ if (data.error) {
112
+ throw new Error(`Cart creation error: ${data.error}`);
113
+ }
114
+ return data.doc;
115
+ }, [
116
+ baseAPIURL,
117
+ cartQuery,
118
+ cartsSlug,
119
+ selectedCurrency.code,
120
+ user?.id
121
+ ]);
122
+ const getCart = useCallback(async (cartID)=>{
123
+ const query = qs.stringify(cartQuery);
124
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {
125
+ credentials: 'include',
126
+ headers: {
127
+ 'Content-Type': 'application/json'
128
+ },
129
+ method: 'GET'
130
+ });
131
+ if (!response.ok) {
132
+ const errorText = await response.text();
133
+ throw new Error(`Failed to fetch cart: ${errorText}`);
134
+ }
135
+ const data = await response.json();
136
+ if (data.error) {
137
+ throw new Error(`Cart fetch error: ${data.error}`);
138
+ }
139
+ return data;
140
+ }, [
141
+ baseAPIURL,
142
+ cartQuery,
143
+ cartsSlug
144
+ ]);
145
+ const updateCart = useCallback(async (cartID, data)=>{
146
+ const query = qs.stringify(cartQuery);
147
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}?${query}`, {
148
+ body: JSON.stringify(data),
149
+ credentials: 'include',
150
+ headers: {
151
+ 'Content-Type': 'application/json'
152
+ },
153
+ method: 'PATCH'
154
+ });
155
+ if (!response.ok) {
156
+ const errorText = await response.text();
157
+ throw new Error(`Failed to update cart: ${errorText}`);
158
+ }
159
+ const updatedCart = await response.json();
160
+ setCart(updatedCart.doc);
161
+ }, [
162
+ baseAPIURL,
163
+ cartQuery,
164
+ cartsSlug
165
+ ]);
166
+ const deleteCart = useCallback(async (cartID)=>{
167
+ const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}`, {
168
+ credentials: 'include',
169
+ headers: {
170
+ 'Content-Type': 'application/json'
171
+ },
172
+ method: 'DELETE'
173
+ });
174
+ if (!response.ok) {
175
+ const errorText = await response.text();
176
+ throw new Error(`Failed to update cart: ${errorText}`);
177
+ }
178
+ setCart(undefined);
179
+ setCartID(undefined);
180
+ }, [
181
+ baseAPIURL,
182
+ cartsSlug
183
+ ]);
184
+ useEffect(()=>{
185
+ if (hasRendered.current) {
186
+ if (syncLocalStorage && cartID) {
187
+ localStorage.setItem(localStorageConfig.key, cartID);
188
+ }
189
+ }
190
+ }, [
191
+ cartID,
192
+ localStorageConfig.key,
193
+ syncLocalStorage
194
+ ]);
195
+ const addItem = useCallback(async (item, quantity = 1)=>{
196
+ if (cartID) {
197
+ const existingCart = await getCart(cartID);
198
+ if (!existingCart) {
199
+ // console.error(`Cart with ID "${cartID}" not found`)
200
+ setCartID(undefined);
201
+ setCart(undefined);
202
+ return;
203
+ }
204
+ // Check if the item already exists in the cart
205
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>{
206
+ const productID = typeof cartItem.product === 'object' ? cartItem.product.id : item.product;
207
+ const variantID = cartItem.variant && typeof cartItem.variant === 'object' ? cartItem.variant.id : item.variant;
208
+ return productID === item.product && (item.variant && variantID ? variantID === item.variant : true);
209
+ });
210
+ let updatedItems = [
211
+ ...existingCart.items
212
+ ];
213
+ if (existingItemIndex !== -1) {
214
+ // If the item exists, update its quantity
215
+ updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity + quantity;
216
+ // Update the cart with the new items
217
+ await updateCart(cartID, {
218
+ items: updatedItems
219
+ });
220
+ } else {
221
+ // If the item does not exist, add it to the cart
222
+ updatedItems = [
223
+ ...existingCart.items,
224
+ {
225
+ ...item,
226
+ quantity
227
+ }
228
+ ];
229
+ }
230
+ // Update the cart with the new items
231
+ await updateCart(cartID, {
232
+ items: updatedItems
233
+ });
234
+ } else {
235
+ // If no cartID exists, create a new cart
236
+ const newCart = await createCart({
237
+ items: [
238
+ {
239
+ ...item,
240
+ quantity
241
+ }
242
+ ]
243
+ });
244
+ setCartID(newCart.id);
245
+ setCart(newCart);
246
+ }
247
+ }, [
248
+ cartID,
249
+ createCart,
250
+ getCart,
251
+ updateCart
252
+ ]);
253
+ const removeItem = useCallback(async (targetID)=>{
254
+ if (!cartID) {
255
+ return;
256
+ }
257
+ const existingCart = await getCart(cartID);
258
+ if (!existingCart) {
259
+ // console.error(`Cart with ID "${cartID}" not found`)
260
+ setCartID(undefined);
261
+ setCart(undefined);
262
+ return;
263
+ }
264
+ // Check if the item already exists in the cart
265
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>cartItem.id === targetID);
266
+ if (existingItemIndex !== -1) {
267
+ // If the item exists, remove it from the cart
268
+ const updatedItems = [
269
+ ...existingCart.items
270
+ ];
271
+ updatedItems.splice(existingItemIndex, 1);
272
+ // Update the cart with the new items
273
+ await updateCart(cartID, {
274
+ items: updatedItems
275
+ });
276
+ }
277
+ }, [
278
+ cartID,
279
+ getCart,
280
+ updateCart
281
+ ]);
282
+ const incrementItem = useCallback(async (targetID)=>{
283
+ if (!cartID) {
284
+ return;
285
+ }
286
+ const existingCart = await getCart(cartID);
287
+ if (!existingCart) {
288
+ // console.error(`Cart with ID "${cartID}" not found`)
289
+ setCartID(undefined);
290
+ setCart(undefined);
291
+ return;
292
+ }
293
+ // Check if the item already exists in the cart
294
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>cartItem.id === targetID);
295
+ let updatedItems = [
296
+ ...existingCart.items
297
+ ];
298
+ if (existingItemIndex !== -1) {
299
+ // If the item exists, increment its quantity
300
+ updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity + 1 // Increment by 1
301
+ ;
302
+ // Update the cart with the new items
303
+ await updateCart(cartID, {
304
+ items: updatedItems
305
+ });
306
+ } else {
307
+ // If the item does not exist, add it to the cart with quantity 1
308
+ updatedItems = [
309
+ ...existingCart.items,
310
+ {
311
+ product: targetID,
312
+ quantity: 1
313
+ }
314
+ ];
315
+ // Update the cart with the new items
316
+ await updateCart(cartID, {
317
+ items: updatedItems
318
+ });
319
+ }
320
+ }, [
321
+ cartID,
322
+ getCart,
323
+ updateCart
324
+ ]);
325
+ const decrementItem = useCallback(async (targetID)=>{
326
+ if (!cartID) {
327
+ return;
328
+ }
329
+ const existingCart = await getCart(cartID);
330
+ if (!existingCart) {
331
+ // console.error(`Cart with ID "${cartID}" not found`)
332
+ setCartID(undefined);
333
+ setCart(undefined);
334
+ return;
335
+ }
336
+ // Check if the item already exists in the cart
337
+ const existingItemIndex = existingCart.items.findIndex((cartItem)=>cartItem.id === targetID);
338
+ const updatedItems = [
339
+ ...existingCart.items
340
+ ];
341
+ if (existingItemIndex !== -1) {
342
+ // If the item exists, decrement its quantity
343
+ updatedItems[existingItemIndex].quantity = updatedItems[existingItemIndex].quantity - 1 // Decrement by 1
344
+ ;
345
+ // If the quantity reaches 0, remove the item from the cart
346
+ if (updatedItems[existingItemIndex].quantity <= 0) {
347
+ updatedItems.splice(existingItemIndex, 1);
348
+ }
349
+ // Update the cart with the new items
350
+ await updateCart(cartID, {
351
+ items: updatedItems
352
+ });
353
+ }
354
+ }, [
355
+ cartID,
356
+ getCart,
357
+ updateCart
358
+ ]);
359
+ const clearCart = useCallback(async ()=>{
360
+ if (cartID) {
361
+ await deleteCart(cartID);
362
+ }
363
+ }, [
364
+ cartID,
365
+ deleteCart
366
+ ]);
367
+ const setCurrency = useCallback((currency)=>{
368
+ if (selectedCurrency.code === currency) {
369
+ return;
370
+ }
371
+ const foundCurrency = currenciesConfig.supportedCurrencies.find((c)=>c.code === currency);
372
+ if (!foundCurrency) {
373
+ throw new Error(`Currency with code "${currency}" not found in config`);
374
+ }
375
+ setSelectedCurrency(foundCurrency);
376
+ }, [
377
+ currenciesConfig.supportedCurrencies,
378
+ selectedCurrency.code
379
+ ]);
380
+ const initiatePayment = useCallback(async (paymentMethodID, options)=>{
381
+ const paymentMethod = paymentMethods.find((method)=>method.name === paymentMethodID);
382
+ if (!paymentMethod) {
383
+ throw new Error(`Payment method with ID "${paymentMethodID}" not found`);
384
+ }
385
+ if (!cartID) {
386
+ throw new Error(`No cart is provided.`);
387
+ }
388
+ setSelectedPaymentMethod(paymentMethodID);
389
+ if (paymentMethod.initiatePayment) {
390
+ const fetchURL = `${baseAPIURL}/payments/${paymentMethodID}/initiate`;
391
+ const data = {
392
+ cartID,
393
+ currency: selectedCurrency.code
394
+ };
395
+ try {
396
+ const response = await fetch(fetchURL, {
397
+ body: JSON.stringify({
398
+ ...data,
399
+ ...options?.additionalData || {}
400
+ }),
401
+ credentials: 'include',
402
+ headers: {
403
+ 'Content-Type': 'application/json'
404
+ },
405
+ method: 'POST'
406
+ });
407
+ if (!response.ok) {
408
+ const responseError = await response.text();
409
+ throw new Error(responseError);
410
+ }
411
+ const responseData = await response.json();
412
+ if (responseData.error) {
413
+ throw new Error(responseData.error);
414
+ }
415
+ return responseData;
416
+ } catch (error) {
417
+ if (debug) {
418
+ // eslint-disable-next-line no-console
419
+ console.error('Error initiating payment:', error);
420
+ }
421
+ throw new Error(error instanceof Error ? error.message : 'Failed to initiate payment');
422
+ }
423
+ } else {
424
+ throw new Error(`Payment method "${paymentMethodID}" does not support payment initiation`);
425
+ }
426
+ }, [
427
+ baseAPIURL,
428
+ cartID,
429
+ debug,
430
+ paymentMethods,
431
+ selectedCurrency.code
432
+ ]);
433
+ const confirmOrder = useCallback(async (paymentMethodID, options)=>{
434
+ if (!cartID) {
435
+ throw new Error(`Cart is empty.`);
436
+ }
437
+ const paymentMethod = paymentMethods.find((pm)=>pm.name === paymentMethodID);
438
+ if (!paymentMethod) {
439
+ throw new Error(`Payment method with ID "${paymentMethodID}" not found`);
440
+ }
441
+ if (paymentMethod.confirmOrder) {
442
+ const fetchURL = `${baseAPIURL}/payments/${paymentMethodID}/confirm-order`;
443
+ const data = {
444
+ cartID,
445
+ currency: selectedCurrency.code
446
+ };
447
+ const response = await fetch(fetchURL, {
448
+ body: JSON.stringify({
449
+ ...data,
450
+ ...options?.additionalData || {}
451
+ }),
452
+ credentials: 'include',
453
+ headers: {
454
+ 'Content-Type': 'application/json'
455
+ },
456
+ method: 'POST'
457
+ });
458
+ if (!response.ok) {
459
+ const responseError = await response.text();
460
+ throw new Error(responseError);
461
+ }
462
+ const responseData = await response.json();
463
+ if (responseData.error) {
464
+ throw new Error(responseData.error);
465
+ }
466
+ return responseData;
467
+ } else {
468
+ throw new Error(`Payment method "${paymentMethodID}" does not support order confirmation`);
469
+ }
470
+ }, [
471
+ baseAPIURL,
472
+ cartID,
473
+ paymentMethods,
474
+ selectedCurrency.code
475
+ ]);
476
+ const getUser = useCallback(async ()=>{
477
+ try {
478
+ const query = qs.stringify({
479
+ depth: 0,
480
+ select: {
481
+ id: true,
482
+ carts: true
483
+ }
484
+ });
485
+ const response = await fetch(`${baseAPIURL}/${customersSlug}/me?${query}`, {
486
+ credentials: 'include',
487
+ headers: {
488
+ 'Content-Type': 'application/json'
489
+ },
490
+ method: 'GET'
491
+ });
492
+ if (!response.ok) {
493
+ const errorText = await response.text();
494
+ throw new Error(`Failed to fetch user: ${errorText}`);
495
+ }
496
+ const userData = await response.json();
497
+ if (userData.error) {
498
+ throw new Error(`User fetch error: ${userData.error}`);
499
+ }
500
+ if (userData.user) {
501
+ setUser(userData.user);
502
+ return userData.user;
503
+ }
504
+ } catch (error) {
505
+ if (debug) {
506
+ // eslint-disable-next-line no-console
507
+ console.error('Error fetching user:', error);
508
+ }
509
+ setUser(null);
510
+ throw new Error(`Failed to fetch user: ${error instanceof Error ? error.message : 'Unknown error'}`);
511
+ }
512
+ }, [
513
+ baseAPIURL,
514
+ customersSlug,
515
+ debug
516
+ ]);
517
+ const getAddresses = useCallback(async ()=>{
518
+ if (!user) {
519
+ return;
520
+ }
521
+ try {
522
+ const query = qs.stringify({
523
+ depth: 0,
524
+ limit: 0,
525
+ pagination: false
526
+ });
527
+ const response = await fetch(`${baseAPIURL}/${addressesSlug}?${query}`, {
528
+ credentials: 'include',
529
+ headers: {
530
+ 'Content-Type': 'application/json'
531
+ },
532
+ method: 'GET'
533
+ });
534
+ if (!response.ok) {
535
+ const errorText = await response.text();
536
+ throw new Error(errorText);
537
+ }
538
+ const data = await response.json();
539
+ if (data.error) {
540
+ throw new Error(`Address fetch error: ${data.error}`);
541
+ }
542
+ if (data.docs && data.docs.length > 0) {
543
+ setAddresses(data.docs);
544
+ }
545
+ } catch (error) {
546
+ if (debug) {
547
+ // eslint-disable-next-line no-console
548
+ console.error('Error fetching addresses:', error);
549
+ }
550
+ setAddresses(undefined);
551
+ throw new Error(`Failed to fetch addresses: ${error instanceof Error ? error.message : 'Unknown error'}`);
552
+ }
553
+ }, [
554
+ user,
555
+ baseAPIURL,
556
+ addressesSlug,
557
+ debug
558
+ ]);
559
+ const updateAddress = useCallback(async (addressID, address)=>{
560
+ if (!user) {
561
+ throw new Error('User must be logged in to update or create an address');
562
+ }
563
+ try {
564
+ const response = await fetch(`${baseAPIURL}/${addressesSlug}/${addressID}`, {
565
+ body: JSON.stringify(address),
566
+ credentials: 'include',
567
+ headers: {
568
+ 'Content-Type': 'application/json'
569
+ },
570
+ method: 'PATCH'
571
+ });
572
+ if (!response.ok) {
573
+ const errorText = await response.text();
574
+ throw new Error(`Failed to update or create address: ${errorText}`);
575
+ }
576
+ const data = await response.json();
577
+ if (data.error) {
578
+ throw new Error(`Address update/create error: ${data.error}`);
579
+ }
580
+ // Refresh addresses after updating or creating
581
+ await getAddresses();
582
+ } catch (error) {
583
+ if (debug) {
584
+ // eslint-disable-next-line no-console
585
+ console.error('Error updating or creating address:', error);
586
+ }
587
+ throw new Error(`Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`);
588
+ }
589
+ }, [
590
+ user,
591
+ baseAPIURL,
592
+ addressesSlug,
593
+ getAddresses,
594
+ debug
595
+ ]);
596
+ const createAddress = useCallback(async (address)=>{
597
+ if (!user) {
598
+ throw new Error('User must be logged in to update or create an address');
599
+ }
600
+ try {
601
+ const response = await fetch(`${baseAPIURL}/${addressesSlug}`, {
602
+ body: JSON.stringify(address),
603
+ credentials: 'include',
604
+ headers: {
605
+ 'Content-Type': 'application/json'
606
+ },
607
+ method: 'POST'
608
+ });
609
+ if (!response.ok) {
610
+ const errorText = await response.text();
611
+ throw new Error(`Failed to update or create address: ${errorText}`);
612
+ }
613
+ const data = await response.json();
614
+ if (data.error) {
615
+ throw new Error(`Address update/create error: ${data.error}`);
616
+ }
617
+ // Refresh addresses after updating or creating
618
+ await getAddresses();
619
+ } catch (error) {
620
+ if (debug) {
621
+ // eslint-disable-next-line no-console
622
+ console.error('Error updating or creating address:', error);
623
+ }
624
+ throw new Error(`Failed to update or create address: ${error instanceof Error ? error.message : 'Unknown error'}`);
625
+ }
626
+ }, [
627
+ user,
628
+ baseAPIURL,
629
+ addressesSlug,
630
+ getAddresses,
631
+ debug
632
+ ]);
633
+ // If localStorage is enabled, we can add logic to persist the cart state
634
+ useEffect(()=>{
635
+ if (!hasRendered.current) {
636
+ if (syncLocalStorage) {
637
+ const storedCart = localStorage.getItem(localStorageConfig.key);
638
+ if (storedCart) {
639
+ getCart(storedCart).then((fetchedCart)=>{
640
+ setCart(fetchedCart);
641
+ setCartID(storedCart);
642
+ }).catch((_)=>{
643
+ // console.error('Error fetching cart from localStorage:', error)
644
+ // If there's an error fetching the cart, we can clear it from localStorage
645
+ localStorage.removeItem(localStorageConfig.key);
646
+ setCartID(undefined);
647
+ setCart(undefined);
648
+ });
649
+ }
650
+ }
651
+ hasRendered.current = true;
652
+ void getUser().then((user)=>{
653
+ if (user && user.cart?.docs && user.cart.docs.length > 0) {
654
+ // If the user has carts, we can set the cartID to the first cart
655
+ const cartID = typeof user.cart.docs[0] === 'object' ? user.cart.docs[0].id : user.cart.docs[0];
656
+ if (cartID) {
657
+ getCart(cartID).then((fetchedCart)=>{
658
+ setCart(fetchedCart);
659
+ setCartID(cartID);
660
+ }).catch((error)=>{
661
+ if (debug) {
662
+ // eslint-disable-next-line no-console
663
+ console.error('Error fetching user cart:', error);
664
+ }
665
+ setCart(undefined);
666
+ setCartID(undefined);
667
+ throw new Error(`Failed to fetch user cart: ${error.message}`);
668
+ });
669
+ }
670
+ }
671
+ });
672
+ }
673
+ }, [
674
+ debug,
675
+ getAddresses,
676
+ getCart,
677
+ getUser,
678
+ localStorageConfig.key,
679
+ syncLocalStorage
680
+ ]);
681
+ useEffect(()=>{
682
+ if (user) {
683
+ // If the user is logged in, fetch their addresses
684
+ void getAddresses();
685
+ } else {
686
+ // If no user is logged in, clear addresses
687
+ setAddresses(undefined);
688
+ }
689
+ }, [
690
+ getAddresses,
691
+ user
692
+ ]);
693
+ return /*#__PURE__*/ _jsx(EcommerceContext, {
694
+ value: {
695
+ addItem,
696
+ addresses,
697
+ cart,
698
+ clearCart,
699
+ confirmOrder,
700
+ createAddress,
701
+ currenciesConfig,
702
+ currency: selectedCurrency,
703
+ decrementItem,
704
+ incrementItem,
705
+ initiatePayment,
706
+ paymentMethods,
707
+ removeItem,
708
+ selectedPaymentMethod,
709
+ setCurrency,
710
+ updateAddress
711
+ },
712
+ children: children
713
+ });
714
+ };
715
+ export const useEcommerce = ()=>{
716
+ const context = use(EcommerceContext);
717
+ if (!context) {
718
+ throw new Error('useEcommerce must be used within an EcommerceProvider');
719
+ }
720
+ return context;
721
+ };
722
+ export const useCurrency = ()=>{
723
+ const { currenciesConfig, currency, setCurrency } = useEcommerce();
724
+ const formatCurrency = useCallback((value, options)=>{
725
+ if (value === undefined || value === null) {
726
+ return '';
727
+ }
728
+ const currencyToUse = options?.currency || currency;
729
+ if (!currencyToUse) {
730
+ return value.toString();
731
+ }
732
+ if (value === 0) {
733
+ return `${currencyToUse.symbol}0.${'0'.repeat(currencyToUse.decimals)}`;
734
+ }
735
+ // Convert from base value (e.g., cents) to decimal value (e.g., dollars)
736
+ const decimalValue = value / Math.pow(10, currencyToUse.decimals);
737
+ // Format with the correct number of decimal places
738
+ return `${currencyToUse.symbol}${decimalValue.toFixed(currencyToUse.decimals)}`;
739
+ }, [
740
+ currency
741
+ ]);
742
+ if (!currency) {
743
+ throw new Error('useCurrency must be used within an EcommerceProvider');
744
+ }
745
+ return {
746
+ currency,
747
+ formatCurrency,
748
+ setCurrency,
749
+ supportedCurrencies: currenciesConfig.supportedCurrencies
750
+ };
751
+ };
752
+ export const useCart = ()=>{
753
+ const { addItem, cart, clearCart, decrementItem, incrementItem, removeItem } = useEcommerce();
754
+ if (!addItem) {
755
+ throw new Error('useCart must be used within an EcommerceProvider');
756
+ }
757
+ return {
758
+ addItem,
759
+ cart,
760
+ clearCart,
761
+ decrementItem,
762
+ incrementItem,
763
+ removeItem
764
+ };
765
+ };
766
+ export const usePayments = ()=>{
767
+ const { confirmOrder, initiatePayment, paymentMethods, selectedPaymentMethod } = useEcommerce();
768
+ if (!initiatePayment) {
769
+ throw new Error('usePayments must be used within an EcommerceProvider');
770
+ }
771
+ return {
772
+ confirmOrder,
773
+ initiatePayment,
774
+ paymentMethods,
775
+ selectedPaymentMethod
776
+ };
777
+ };
778
+ export const useAddresses = ()=>{
779
+ const { addresses, createAddress, updateAddress } = useEcommerce();
780
+ if (!createAddress) {
781
+ throw new Error('usePayments must be used within an EcommerceProvider');
782
+ }
783
+ return {
784
+ addresses,
785
+ createAddress,
786
+ updateAddress
787
+ };
788
+ };
789
+
790
+ //# sourceMappingURL=index.js.map