@payloadcms/plugin-ecommerce 0.0.1-beta.0 → 3.57.0-internal.46327a6

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