@payloadcms/plugin-ecommerce 4.0.0-internal.5b1e7cd → 4.0.0-internal.5e065b3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -1
- package/README.md +6 -0
- package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -1
- package/dist/collections/addresses/createAddressesCollection.js +1 -0
- package/dist/collections/addresses/createAddressesCollection.js.map +1 -1
- package/dist/collections/addresses/hooks/beforeChange.d.ts.map +1 -1
- package/dist/collections/addresses/hooks/beforeChange.js +3 -2
- package/dist/collections/addresses/hooks/beforeChange.js.map +1 -1
- package/dist/collections/carts/beforeChange.d.ts.map +1 -1
- package/dist/collections/carts/beforeChange.js +2 -0
- package/dist/collections/carts/beforeChange.js.map +1 -1
- package/dist/collections/carts/createCartsCollection.d.ts.map +1 -1
- package/dist/collections/carts/createCartsCollection.js +1 -0
- package/dist/collections/carts/createCartsCollection.js.map +1 -1
- package/dist/collections/orders/createOrdersCollection.d.ts.map +1 -1
- package/dist/collections/orders/createOrdersCollection.js +1 -0
- package/dist/collections/orders/createOrdersCollection.js.map +1 -1
- package/dist/collections/products/createProductsCollection.d.ts.map +1 -1
- package/dist/collections/products/createProductsCollection.js +1 -0
- package/dist/collections/products/createProductsCollection.js.map +1 -1
- package/dist/collections/transactions/createTransactionsCollection.d.ts.map +1 -1
- package/dist/collections/transactions/createTransactionsCollection.js +1 -0
- package/dist/collections/transactions/createTransactionsCollection.js.map +1 -1
- package/dist/collections/variants/createVariantOptionsCollection.d.ts.map +1 -1
- package/dist/collections/variants/createVariantOptionsCollection.js +1 -0
- package/dist/collections/variants/createVariantOptionsCollection.js.map +1 -1
- package/dist/collections/variants/createVariantTypesCollection.d.ts.map +1 -1
- package/dist/collections/variants/createVariantTypesCollection.js +1 -0
- package/dist/collections/variants/createVariantTypesCollection.js.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js +2 -0
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js +1 -0
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js.map +1 -1
- package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -1
- package/dist/collections/variants/createVariantsCollection/index.js +1 -0
- package/dist/collections/variants/createVariantsCollection/index.js.map +1 -1
- package/dist/endpoints/confirmOrder.d.ts.map +1 -1
- package/dist/endpoints/confirmOrder.js +306 -44
- package/dist/endpoints/confirmOrder.js.map +1 -1
- package/dist/endpoints/initiatePayment.d.ts.map +1 -1
- package/dist/endpoints/initiatePayment.js +2 -0
- package/dist/endpoints/initiatePayment.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/fields/pricesField.d.ts.map +1 -1
- package/dist/fields/pricesField.js +39 -39
- package/dist/fields/pricesField.js.map +1 -1
- package/dist/fields/statusField.d.ts.map +1 -1
- package/dist/fields/statusField.js +5 -0
- package/dist/fields/statusField.js.map +1 -1
- package/dist/fields/variantsFields.js +3 -1
- package/dist/fields/variantsFields.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -24
- package/dist/index.js.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.js +108 -75
- package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
- package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -1
- package/dist/payments/adapters/stripe/initiatePayment.js +1 -0
- package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -1
- package/dist/payments/adapters/stripe/validateSettlement.d.ts +37 -0
- package/dist/payments/adapters/stripe/validateSettlement.d.ts.map +1 -0
- package/dist/payments/adapters/stripe/validateSettlement.js +157 -0
- package/dist/payments/adapters/stripe/validateSettlement.js.map +1 -0
- package/dist/react/provider/index.d.ts.map +1 -1
- package/dist/react/provider/index.js +75 -34
- package/dist/react/provider/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/is.d.ts.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/ta.d.ts.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/types/index.d.ts +33 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/PriceInput/FormattedInput.js +2 -2
- package/dist/ui/PriceInput/FormattedInput.js.map +1 -1
- package/dist/ui/PriceInput/index.css +19 -31
- package/dist/ui/PriceInput/index.d.ts.map +1 -1
- package/dist/ui/PriceInput/index.js.map +1 -1
- package/dist/ui/PriceRowLabel/index.css +2 -2
- package/dist/ui/VariantOptionsSelector/index.css +8 -10
- package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -1
- package/dist/ui/VariantOptionsSelector/index.js +3 -1
- package/dist/ui/VariantOptionsSelector/index.js.map +1 -1
- package/dist/utilities/pushTypeScriptProperties.js +1 -1
- package/dist/utilities/pushTypeScriptProperties.js.map +1 -1
- package/package.json +10 -10
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js +0 -358
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js.map +0 -1
- package/dist/payments/adapters/stripe/confirmOrder.spec.js +0 -166
- package/dist/payments/adapters/stripe/confirmOrder.spec.js.map +0 -1
- package/dist/utilities/accessComposition.spec.js +0 -765
- package/dist/utilities/accessComposition.spec.js.map +0 -1
- package/dist/utilities/defaultProductsValidation.spec.js +0 -384
- package/dist/utilities/defaultProductsValidation.spec.js.map +0 -1
- package/dist/utilities/getCollectionSlugMap.spec.js +0 -254
- package/dist/utilities/getCollectionSlugMap.spec.js.map +0 -1
- package/dist/utilities/sanitizePluginConfig.spec.js +0 -516
- package/dist/utilities/sanitizePluginConfig.spec.js.map +0 -1
|
@@ -68,10 +68,6 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
68
68
|
...syncLocalStorage
|
|
69
69
|
} : defaultLocalStorage;
|
|
70
70
|
const { apiRoute = '/api', cartsFetchQuery = {} } = api || {};
|
|
71
|
-
const baseAPIURL = formatAdminURL({
|
|
72
|
-
apiRoute,
|
|
73
|
-
path: ''
|
|
74
|
-
});
|
|
75
71
|
const config = useMemo(()=>({
|
|
76
72
|
addressesSlug,
|
|
77
73
|
api: {
|
|
@@ -126,7 +122,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
126
122
|
]);
|
|
127
123
|
const createCart = useCallback(async (initialData)=>{
|
|
128
124
|
const query = qs.stringify(cartQuery);
|
|
129
|
-
const response = await fetch(
|
|
125
|
+
const response = await fetch(formatAdminURL({
|
|
126
|
+
apiRoute,
|
|
127
|
+
path: `/${cartsSlug}?${query}`
|
|
128
|
+
}), {
|
|
130
129
|
body: JSON.stringify({
|
|
131
130
|
...initialData,
|
|
132
131
|
currency: selectedCurrency.code,
|
|
@@ -152,7 +151,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
152
151
|
}
|
|
153
152
|
return data.doc;
|
|
154
153
|
}, [
|
|
155
|
-
|
|
154
|
+
apiRoute,
|
|
156
155
|
cartQuery,
|
|
157
156
|
cartsSlug,
|
|
158
157
|
selectedCurrency.code,
|
|
@@ -165,7 +164,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
165
164
|
secret: options.secret
|
|
166
165
|
} : {}
|
|
167
166
|
});
|
|
168
|
-
const response = await fetch(
|
|
167
|
+
const response = await fetch(formatAdminURL({
|
|
168
|
+
apiRoute,
|
|
169
|
+
path: `/${cartsSlug}/${cartID}?${query}`
|
|
170
|
+
}), {
|
|
169
171
|
credentials: 'include',
|
|
170
172
|
headers: {
|
|
171
173
|
'Content-Type': 'application/json'
|
|
@@ -182,7 +184,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
182
184
|
}
|
|
183
185
|
return data;
|
|
184
186
|
}, [
|
|
185
|
-
|
|
187
|
+
apiRoute,
|
|
186
188
|
cartQuery,
|
|
187
189
|
cartsSlug
|
|
188
190
|
]);
|
|
@@ -223,7 +225,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
223
225
|
try {
|
|
224
226
|
if (cartID) {
|
|
225
227
|
// Use server-side endpoint for adding items
|
|
226
|
-
const response = await fetch(
|
|
228
|
+
const response = await fetch(formatAdminURL({
|
|
229
|
+
apiRoute,
|
|
230
|
+
path: `/${cartsSlug}/${cartID}/add-item`
|
|
231
|
+
}), {
|
|
227
232
|
body: JSON.stringify({
|
|
228
233
|
item,
|
|
229
234
|
quantity,
|
|
@@ -274,7 +279,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
274
279
|
setIsLoading(false);
|
|
275
280
|
}
|
|
276
281
|
}, [
|
|
277
|
-
|
|
282
|
+
apiRoute,
|
|
278
283
|
cartID,
|
|
279
284
|
cartSecret,
|
|
280
285
|
cartsSlug,
|
|
@@ -288,7 +293,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
288
293
|
}
|
|
289
294
|
setIsLoading(true);
|
|
290
295
|
try {
|
|
291
|
-
const response = await fetch(
|
|
296
|
+
const response = await fetch(formatAdminURL({
|
|
297
|
+
apiRoute,
|
|
298
|
+
path: `/${cartsSlug}/${cartID}/remove-item`
|
|
299
|
+
}), {
|
|
292
300
|
body: JSON.stringify({
|
|
293
301
|
itemID: targetID,
|
|
294
302
|
secret: cartSecret
|
|
@@ -325,7 +333,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
325
333
|
setIsLoading(false);
|
|
326
334
|
}
|
|
327
335
|
}, [
|
|
328
|
-
|
|
336
|
+
apiRoute,
|
|
329
337
|
cartID,
|
|
330
338
|
cartSecret,
|
|
331
339
|
cartsSlug,
|
|
@@ -338,7 +346,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
338
346
|
}
|
|
339
347
|
setIsLoading(true);
|
|
340
348
|
try {
|
|
341
|
-
const response = await fetch(
|
|
349
|
+
const response = await fetch(formatAdminURL({
|
|
350
|
+
apiRoute,
|
|
351
|
+
path: `/${cartsSlug}/${cartID}/update-item`
|
|
352
|
+
}), {
|
|
342
353
|
body: JSON.stringify({
|
|
343
354
|
itemID: targetID,
|
|
344
355
|
quantity: {
|
|
@@ -378,7 +389,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
378
389
|
setIsLoading(false);
|
|
379
390
|
}
|
|
380
391
|
}, [
|
|
381
|
-
|
|
392
|
+
apiRoute,
|
|
382
393
|
cartID,
|
|
383
394
|
cartSecret,
|
|
384
395
|
cartsSlug,
|
|
@@ -391,7 +402,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
391
402
|
}
|
|
392
403
|
setIsLoading(true);
|
|
393
404
|
try {
|
|
394
|
-
const response = await fetch(
|
|
405
|
+
const response = await fetch(formatAdminURL({
|
|
406
|
+
apiRoute,
|
|
407
|
+
path: `/${cartsSlug}/${cartID}/update-item`
|
|
408
|
+
}), {
|
|
395
409
|
body: JSON.stringify({
|
|
396
410
|
itemID: targetID,
|
|
397
411
|
quantity: {
|
|
@@ -431,7 +445,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
431
445
|
setIsLoading(false);
|
|
432
446
|
}
|
|
433
447
|
}, [
|
|
434
|
-
|
|
448
|
+
apiRoute,
|
|
435
449
|
cartID,
|
|
436
450
|
cartSecret,
|
|
437
451
|
cartsSlug,
|
|
@@ -444,7 +458,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
444
458
|
}
|
|
445
459
|
setIsLoading(true);
|
|
446
460
|
try {
|
|
447
|
-
const response = await fetch(
|
|
461
|
+
const response = await fetch(formatAdminURL({
|
|
462
|
+
apiRoute,
|
|
463
|
+
path: `/${cartsSlug}/${cartID}/clear`
|
|
464
|
+
}), {
|
|
448
465
|
body: JSON.stringify({
|
|
449
466
|
secret: cartSecret
|
|
450
467
|
}),
|
|
@@ -480,7 +497,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
480
497
|
setIsLoading(false);
|
|
481
498
|
}
|
|
482
499
|
}, [
|
|
483
|
-
|
|
500
|
+
apiRoute,
|
|
484
501
|
cartID,
|
|
485
502
|
cartSecret,
|
|
486
503
|
cartsSlug,
|
|
@@ -511,7 +528,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
511
528
|
setSelectedPaymentMethod(paymentMethodID);
|
|
512
529
|
if (paymentMethod.initiatePayment) {
|
|
513
530
|
try {
|
|
514
|
-
const response = await fetch(
|
|
531
|
+
const response = await fetch(formatAdminURL({
|
|
532
|
+
apiRoute,
|
|
533
|
+
path: `/payments/${paymentMethodID}/initiate`
|
|
534
|
+
}), {
|
|
515
535
|
body: JSON.stringify({
|
|
516
536
|
cartID,
|
|
517
537
|
currency: selectedCurrency.code,
|
|
@@ -544,7 +564,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
544
564
|
throw new Error(`Payment method "${paymentMethodID}" does not support payment initiation`);
|
|
545
565
|
}
|
|
546
566
|
}, [
|
|
547
|
-
|
|
567
|
+
apiRoute,
|
|
548
568
|
cartID,
|
|
549
569
|
cartSecret,
|
|
550
570
|
debug,
|
|
@@ -560,7 +580,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
560
580
|
throw new Error(`Payment method with ID "${paymentMethodID}" not found`);
|
|
561
581
|
}
|
|
562
582
|
if (paymentMethod.confirmOrder) {
|
|
563
|
-
const response = await fetch(
|
|
583
|
+
const response = await fetch(formatAdminURL({
|
|
584
|
+
apiRoute,
|
|
585
|
+
path: `/payments/${paymentMethodID}/confirm-order`
|
|
586
|
+
}), {
|
|
564
587
|
body: JSON.stringify({
|
|
565
588
|
cartID,
|
|
566
589
|
currency: selectedCurrency.code,
|
|
@@ -586,7 +609,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
586
609
|
throw new Error(`Payment method "${paymentMethodID}" does not support order confirmation`);
|
|
587
610
|
}
|
|
588
611
|
}, [
|
|
589
|
-
|
|
612
|
+
apiRoute,
|
|
590
613
|
cartID,
|
|
591
614
|
cartSecret,
|
|
592
615
|
paymentMethods,
|
|
@@ -601,7 +624,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
601
624
|
cart: true
|
|
602
625
|
}
|
|
603
626
|
});
|
|
604
|
-
const response = await fetch(
|
|
627
|
+
const response = await fetch(formatAdminURL({
|
|
628
|
+
apiRoute,
|
|
629
|
+
path: `/${customersSlug}/me?${query}`
|
|
630
|
+
}), {
|
|
605
631
|
credentials: 'include',
|
|
606
632
|
headers: {
|
|
607
633
|
'Content-Type': 'application/json'
|
|
@@ -629,7 +655,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
629
655
|
throw new Error(`Failed to fetch user: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
630
656
|
}
|
|
631
657
|
}, [
|
|
632
|
-
|
|
658
|
+
apiRoute,
|
|
633
659
|
customersSlug,
|
|
634
660
|
debug
|
|
635
661
|
]);
|
|
@@ -643,7 +669,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
643
669
|
limit: 0,
|
|
644
670
|
pagination: false
|
|
645
671
|
});
|
|
646
|
-
const response = await fetch(
|
|
672
|
+
const response = await fetch(formatAdminURL({
|
|
673
|
+
apiRoute,
|
|
674
|
+
path: `/${addressesSlug}?${query}`
|
|
675
|
+
}), {
|
|
647
676
|
credentials: 'include',
|
|
648
677
|
headers: {
|
|
649
678
|
'Content-Type': 'application/json'
|
|
@@ -671,7 +700,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
671
700
|
}
|
|
672
701
|
}, [
|
|
673
702
|
user,
|
|
674
|
-
|
|
703
|
+
apiRoute,
|
|
675
704
|
addressesSlug,
|
|
676
705
|
debug
|
|
677
706
|
]);
|
|
@@ -680,7 +709,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
680
709
|
throw new Error('User must be logged in to update or create an address');
|
|
681
710
|
}
|
|
682
711
|
try {
|
|
683
|
-
const response = await fetch(
|
|
712
|
+
const response = await fetch(formatAdminURL({
|
|
713
|
+
apiRoute,
|
|
714
|
+
path: `/${addressesSlug}/${addressID}`
|
|
715
|
+
}), {
|
|
684
716
|
body: JSON.stringify(address),
|
|
685
717
|
credentials: 'include',
|
|
686
718
|
headers: {
|
|
@@ -707,7 +739,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
707
739
|
}
|
|
708
740
|
}, [
|
|
709
741
|
user,
|
|
710
|
-
|
|
742
|
+
apiRoute,
|
|
711
743
|
addressesSlug,
|
|
712
744
|
getAddresses,
|
|
713
745
|
debug
|
|
@@ -717,7 +749,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
717
749
|
throw new Error('User must be logged in to update or create an address');
|
|
718
750
|
}
|
|
719
751
|
try {
|
|
720
|
-
const response = await fetch(
|
|
752
|
+
const response = await fetch(formatAdminURL({
|
|
753
|
+
apiRoute,
|
|
754
|
+
path: `/${addressesSlug}`
|
|
755
|
+
}), {
|
|
721
756
|
body: JSON.stringify(address),
|
|
722
757
|
credentials: 'include',
|
|
723
758
|
headers: {
|
|
@@ -744,7 +779,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
744
779
|
}
|
|
745
780
|
}, [
|
|
746
781
|
user,
|
|
747
|
-
|
|
782
|
+
apiRoute,
|
|
748
783
|
addressesSlug,
|
|
749
784
|
getAddresses,
|
|
750
785
|
debug
|
|
@@ -784,7 +819,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
784
819
|
*/ const mergeCart = useCallback(async (targetCartID, sourceCartID, sourceSecret)=>{
|
|
785
820
|
setIsLoading(true);
|
|
786
821
|
try {
|
|
787
|
-
const response = await fetch(
|
|
822
|
+
const response = await fetch(formatAdminURL({
|
|
823
|
+
apiRoute,
|
|
824
|
+
path: `/${cartsSlug}/${targetCartID}/merge`
|
|
825
|
+
}), {
|
|
788
826
|
body: JSON.stringify({
|
|
789
827
|
sourceCartID,
|
|
790
828
|
sourceSecret
|
|
@@ -818,7 +856,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
818
856
|
setIsLoading(false);
|
|
819
857
|
}
|
|
820
858
|
}, [
|
|
821
|
-
|
|
859
|
+
apiRoute,
|
|
822
860
|
cartsSlug,
|
|
823
861
|
debug,
|
|
824
862
|
getCart
|
|
@@ -862,7 +900,10 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
862
900
|
} else {
|
|
863
901
|
// User has no existing cart - transfer guest cart to user
|
|
864
902
|
try {
|
|
865
|
-
const response = await fetch(
|
|
903
|
+
const response = await fetch(formatAdminURL({
|
|
904
|
+
apiRoute,
|
|
905
|
+
path: `/${cartsSlug}/${guestCartID}?secret=${guestSecret}`
|
|
906
|
+
}), {
|
|
866
907
|
body: JSON.stringify({
|
|
867
908
|
customer: fetchedUser.id,
|
|
868
909
|
secret: null
|
|
@@ -897,7 +938,7 @@ export const EcommerceProvider = ({ addressesSlug = 'addresses', api, cartsSlug
|
|
|
897
938
|
localStorage.setItem(localStorageConfig.key, cartID);
|
|
898
939
|
}
|
|
899
940
|
}, [
|
|
900
|
-
|
|
941
|
+
apiRoute,
|
|
901
942
|
cartID,
|
|
902
943
|
cartSecret,
|
|
903
944
|
cartsSlug,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/react/provider/index.tsx"],"sourcesContent":["'use client'\nimport type { DefaultDocumentIDType, TypedUser } from 'payload'\n\nimport { deepMergeSimple, formatAdminURL } 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 CartsCollection,\n ContextProps,\n Currency,\n EcommerceConfig,\n EcommerceContextType,\n} from '../../types/index.js'\n\nconst defaultContext: EcommerceContextType = {\n addItem: async () => {},\n clearCart: async () => {},\n clearSession: () => {},\n config: {\n addressesSlug: 'addresses',\n api: {\n apiRoute: '/api',\n },\n cartsSlug: 'carts',\n customersSlug: 'users',\n },\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 isLoading: false,\n mergeCart: async () => {},\n onLogin: async () => {},\n onLogout: () => {},\n paymentMethods: [],\n refreshCart: async () => {},\n removeItem: async () => {},\n setCurrency: () => {},\n updateAddress: async () => {},\n user: null,\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 = {} } = api || {}\n const baseAPIURL = formatAdminURL({\n apiRoute,\n path: '',\n })\n\n const config = useMemo<EcommerceConfig>(\n () => ({\n addressesSlug,\n api: {\n apiRoute,\n },\n cartsSlug,\n customersSlug,\n }),\n [addressesSlug, apiRoute, cartsSlug, customersSlug],\n )\n\n const [isLoading, setIsLoading] = useState(false)\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 /**\n * The secret for accessing guest carts without authentication.\n * This is generated when a guest user creates a cart.\n */\n const [cartSecret, setCartSecret] = useState<string | undefined>(undefined)\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 // Store the secret for guest cart access\n if (!user && data.doc?.secret) {\n setCartSecret(data.doc.secret)\n }\n\n return data.doc as CartsCollection\n },\n [baseAPIURL, cartQuery, cartsSlug, selectedCurrency.code, user],\n )\n\n const getCart = useCallback(\n async (cartID: DefaultDocumentIDType, options?: { secret?: string }) => {\n const query = qs.stringify({\n ...cartQuery,\n ...(options?.secret ? { secret: options.secret } : {}),\n })\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\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to fetch cart: ${errorText}`)\n }\n\n const data = await response.json()\n\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 refreshCart = useCallback<EcommerceContextType['refreshCart']>(async () => {\n if (!cartID) {\n return\n }\n const updatedCart = await getCart(cartID)\n setCart(updatedCart)\n }, [cartID, getCart])\n\n // Persist cart ID and secret to localStorage\n useEffect(() => {\n if (hasRendered.current) {\n if (syncLocalStorage) {\n if (cartID) {\n localStorage.setItem(localStorageConfig.key, cartID as string)\n } else {\n localStorage.removeItem(localStorageConfig.key)\n }\n\n if (cartSecret) {\n localStorage.setItem(`${localStorageConfig.key}_secret`, cartSecret)\n } else {\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n }\n }\n }\n }, [cartID, cartSecret, localStorageConfig.key, syncLocalStorage])\n\n const addItem: EcommerceContextType['addItem'] = useCallback(\n async (item, quantity = 1) => {\n setIsLoading(true)\n try {\n if (cartID) {\n // Use server-side endpoint for adding items\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/add-item`, {\n body: JSON.stringify({\n item,\n quantity,\n secret: cartSecret,\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 add item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } else {\n // If no cartID exists, create a new cart with the item\n const newCart = await createCart({ items: [{ ...item, quantity }] })\n\n setCartID(newCart.id)\n setCart(newCart)\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error adding item to cart:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [baseAPIURL, cartID, cartSecret, cartsSlug, createCart, debug, getCart],\n )\n\n const removeItem: EcommerceContextType['removeItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/remove-item`, {\n body: JSON.stringify({\n itemID: targetID,\n secret: cartSecret,\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 remove item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error removing item from cart:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [baseAPIURL, cartID, cartSecret, cartsSlug, debug, getCart],\n )\n\n const incrementItem: EcommerceContextType['incrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/update-item`, {\n body: JSON.stringify({\n itemID: targetID,\n quantity: { $inc: 1 },\n secret: cartSecret,\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 increment item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error incrementing item quantity:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [baseAPIURL, cartID, cartSecret, cartsSlug, debug, getCart],\n )\n\n const decrementItem: EcommerceContextType['decrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/update-item`, {\n body: JSON.stringify({\n itemID: targetID,\n quantity: { $inc: -1 },\n secret: cartSecret,\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 decrement item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error decrementing item quantity:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [baseAPIURL, cartID, cartSecret, cartsSlug, debug, getCart],\n )\n\n const clearCart: EcommerceContextType['clearCart'] = useCallback(async () => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${cartID}/clear`, {\n body: JSON.stringify({\n secret: cartSecret,\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 clear cart: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error clearing cart:', error)\n }\n } finally {\n setIsLoading(false)\n }\n }, [baseAPIURL, cartID, cartSecret, cartsSlug, debug, getCart])\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 try {\n const response = await fetch(`${baseAPIURL}/payments/${paymentMethodID}/initiate`, {\n body: JSON.stringify({\n cartID,\n currency: selectedCurrency.code,\n secret: cartSecret,\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, cartSecret, 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 response = await fetch(`${baseAPIURL}/payments/${paymentMethodID}/confirm-order`, {\n body: JSON.stringify({\n cartID,\n currency: selectedCurrency.code,\n secret: cartSecret,\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, cartSecret, 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 cart: 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 /**\n * Clears all ecommerce session data from state and localStorage.\n * Used during logout to ensure no user data persists.\n */\n const clearSession = useCallback(() => {\n setCart(undefined)\n setCartID(undefined)\n setCartSecret(undefined)\n setAddresses(undefined)\n setUser(null)\n\n if (syncLocalStorage) {\n localStorage.removeItem(localStorageConfig.key)\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n }\n }, [localStorageConfig.key, syncLocalStorage])\n\n /**\n * Called during logout. Clears all session data.\n */\n const onLogout = useCallback(() => {\n clearSession()\n }, [clearSession])\n\n /**\n * Merges items from a source cart into a target cart.\n * Useful for merging a guest cart into a user's existing cart after login.\n *\n * @param targetCartID - The ID of the cart to merge items into\n * @param sourceCartID - The ID of the cart to merge items from\n * @param sourceSecret - The secret for the source cart (required for guest carts)\n * @returns The merged cart\n */\n const mergeCart = useCallback<EcommerceContextType['mergeCart']>(\n async (targetCartID, sourceCartID, sourceSecret) => {\n setIsLoading(true)\n try {\n const response = await fetch(`${baseAPIURL}/${cartsSlug}/${targetCartID}/merge`, {\n body: JSON.stringify({\n sourceCartID,\n sourceSecret,\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 merge carts: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n throw new Error(result.message || 'Failed to merge carts')\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(targetCartID)\n setCart(refreshedCart)\n setCartID(targetCartID)\n\n return refreshedCart\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error merging carts:', error)\n }\n throw error\n } finally {\n setIsLoading(false)\n }\n },\n [baseAPIURL, cartsSlug, debug, getCart],\n )\n\n /**\n * Called after login to properly set up cart state.\n * Handles merging guest cart with user's existing cart if applicable.\n */\n const onLogin = useCallback(async () => {\n // Store reference to any existing guest cart before fetching user\n const guestCartID = cartID\n const guestSecret = cartSecret\n\n // Fetch fresh user data\n const fetchedUser = await getUser()\n\n if (!fetchedUser) {\n // No user means login failed, keep current state\n return\n }\n\n // Clear the guest cart secret - authenticated users don't need it\n setCartSecret(undefined)\n if (syncLocalStorage) {\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n }\n\n // Check if user has an existing cart\n const userCartID =\n fetchedUser.cart?.docs && fetchedUser.cart.docs.length > 0\n ? typeof fetchedUser.cart.docs[0] === 'object'\n ? fetchedUser.cart.docs[0].id\n : fetchedUser.cart.docs[0]\n : undefined\n\n if (guestCartID && guestSecret) {\n // Guest had a cart - need to handle merge/transfer\n if (userCartID) {\n // User has existing cart - merge guest cart into user's cart\n try {\n await mergeCart(userCartID, guestCartID, guestSecret)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error merging carts:', error)\n }\n // Fall back to user's cart\n const userCart = await getCart(userCartID)\n setCart(userCart)\n setCartID(userCartID)\n }\n } else {\n // User has no existing cart - transfer guest cart to user\n try {\n const response = await fetch(\n `${baseAPIURL}/${cartsSlug}/${guestCartID}?secret=${guestSecret}`,\n {\n body: JSON.stringify({\n customer: fetchedUser.id,\n secret: null, // Clear the secret since it's now owned by user\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'PATCH',\n },\n )\n\n if (response.ok) {\n // Fetch updated cart\n const updatedCart = await getCart(guestCartID)\n setCart(updatedCart)\n setCartID(guestCartID)\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error transferring cart to user:', error)\n }\n }\n }\n } else if (userCartID) {\n // No guest cart, but user has a cart - fetch it\n const userCart = await getCart(userCartID)\n setCart(userCart)\n setCartID(userCartID)\n }\n\n // Update localStorage with user's cart ID (no secret needed)\n if (syncLocalStorage && cartID) {\n localStorage.setItem(localStorageConfig.key, cartID as string)\n }\n }, [\n baseAPIURL,\n cartID,\n cartSecret,\n cartsSlug,\n debug,\n getCart,\n getUser,\n localStorageConfig.key,\n mergeCart,\n syncLocalStorage,\n ])\n\n // If localStorage is enabled, restore cart from storage\n useEffect(() => {\n if (!hasRendered.current) {\n if (syncLocalStorage) {\n const storedCartID = localStorage.getItem(localStorageConfig.key)\n const storedSecret = localStorage.getItem(`${localStorageConfig.key}_secret`)\n\n if (storedCartID) {\n getCart(storedCartID, { secret: storedSecret || undefined })\n .then((fetchedCart) => {\n setCart(fetchedCart)\n setCartID(storedCartID as DefaultDocumentIDType)\n if (storedSecret) {\n setCartSecret(storedSecret)\n }\n })\n .catch((_) => {\n // console.error('Error fetching cart from localStorage:', error)\n // If there's an error fetching the cart, clear it from localStorage\n localStorage.removeItem(localStorageConfig.key)\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(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 clearSession,\n config,\n confirmOrder,\n createAddress,\n currenciesConfig,\n currency: selectedCurrency,\n decrementItem,\n incrementItem,\n initiatePayment,\n isLoading,\n mergeCart,\n onLogin,\n onLogout,\n paymentMethods,\n refreshCart,\n removeItem,\n selectedPaymentMethod,\n setCurrency,\n updateAddress,\n user,\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 useEcommerceConfig = () => {\n const { config } = useEcommerce()\n\n return config\n}\n\nexport const useCurrency = () => {\n const { currenciesConfig, currency, setCurrency } = useEcommerce()\n\n const formatCurrency = useCallback(\n (value?: null | number, options?: { currency?: Currency; locale?: string }): string => {\n if (value === undefined || value === null) {\n return ''\n }\n\n const currencyToUse = options?.currency || currency\n if (!currencyToUse) {\n return value.toString()\n }\n\n const { code, decimals, symbolDisplay } = currencyToUse\n\n const locale = options?.locale || 'en'\n\n return new Intl.NumberFormat(locale, {\n currency: code,\n currencyDisplay: symbolDisplay || 'symbol',\n maximumFractionDigits: decimals,\n minimumFractionDigits: decimals,\n style: 'currency',\n }).format(value / Math.pow(10, 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 {\n addItem,\n cart,\n clearCart,\n decrementItem,\n incrementItem,\n isLoading,\n refreshCart,\n removeItem,\n } = useEcommerce()\n\n if (!addItem) {\n throw new Error('useCart must be used within an EcommerceProvider')\n }\n\n return {\n addItem,\n cart: cart as T,\n clearCart,\n decrementItem,\n incrementItem,\n isLoading,\n refreshCart,\n removeItem,\n }\n}\n\nexport const usePayments = () => {\n const { confirmOrder, initiatePayment, isLoading, paymentMethods, selectedPaymentMethod } =\n useEcommerce()\n\n if (!initiatePayment) {\n throw new Error('usePayments must be used within an EcommerceProvider')\n }\n\n return { confirmOrder, initiatePayment, isLoading, paymentMethods, selectedPaymentMethod }\n}\n\nexport function useAddresses<T extends AddressesCollection>() {\n const { addresses, createAddress, isLoading, 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, isLoading, updateAddress }\n}\n"],"names":["deepMergeSimple","formatAdminURL","qs","React","createContext","use","useCallback","useEffect","useMemo","useRef","useState","defaultContext","addItem","clearCart","clearSession","config","addressesSlug","api","apiRoute","cartsSlug","customersSlug","confirmOrder","createAddress","currenciesConfig","defaultCurrency","supportedCurrencies","code","decimals","label","symbol","currency","decrementItem","incrementItem","initiatePayment","isLoading","mergeCart","onLogin","onLogout","paymentMethods","refreshCart","removeItem","setCurrency","updateAddress","user","EcommerceContext","defaultLocalStorage","key","EcommerceProvider","children","debug","syncLocalStorage","localStorageConfig","cartsFetchQuery","baseAPIURL","path","setIsLoading","setUser","addresses","setAddresses","hasRendered","cartID","setCartID","cartSecret","setCartSecret","undefined","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","secret","getCart","updatedCart","current","localStorage","setItem","item","quantity","result","success","refreshedCart","newCart","console","targetID","itemID","$inc","foundCurrency","paymentMethodID","paymentMethod","name","additionalData","responseError","responseData","message","pm","getUser","userData","getAddresses","limit","pagination","docs","length","addressID","address","targetCartID","sourceCartID","sourceSecret","guestCartID","guestSecret","fetchedUser","userCartID","userCart","storedCartID","getItem","storedSecret","then","fetchedCart","catch","_","value","useEcommerce","context","useEcommerceConfig","useCurrency","formatCurrency","currencyToUse","toString","symbolDisplay","locale","Intl","NumberFormat","currencyDisplay","maximumFractionDigits","minimumFractionDigits","style","format","Math","pow","useCart","usePayments","useAddresses"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/react/provider/index.tsx"],"sourcesContent":["'use client'\nimport type { DefaultDocumentIDType } from 'payload'\n\nimport { deepMergeSimple, formatAdminURL } 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 CartsCollection,\n ContextProps,\n Currency,\n EcommerceConfig,\n EcommerceContextType,\n UserWithCart,\n} from '../../types/index.js'\n\nconst defaultContext: EcommerceContextType = {\n addItem: async () => {},\n clearCart: async () => {},\n clearSession: () => {},\n config: {\n addressesSlug: 'addresses',\n api: {\n apiRoute: '/api',\n },\n cartsSlug: 'carts',\n customersSlug: 'users',\n },\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 isLoading: false,\n mergeCart: async () => {},\n onLogin: async () => {},\n onLogout: () => {},\n paymentMethods: [],\n refreshCart: async () => {},\n removeItem: async () => {},\n setCurrency: () => {},\n updateAddress: async () => {},\n user: null,\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 = {} } = api || {}\n const config = useMemo<EcommerceConfig>(\n () => ({\n addressesSlug,\n api: {\n apiRoute,\n },\n cartsSlug,\n customersSlug,\n }),\n [addressesSlug, apiRoute, cartsSlug, customersSlug],\n )\n\n const [isLoading, setIsLoading] = useState(false)\n\n const [user, setUser] = useState<null | UserWithCart>(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 /**\n * The secret for accessing guest carts without authentication.\n * This is generated when a guest user creates a cart.\n */\n const [cartSecret, setCartSecret] = useState<string | undefined>(undefined)\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(formatAdminURL({ apiRoute, path: `/${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 // Store the secret for guest cart access\n if (!user && data.doc?.secret) {\n setCartSecret(data.doc.secret)\n }\n\n return data.doc as CartsCollection\n },\n [apiRoute, cartQuery, cartsSlug, selectedCurrency.code, user],\n )\n\n const getCart = useCallback(\n async (cartID: DefaultDocumentIDType, options?: { secret?: string }) => {\n const query = qs.stringify({\n ...cartQuery,\n ...(options?.secret ? { secret: options.secret } : {}),\n })\n\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${cartsSlug}/${cartID}?${query}` }),\n {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n },\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to fetch cart: ${errorText}`)\n }\n\n const data = await response.json()\n\n if (data.error) {\n throw new Error(`Cart fetch error: ${data.error}`)\n }\n\n return data as CartsCollection\n },\n [apiRoute, cartQuery, cartsSlug],\n )\n\n const refreshCart = useCallback<EcommerceContextType['refreshCart']>(async () => {\n if (!cartID) {\n return\n }\n const updatedCart = await getCart(cartID)\n setCart(updatedCart)\n }, [cartID, getCart])\n\n // Persist cart ID and secret to localStorage\n useEffect(() => {\n if (hasRendered.current) {\n if (syncLocalStorage) {\n if (cartID) {\n localStorage.setItem(localStorageConfig.key, cartID as string)\n } else {\n localStorage.removeItem(localStorageConfig.key)\n }\n\n if (cartSecret) {\n localStorage.setItem(`${localStorageConfig.key}_secret`, cartSecret)\n } else {\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n }\n }\n }\n }, [cartID, cartSecret, localStorageConfig.key, syncLocalStorage])\n\n const addItem: EcommerceContextType['addItem'] = useCallback(\n async (item, quantity = 1) => {\n setIsLoading(true)\n try {\n if (cartID) {\n // Use server-side endpoint for adding items\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${cartsSlug}/${cartID}/add-item` }),\n {\n body: JSON.stringify({\n item,\n quantity,\n secret: cartSecret,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to add item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } else {\n // If no cartID exists, create a new cart with the item\n const newCart = await createCart({ items: [{ ...item, quantity }] })\n\n setCartID(newCart.id)\n setCart(newCart)\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error adding item to cart:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [apiRoute, cartID, cartSecret, cartsSlug, createCart, debug, getCart],\n )\n\n const removeItem: EcommerceContextType['removeItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${cartsSlug}/${cartID}/remove-item` }),\n {\n body: JSON.stringify({\n itemID: targetID,\n secret: cartSecret,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to remove item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error removing item from cart:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [apiRoute, cartID, cartSecret, cartsSlug, debug, getCart],\n )\n\n const incrementItem: EcommerceContextType['incrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${cartsSlug}/${cartID}/update-item` }),\n {\n body: JSON.stringify({\n itemID: targetID,\n quantity: { $inc: 1 },\n secret: cartSecret,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to increment item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error incrementing item quantity:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [apiRoute, cartID, cartSecret, cartsSlug, debug, getCart],\n )\n\n const decrementItem: EcommerceContextType['decrementItem'] = useCallback(\n async (targetID) => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${cartsSlug}/${cartID}/update-item` }),\n {\n body: JSON.stringify({\n itemID: targetID,\n quantity: { $inc: -1 },\n secret: cartSecret,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to decrement item: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error decrementing item quantity:', error)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [apiRoute, cartID, cartSecret, cartsSlug, debug, getCart],\n )\n\n const clearCart: EcommerceContextType['clearCart'] = useCallback(async () => {\n if (!cartID) {\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${cartsSlug}/${cartID}/clear` }),\n {\n body: JSON.stringify({\n secret: cartSecret,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to clear cart: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n // Cart not found - reset state\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(undefined)\n return\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(cartID, { secret: cartSecret })\n setCart(refreshedCart)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error clearing cart:', error)\n }\n } finally {\n setIsLoading(false)\n }\n }, [apiRoute, cartID, cartSecret, cartsSlug, debug, getCart])\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 try {\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/payments/${paymentMethodID}/initiate` }),\n {\n body: JSON.stringify({\n cartID,\n currency: selectedCurrency.code,\n secret: cartSecret,\n ...(options?.additionalData || {}),\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\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 [apiRoute, cartID, cartSecret, 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 response = await fetch(\n formatAdminURL({ apiRoute, path: `/payments/${paymentMethodID}/confirm-order` }),\n {\n body: JSON.stringify({\n cartID,\n currency: selectedCurrency.code,\n secret: cartSecret,\n ...(options?.additionalData || {}),\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\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 [apiRoute, cartID, cartSecret, 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 cart: true,\n },\n })\n\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${customersSlug}/me?${query}` }),\n {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n },\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: {\n error?: string\n user?: UserWithCart\n } = 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)\n return userData.user\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 }, [apiRoute, 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(\n formatAdminURL({ apiRoute, path: `/${addressesSlug}?${query}` }),\n {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n },\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, apiRoute, 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(\n formatAdminURL({ apiRoute, path: `/${addressesSlug}/${addressID}` }),\n {\n body: JSON.stringify(address),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'PATCH',\n },\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, apiRoute, 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(formatAdminURL({ apiRoute, path: `/${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, apiRoute, addressesSlug, getAddresses, debug],\n )\n\n /**\n * Clears all ecommerce session data from state and localStorage.\n * Used during logout to ensure no user data persists.\n */\n const clearSession = useCallback(() => {\n setCart(undefined)\n setCartID(undefined)\n setCartSecret(undefined)\n setAddresses(undefined)\n setUser(null)\n\n if (syncLocalStorage) {\n localStorage.removeItem(localStorageConfig.key)\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n }\n }, [localStorageConfig.key, syncLocalStorage])\n\n /**\n * Called during logout. Clears all session data.\n */\n const onLogout = useCallback(() => {\n clearSession()\n }, [clearSession])\n\n /**\n * Merges items from a source cart into a target cart.\n * Useful for merging a guest cart into a user's existing cart after login.\n *\n * @param targetCartID - The ID of the cart to merge items into\n * @param sourceCartID - The ID of the cart to merge items from\n * @param sourceSecret - The secret for the source cart (required for guest carts)\n * @returns The merged cart\n */\n const mergeCart = useCallback<EcommerceContextType['mergeCart']>(\n async (targetCartID, sourceCartID, sourceSecret) => {\n setIsLoading(true)\n try {\n const response = await fetch(\n formatAdminURL({ apiRoute, path: `/${cartsSlug}/${targetCartID}/merge` }),\n {\n body: JSON.stringify({\n sourceCartID,\n sourceSecret,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to merge carts: ${errorText}`)\n }\n\n const result = await response.json()\n\n if (!result.success) {\n throw new Error(result.message || 'Failed to merge carts')\n }\n\n // Refresh cart with proper depth/populate settings for UI\n const refreshedCart = await getCart(targetCartID)\n setCart(refreshedCart)\n setCartID(targetCartID)\n\n return refreshedCart\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error merging carts:', error)\n }\n throw error\n } finally {\n setIsLoading(false)\n }\n },\n [apiRoute, cartsSlug, debug, getCart],\n )\n\n /**\n * Called after login to properly set up cart state.\n * Handles merging guest cart with user's existing cart if applicable.\n */\n const onLogin = useCallback(async () => {\n // Store reference to any existing guest cart before fetching user\n const guestCartID = cartID\n const guestSecret = cartSecret\n\n // Fetch fresh user data\n const fetchedUser = await getUser()\n\n if (!fetchedUser) {\n // No user means login failed, keep current state\n return\n }\n\n // Clear the guest cart secret - authenticated users don't need it\n setCartSecret(undefined)\n if (syncLocalStorage) {\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n }\n\n // Check if user has an existing cart\n const userCartID =\n fetchedUser.cart?.docs && fetchedUser.cart.docs.length > 0\n ? typeof fetchedUser.cart.docs[0] === 'object'\n ? fetchedUser.cart.docs[0].id\n : fetchedUser.cart.docs[0]\n : undefined\n\n if (guestCartID && guestSecret) {\n // Guest had a cart - need to handle merge/transfer\n if (userCartID) {\n // User has existing cart - merge guest cart into user's cart\n try {\n await mergeCart(userCartID, guestCartID, guestSecret)\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error merging carts:', error)\n }\n // Fall back to user's cart\n const userCart = await getCart(userCartID)\n setCart(userCart)\n setCartID(userCartID)\n }\n } else {\n // User has no existing cart - transfer guest cart to user\n try {\n const response = await fetch(\n formatAdminURL({\n apiRoute,\n path: `/${cartsSlug}/${guestCartID}?secret=${guestSecret}`,\n }),\n {\n body: JSON.stringify({\n customer: fetchedUser.id,\n secret: null, // Clear the secret since it's now owned by user\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'PATCH',\n },\n )\n\n if (response.ok) {\n // Fetch updated cart\n const updatedCart = await getCart(guestCartID)\n setCart(updatedCart)\n setCartID(guestCartID)\n }\n } catch (error) {\n if (debug) {\n // eslint-disable-next-line no-console\n console.error('Error transferring cart to user:', error)\n }\n }\n }\n } else if (userCartID) {\n // No guest cart, but user has a cart - fetch it\n const userCart = await getCart(userCartID)\n setCart(userCart)\n setCartID(userCartID)\n }\n\n // Update localStorage with user's cart ID (no secret needed)\n if (syncLocalStorage && cartID) {\n localStorage.setItem(localStorageConfig.key, cartID as string)\n }\n }, [\n apiRoute,\n cartID,\n cartSecret,\n cartsSlug,\n debug,\n getCart,\n getUser,\n localStorageConfig.key,\n mergeCart,\n syncLocalStorage,\n ])\n\n // If localStorage is enabled, restore cart from storage\n useEffect(() => {\n if (!hasRendered.current) {\n if (syncLocalStorage) {\n const storedCartID = localStorage.getItem(localStorageConfig.key)\n const storedSecret = localStorage.getItem(`${localStorageConfig.key}_secret`)\n\n if (storedCartID) {\n getCart(storedCartID, { secret: storedSecret || undefined })\n .then((fetchedCart) => {\n setCart(fetchedCart)\n setCartID(storedCartID as DefaultDocumentIDType)\n if (storedSecret) {\n setCartSecret(storedSecret)\n }\n })\n .catch((_) => {\n // console.error('Error fetching cart from localStorage:', error)\n // If there's an error fetching the cart, clear it from localStorage\n localStorage.removeItem(localStorageConfig.key)\n localStorage.removeItem(`${localStorageConfig.key}_secret`)\n setCartID(undefined)\n setCart(undefined)\n setCartSecret(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 clearSession,\n config,\n confirmOrder,\n createAddress,\n currenciesConfig,\n currency: selectedCurrency,\n decrementItem,\n incrementItem,\n initiatePayment,\n isLoading,\n mergeCart,\n onLogin,\n onLogout,\n paymentMethods,\n refreshCart,\n removeItem,\n selectedPaymentMethod,\n setCurrency,\n updateAddress,\n user,\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 useEcommerceConfig = () => {\n const { config } = useEcommerce()\n\n return config\n}\n\nexport const useCurrency = () => {\n const { currenciesConfig, currency, setCurrency } = useEcommerce()\n\n const formatCurrency = useCallback(\n (value?: null | number, options?: { currency?: Currency; locale?: string }): string => {\n if (value === undefined || value === null) {\n return ''\n }\n\n const currencyToUse = options?.currency || currency\n if (!currencyToUse) {\n return value.toString()\n }\n\n const { code, decimals, symbolDisplay } = currencyToUse\n\n const locale = options?.locale || 'en'\n\n return new Intl.NumberFormat(locale, {\n currency: code,\n currencyDisplay: symbolDisplay || 'symbol',\n maximumFractionDigits: decimals,\n minimumFractionDigits: decimals,\n style: 'currency',\n }).format(value / Math.pow(10, 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 {\n addItem,\n cart,\n clearCart,\n decrementItem,\n incrementItem,\n isLoading,\n refreshCart,\n removeItem,\n } = useEcommerce()\n\n if (!addItem) {\n throw new Error('useCart must be used within an EcommerceProvider')\n }\n\n return {\n addItem,\n cart: cart as T,\n clearCart,\n decrementItem,\n incrementItem,\n isLoading,\n refreshCart,\n removeItem,\n }\n}\n\nexport const usePayments = () => {\n const { confirmOrder, initiatePayment, isLoading, paymentMethods, selectedPaymentMethod } =\n useEcommerce()\n\n if (!initiatePayment) {\n throw new Error('usePayments must be used within an EcommerceProvider')\n }\n\n return { confirmOrder, initiatePayment, isLoading, paymentMethods, selectedPaymentMethod }\n}\n\nexport function useAddresses<T extends AddressesCollection>() {\n const { addresses, createAddress, isLoading, 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, isLoading, updateAddress }\n}\n"],"names":["deepMergeSimple","formatAdminURL","qs","React","createContext","use","useCallback","useEffect","useMemo","useRef","useState","defaultContext","addItem","clearCart","clearSession","config","addressesSlug","api","apiRoute","cartsSlug","customersSlug","confirmOrder","createAddress","currenciesConfig","defaultCurrency","supportedCurrencies","code","decimals","label","symbol","currency","decrementItem","incrementItem","initiatePayment","isLoading","mergeCart","onLogin","onLogout","paymentMethods","refreshCart","removeItem","setCurrency","updateAddress","user","EcommerceContext","defaultLocalStorage","key","EcommerceProvider","children","debug","syncLocalStorage","localStorageConfig","cartsFetchQuery","setIsLoading","setUser","addresses","setAddresses","hasRendered","cartID","setCartID","cartSecret","setCartSecret","undefined","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","path","body","JSON","customer","id","credentials","headers","method","ok","errorText","text","Error","data","json","error","doc","secret","getCart","updatedCart","current","localStorage","setItem","item","quantity","result","success","refreshedCart","newCart","console","targetID","itemID","$inc","foundCurrency","paymentMethodID","paymentMethod","name","additionalData","responseError","responseData","message","pm","getUser","userData","getAddresses","limit","pagination","docs","length","addressID","address","targetCartID","sourceCartID","sourceSecret","guestCartID","guestSecret","fetchedUser","userCartID","userCart","storedCartID","getItem","storedSecret","then","fetchedCart","catch","_","value","useEcommerce","context","useEcommerceConfig","useCurrency","formatCurrency","currencyToUse","toString","symbolDisplay","locale","Intl","NumberFormat","currencyDisplay","maximumFractionDigits","minimumFractionDigits","style","format","Math","pow","useCart","usePayments","useAddresses"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/ar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/ar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc;IACzB,OAAO;IACP,kBAAkB;QAChB,SAAS;QACT,MAAM;QACN,OAAO;QACP,WAAW;QACX,cAAc;QACd,cAAc;QACd,SAAS;QACT,8BAA8B;QAE9B,gBAAgB;QAChB,eAAe;QACf,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,MAAM;QACN,iBAAiB;QACjB,OAAO;QACP,cAAc;QACd,SAAS;QACT,IAAI;QACJ,KAAK;QACL,0BAA0B;QAE1B,UAAU;QACV,SAAS;QACT,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,aAAa;QACb,SAAS;QACT,mBAAmB;QACnB,cAAc;QACd,OAAO;QACP,MAAM;QACN,SAAS;QACT,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,KAAK;QACL,YAAY;QACZ,MAAM;QACN,2BAA2B;QAE3B,aAAa;QACb,cAAc;QACd,OAAO;QACP,KAAK;QACL,OAAO;QACP,WAAW;QACX,MAAM;QACN,kBAAkB;QAClB,UAAU;QACV,OAAO;QACP,uBAAuB;QAEvB,eAAe;QACf,QAAQ;QACR,SAAS;QACT,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,MAAM;QACN,QAAQ;QACR,SAAS;QACT,WAAW;QACX,kBAAkB;QAClB,YAAY;QACZ,iCAAiC;QAEjC,OAAO;QACP,aAAa;QACb,cAAc;QACd,2BAA2B;QAE3B,mCAAmC;QAEnC,sBAAsB;QACtB,yBAAyB;QACzB,QAAQ;QACR,6BAA6B;QAE7B,WAAW;QACX,YAAY;QACZ,iCAAiC;;CAGpC,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,cAGhB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"az.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/az.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"az.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/az.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc;IACzB,OAAO;IACP,kBAAkB;QAChB,SAAS;QACT,MAAM;QACN,OAAO;QACP,WAAW;QACX,cAAc;QACd,cAAc;QACd,SAAS;QACT,8BAA8B;QAE9B,gBAAgB;QAChB,eAAe;QACf,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,MAAM;QACN,iBAAiB;QACjB,OAAO;QACP,cAAc;QACd,SAAS;QACT,IAAI;QACJ,KAAK;QACL,0BAA0B;QAE1B,UAAU;QACV,SAAS;QACT,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,aAAa;QACb,SAAS;QACT,mBAAmB;QACnB,cAAc;QACd,OAAO;QACP,MAAM;QACN,SAAS;QACT,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,KAAK;QACL,YAAY;QACZ,MAAM;QACN,2BAA2B;QAE3B,aAAa;QACb,cAAc;QACd,OAAO;QACP,KAAK;QACL,OAAO;QACP,WAAW;QACX,MAAM;QACN,kBAAkB;QAClB,UAAU;QACV,OAAO;QACP,uBAAuB;QAEvB,eAAe;QACf,QAAQ;QACR,SAAS;QACT,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,MAAM;QACN,QAAQ;QACR,SAAS;QACT,WAAW;QACX,kBAAkB;QAClB,YAAY;QACZ,iCAAiC;QAEjC,OAAO;QACP,aAAa;QACb,cAAc;QACd,2BAA2B;QAE3B,mCAAmC;QAEnC,sBAAsB;QACtB,yBAAyB;QACzB,QAAQ;QACR,6BAA6B;QAE7B,WAAW;QACX,YAAY;QACZ,iCAAiC;;CAGpC,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,cAGhB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bg.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/bg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"bg.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/bg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc;IACzB,OAAO;IACP,kBAAkB;QAChB,SAAS;QACT,MAAM;QACN,OAAO;QACP,WAAW;QACX,cAAc;QACd,cAAc;QACd,SAAS;QACT,8BAA8B;QAE9B,gBAAgB;QAChB,eAAe;QACf,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,MAAM;QACN,iBAAiB;QACjB,OAAO;QACP,cAAc;QACd,SAAS;QACT,IAAI;QACJ,KAAK;QACL,0BAA0B;QAE1B,UAAU;QACV,SAAS;QACT,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,aAAa;QACb,SAAS;QACT,mBAAmB;QACnB,cAAc;QACd,OAAO;QACP,MAAM;QACN,SAAS;QACT,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,KAAK;QACL,YAAY;QACZ,MAAM;QACN,2BAA2B;QAE3B,aAAa;QACb,cAAc;QACd,OAAO;QACP,KAAK;QACL,OAAO;QACP,WAAW;QACX,MAAM;QACN,kBAAkB;QAClB,UAAU;QACV,OAAO;QACP,uBAAuB;QAEvB,eAAe;QACf,QAAQ;QACR,SAAS;QACT,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,MAAM;QACN,QAAQ;QACR,SAAS;QACT,WAAW;QACX,kBAAkB;QAClB,YAAY;QACZ,iCAAiC;QAEjC,OAAO;QACP,aAAa;QACb,cAAc;QACd,2BAA2B;QAE3B,mCAAmC;QAEnC,sBAAsB;QACtB,yBAAyB;QACzB,QAAQ;QACR,6BAA6B;QAE7B,WAAW;QACX,YAAY;QACZ,iCAAiC;;CAGpC,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,cAGhB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ca.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/ca.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"ca.d.ts","sourceRoot":"","sources":["../../../src/translations/languages/ca.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc;IACzB,OAAO;IACP,kBAAkB;QAChB,SAAS;QACT,MAAM;QACN,OAAO;QACP,WAAW;QACX,cAAc;QACd,cAAc;QACd,SAAS;QACT,8BAA8B;QAE9B,gBAAgB;QAChB,eAAe;QACf,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,MAAM;QACN,iBAAiB;QACjB,OAAO;QACP,cAAc;QACd,SAAS;QACT,IAAI;QACJ,KAAK;QACL,0BAA0B;QAE1B,UAAU;QACV,SAAS;QACT,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,aAAa;QACb,SAAS;QACT,mBAAmB;QACnB,cAAc;QACd,OAAO;QACP,MAAM;QACN,SAAS;QACT,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,KAAK;QACL,YAAY;QACZ,MAAM;QACN,2BAA2B;QAE3B,aAAa;QACb,cAAc;QACd,OAAO;QACP,KAAK;QACL,OAAO;QACP,WAAW;QACX,MAAM;QACN,kBAAkB;QAClB,UAAU;QACV,OAAO;QACP,uBAAuB;QAEvB,eAAe;QACf,QAAQ;QACR,SAAS;QACT,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,MAAM;QACN,QAAQ;QACR,SAAS;QACT,WAAW;QACX,kBAAkB;QAClB,YAAY;QACZ,iCAAiC;QAEjC,OAAO;QACP,aAAa;QACb,cAAc;QACd,2BAA2B;QAE3B,mCAAmC;QAEnC,sBAAsB;QACtB,yBAAyB;QACzB,QAAQ;QACR,6BAA6B;QAE7B,WAAW;QACX,YAAY;QACZ,iCAAiC;;CAGpC,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,cAGhB,CAAA"}
|