@rovela-ai/sdk 0.19.8 → 0.20.0

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 (89) hide show
  1. package/dist/admin/api/index.d.ts +2 -2
  2. package/dist/admin/api/index.d.ts.map +1 -1
  3. package/dist/admin/api/index.js +2 -2
  4. package/dist/admin/api/index.js.map +1 -1
  5. package/dist/admin/api/orders.d.ts +49 -0
  6. package/dist/admin/api/orders.d.ts.map +1 -1
  7. package/dist/admin/api/orders.js +293 -30
  8. package/dist/admin/api/orders.js.map +1 -1
  9. package/dist/admin/api/settings.d.ts.map +1 -1
  10. package/dist/admin/api/settings.js +6 -1
  11. package/dist/admin/api/settings.js.map +1 -1
  12. package/dist/admin/api/shipping.d.ts +49 -0
  13. package/dist/admin/api/shipping.d.ts.map +1 -1
  14. package/dist/admin/api/shipping.js +144 -0
  15. package/dist/admin/api/shipping.js.map +1 -1
  16. package/dist/admin/components/OrderDetails.d.ts.map +1 -1
  17. package/dist/admin/components/OrderDetails.js +69 -1
  18. package/dist/admin/components/OrderDetails.js.map +1 -1
  19. package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
  20. package/dist/admin/components/ShippingSettings.js +313 -134
  21. package/dist/admin/components/ShippingSettings.js.map +1 -1
  22. package/dist/admin/types.d.ts +13 -0
  23. package/dist/admin/types.d.ts.map +1 -1
  24. package/dist/checkout/api/colissimo-relays.d.ts +24 -0
  25. package/dist/checkout/api/colissimo-relays.d.ts.map +1 -0
  26. package/dist/checkout/api/colissimo-relays.js +60 -0
  27. package/dist/checkout/api/colissimo-relays.js.map +1 -0
  28. package/dist/checkout/api/manual.d.ts.map +1 -1
  29. package/dist/checkout/api/manual.js +21 -5
  30. package/dist/checkout/api/manual.js.map +1 -1
  31. package/dist/checkout/api/shipping.d.ts.map +1 -1
  32. package/dist/checkout/api/shipping.js +60 -82
  33. package/dist/checkout/api/shipping.js.map +1 -1
  34. package/dist/checkout/components/CheckoutFlow.d.ts.map +1 -1
  35. package/dist/checkout/components/CheckoutFlow.js +142 -3
  36. package/dist/checkout/components/CheckoutFlow.js.map +1 -1
  37. package/dist/checkout/components/ShippingOptions.d.ts +8 -1
  38. package/dist/checkout/components/ShippingOptions.d.ts.map +1 -1
  39. package/dist/checkout/components/ShippingOptions.js +40 -11
  40. package/dist/checkout/components/ShippingOptions.js.map +1 -1
  41. package/dist/checkout/components/colissimo-logo.d.ts +12 -0
  42. package/dist/checkout/components/colissimo-logo.d.ts.map +1 -0
  43. package/dist/checkout/components/colissimo-logo.js +12 -0
  44. package/dist/checkout/components/colissimo-logo.js.map +1 -0
  45. package/dist/checkout/server/create-checkout-session.d.ts.map +1 -1
  46. package/dist/checkout/server/create-checkout-session.js +55 -13
  47. package/dist/checkout/server/create-checkout-session.js.map +1 -1
  48. package/dist/checkout/server/handle-webhook.js +7 -3
  49. package/dist/checkout/server/handle-webhook.js.map +1 -1
  50. package/dist/checkout/server/order-service.d.ts.map +1 -1
  51. package/dist/checkout/server/order-service.js +25 -0
  52. package/dist/checkout/server/order-service.js.map +1 -1
  53. package/dist/checkout/server/pricing.d.ts +20 -0
  54. package/dist/checkout/server/pricing.d.ts.map +1 -1
  55. package/dist/checkout/server/pricing.js +51 -5
  56. package/dist/checkout/server/pricing.js.map +1 -1
  57. package/dist/checkout/types.d.ts +57 -1
  58. package/dist/checkout/types.d.ts.map +1 -1
  59. package/dist/core/db/queries.d.ts +157 -35
  60. package/dist/core/db/queries.d.ts.map +1 -1
  61. package/dist/core/db/queries.js +223 -1
  62. package/dist/core/db/queries.js.map +1 -1
  63. package/dist/core/db/schema.d.ts +323 -5
  64. package/dist/core/db/schema.d.ts.map +1 -1
  65. package/dist/core/db/schema.js +70 -0
  66. package/dist/core/db/schema.js.map +1 -1
  67. package/dist/core/i18n/messages/en.d.ts.map +1 -1
  68. package/dist/core/i18n/messages/en.js +9 -0
  69. package/dist/core/i18n/messages/en.js.map +1 -1
  70. package/dist/core/i18n/messages/fr.d.ts.map +1 -1
  71. package/dist/core/i18n/messages/fr.js +9 -0
  72. package/dist/core/i18n/messages/fr.js.map +1 -1
  73. package/dist/shipping/colissimo.d.ts +166 -0
  74. package/dist/shipping/colissimo.d.ts.map +1 -0
  75. package/dist/shipping/colissimo.js +424 -0
  76. package/dist/shipping/colissimo.js.map +1 -0
  77. package/dist/shipping/index.d.ts +4 -1
  78. package/dist/shipping/index.d.ts.map +1 -1
  79. package/dist/shipping/index.js +3 -1
  80. package/dist/shipping/index.js.map +1 -1
  81. package/docs/changelog/epoch-07-shipping-carriers.md +125 -0
  82. package/package.json +6 -1
  83. package/templates/store-template/.claude/skills/manage-products/SKILL.md +1 -1
  84. package/templates/store-template/app/api/admin/orders/[id]/colissimo-defaults/route.ts +6 -0
  85. package/templates/store-template/app/api/admin/orders/[id]/label/route.ts +6 -0
  86. package/templates/store-template/app/api/admin/orders/[id]/ship-with-colissimo/route.ts +6 -0
  87. package/templates/store-template/app/api/admin/shipping/colissimo/route.ts +10 -0
  88. package/templates/store-template/app/api/checkout/colissimo-relays/route.ts +4 -0
  89. package/templates/store-template/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"manual.js","sourceRoot":"","sources":["../../../src/checkout/api/manual.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manual.js","sourceRoot":"","sources":["../../../src/checkout/api/manual.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shipping.d.ts","sourceRoot":"","sources":["../../../src/checkout/api/shipping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EACV,2BAA2B,EAG3B,gBAAgB,EACjB,MAAM,UAAU,CAAA;AA6CjB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,2BAA2B,GAAG,gBAAgB,CAAC,CAAC,CAqQvE"}
1
+ {"version":3,"file":"shipping.d.ts","sourceRoot":"","sources":["../../../src/checkout/api/shipping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EACV,2BAA2B,EAG3B,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAmDjB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,2BAA2B,GAAG,gBAAgB,CAAC,CAAC,CA6OvE"}
@@ -11,7 +11,7 @@
11
11
  * ```
12
12
  */
13
13
  import { NextResponse } from 'next/server';
14
- import { findSettings, findShippingOptionsForCountry, findStoreLocationById } from '../../core/db/queries';
14
+ import { findSettings, findShippingOptionsForCountry, findStoreLocationById, findActiveShippingCarriers, ensureLegacyShippoCarrier, } from '../../core/db/queries';
15
15
  import { resolveTax } from '../server/pricing';
16
16
  import { resolveCheckoutCustomer } from '../server/checkout-customer';
17
17
  import { getShippoRates, groupShippoRatesByCarrier, shippingAddressToShippo, } from '../../shipping/shippo';
@@ -104,104 +104,80 @@ export async function POST(request) {
104
104
  const orderAmountCents = items.reduce((sum, item) => sum + (item.price * item.quantity), 0);
105
105
  // Convert to dollars for DB queries (min/max order amounts are stored in dollars)
106
106
  const orderAmountDollars = orderAmountCents / 100;
107
- // Fetch store settings to determine shipping mode
107
+ // =========================================================================
108
+ // Carrier REGISTRY composition (SDK 0.20.0). The legacy global
109
+ // `shipping_mode` either/or is retired: every ACTIVE carrier contributes —
110
+ // DB rates (manual + provider-bound carriers like Colissimo, whose relay
111
+ // offers are ordinary rates with fulfillment='relay') UNION Shippo live
112
+ // quotes when a shippo carrier is active and configured.
113
+ // =========================================================================
108
114
  const settings = await findSettings();
109
- const shippingMode = settings?.shippingMode || 'manual';
110
115
  const shippingEnabled = settings?.shippingEnabled ?? true;
111
116
  if (!shippingEnabled) {
112
117
  return NextResponse.json({
113
118
  success: true,
114
119
  options: [],
115
120
  flatOptions: [],
116
- mode: shippingMode,
121
+ mode: 'manual',
117
122
  error: 'Shipping is not enabled for this store',
118
123
  });
119
124
  }
125
+ // Legacy shippo-mode stores self-heal a shippo carrier ROW so their live
126
+ // quotes keep flowing under the registry model.
127
+ await ensureLegacyShippoCarrier(settings?.shippingMode);
120
128
  let groupedOptions = [];
121
- if (shippingMode === 'shippo') {
122
- // =======================================================================
123
- // Shippo Mode: Get real-time carrier rates
124
- // =======================================================================
125
- const shippoFromAddress = settings?.shippoFromAddress;
126
- const shippoDefaultParcel = settings?.shippoDefaultParcel;
127
- if (!shippoFromAddress) {
128
- return NextResponse.json({
129
- success: false,
130
- options: [],
131
- flatOptions: [],
132
- mode: 'shippo',
133
- error: 'Shippo is not properly configured. Store address is missing.',
134
- });
135
- }
136
- if (!shippoDefaultParcel) {
137
- return NextResponse.json({
138
- success: false,
139
- options: [],
140
- flatOptions: [],
141
- mode: 'shippo',
142
- error: 'Shippo is not properly configured. Default parcel dimensions are missing.',
143
- });
144
- }
145
- try {
146
- // Convert our ShippingAddress to Shippo format
129
+ const country = address.country.toUpperCase();
130
+ // ---- DB rates from ALL active carriers (zones + thresholds + groups).
131
+ try {
132
+ const dbOptions = await findShippingOptionsForCountry(country, orderAmountDollars, customerGroupId);
133
+ // Convert prices from dollars (DB storage) to cents (frontend/Stripe expects cents)
134
+ groupedOptions = dbOptions.map(group => ({
135
+ ...group,
136
+ options: group.options.map(opt => ({
137
+ ...opt,
138
+ price: Math.round(opt.price * 100), // dollars to cents
139
+ })),
140
+ }));
141
+ // Free shipping is configured as a $0 rate inside a zone (optionally
142
+ // with a "free over X" minimum on the rate) — nothing to inject here.
143
+ }
144
+ catch (error) {
145
+ console.error('[Shipping API] rate lookup error:', error);
146
+ return NextResponse.json({
147
+ success: false,
148
+ options: [],
149
+ flatOptions: [],
150
+ mode: 'manual',
151
+ error: error instanceof Error
152
+ ? `Failed to calculate shipping: ${error.message}`
153
+ : 'Failed to calculate shipping',
154
+ });
155
+ }
156
+ // ---- Shippo live quotes (when a shippo carrier is active + configured).
157
+ // Degrades gracefully: a Shippo outage drops its quotes but never blanks
158
+ // the other carriers' options.
159
+ try {
160
+ const carriers = await findActiveShippingCarriers();
161
+ const shippoActive = carriers.some((c) => c.provider === 'shippo');
162
+ if (shippoActive && settings?.shippoFromAddress && settings?.shippoDefaultParcel) {
147
163
  const toAddress = shippingAddressToShippo(address);
148
- // Get rates from Shippo
149
164
  const rates = await getShippoRates({
150
- fromAddress: shippoFromAddress,
165
+ fromAddress: settings.shippoFromAddress,
151
166
  toAddress,
152
- parcel: shippoDefaultParcel,
153
- });
154
- // Group rates by carrier for consistent UI
155
- groupedOptions = groupShippoRatesByCarrier(rates);
156
- }
157
- catch (error) {
158
- console.error('[Shipping API] Shippo error:', error);
159
- return NextResponse.json({
160
- success: false,
161
- options: [],
162
- flatOptions: [],
163
- mode: 'shippo',
164
- error: error instanceof Error
165
- ? `Failed to get carrier rates: ${error.message}`
166
- : 'Failed to get carrier rates',
167
+ parcel: settings.shippoDefaultParcel,
167
168
  });
169
+ groupedOptions = [...groupedOptions, ...groupShippoRatesByCarrier(rates)];
168
170
  }
169
171
  }
170
- else {
171
- // =======================================================================
172
- // Manual Mode: Use configured zones and rates
173
- // =======================================================================
174
- try {
175
- // Convert country code to uppercase for consistency
176
- const country = address.country.toUpperCase();
177
- // Get shipping options for this country and order amount (in dollars for DB query)
178
- const dbOptions = await findShippingOptionsForCountry(country, orderAmountDollars, customerGroupId);
179
- // Convert prices from dollars (DB storage) to cents (frontend/Stripe expects cents)
180
- groupedOptions = dbOptions.map(group => ({
181
- ...group,
182
- options: group.options.map(opt => ({
183
- ...opt,
184
- price: Math.round(opt.price * 100), // dollars to cents
185
- })),
186
- }));
187
- // Free shipping is configured as a $0 rate inside a zone (optionally
188
- // with a "free over X" minimum on the rate). `findShippingOptionsForCountry`
189
- // already honors that rate's min/max order amount and the storefront
190
- // renders price === 0 as "FREE", so there is nothing to inject here.
191
- }
192
- catch (error) {
193
- console.error('[Shipping API] Manual mode error:', error);
194
- return NextResponse.json({
195
- success: false,
196
- options: [],
197
- flatOptions: [],
198
- mode: 'manual',
199
- error: error instanceof Error
200
- ? `Failed to calculate shipping: ${error.message}`
201
- : 'Failed to calculate shipping',
202
- });
203
- }
172
+ catch (error) {
173
+ console.error('[Shipping API] Shippo quotes unavailable (degraded):', error);
174
+ }
175
+ // ---- Deterministic presentation order: carriers by their top price
176
+ // descending, options within a carrier by price descending.
177
+ for (const group of groupedOptions) {
178
+ group.options.sort((a, b) => b.price - a.price);
204
179
  }
180
+ groupedOptions.sort((a, b) => (b.options[0]?.price ?? 0) - (a.options[0]?.price ?? 0));
205
181
  // Flatten options for convenience
206
182
  const flatOptions = groupedOptions.flatMap((group) => group.options);
207
183
  // =========================================================================
@@ -239,7 +215,9 @@ export async function POST(request) {
239
215
  success: true,
240
216
  options: groupedOptions,
241
217
  flatOptions,
242
- mode: shippingMode,
218
+ // Legacy field — the registry model has no global mode; kept for
219
+ // response-shape compatibility with older storefront code.
220
+ mode: 'manual',
243
221
  tax,
244
222
  });
245
223
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shipping.js","sourceRoot":"","sources":["../../../src/checkout/api/shipping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shipping.js","sourceRoot":"","sources":["../../../src/checkout/api/shipping.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CheckoutFlow.d.ts","sourceRoot":"","sources":["../../../src/checkout/components/CheckoutFlow.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,OAAO,KAAK,EACV,iBAAiB,EAMlB,MAAM,UAAU,CAAA;AA+TjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,gBAAuB,EACvB,QAAgB,EAChB,QAAQ,GACT,EAAE,iBAAiB,2CA4mCnB"}
1
+ {"version":3,"file":"CheckoutFlow.d.ts","sourceRoot":"","sources":["../../../src/checkout/components/CheckoutFlow.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,OAAO,KAAK,EACV,iBAAiB,EAOlB,MAAM,UAAU,CAAA;AA+UjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,gBAAuB,EACvB,QAAgB,EAChB,QAAQ,GACT,EAAE,iBAAiB,2CAuzCnB"}
@@ -12,7 +12,7 @@
12
12
  */
13
13
  'use client';
14
14
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
15
- import { useState, useCallback, useEffect } from 'react';
15
+ import { useState, useCallback, useEffect, useRef } from 'react';
16
16
  import { ArrowLeft, Loader2, Check, MapPin, Truck, CreditCard, Store, Clock } from 'lucide-react';
17
17
  import { cn } from '../../core/utils';
18
18
  import { formatPrice } from '../../core/utils';
@@ -26,6 +26,22 @@ import { SignUpForm } from '../../auth/components/SignUpForm';
26
26
  import { ShippingForm } from './ShippingForm';
27
27
  import { ShippingOptions } from './ShippingOptions';
28
28
  import { OrderSummary } from './OrderSummary';
29
+ /**
30
+ * Client-side French mobile check (relay UX pre-validation only — the pricing
31
+ * core re-validates server-side; see resolveShippingSelection).
32
+ */
33
+ function isFrenchMobileClient(phone) {
34
+ if (!phone)
35
+ return false;
36
+ const digits = phone.replace(/[\s.\-()]/g, '');
37
+ return /^(?:\+33|0033|0)[67]\d{8}$/.test(digits);
38
+ }
39
+ /** "240 m" / "1.2 km" for a relay-point card. */
40
+ function formatRelayDistance(meters) {
41
+ if (meters == null)
42
+ return null;
43
+ return meters < 1000 ? `${meters} m` : `${(meters / 1000).toFixed(1)} km`;
44
+ }
29
45
  /** "Open today 09:00–18:00" line for a pickup-location card (Mon = day 0). */
30
46
  function formatTodayHours(location, t) {
31
47
  const day = (new Date().getDay() + 6) % 7;
@@ -224,6 +240,16 @@ export function CheckoutFlow({ onComplete, onCancel, customerEmail, customerId,
224
240
  const [pickupContact, setPickupContact] = useState({ firstName: '', lastName: '' });
225
241
  const [showAllLocations, setShowAllLocations] = useState(false);
226
242
  const isPickup = state.fulfillment === 'pickup';
243
+ // Carrier relay delivery (Colissimo Point Retrait): the point picker opens
244
+ // under the shipping options when a source==='relay' option is selected.
245
+ const [relayPoints, setRelayPoints] = useState([]);
246
+ const [selectedRelay, setSelectedRelay] = useState(null);
247
+ const [isLoadingRelays, setIsLoadingRelays] = useState(false);
248
+ const [relayError, setRelayError] = useState(null);
249
+ const [showAllRelays, setShowAllRelays] = useState(false);
250
+ // Relay = a DB rate with fulfillment 'relay' (carrier pickup point) — the
251
+ // registry model has no 'relay' source.
252
+ const isRelaySelected = state.selectedShipping?.fulfillment === 'relay';
227
253
  // Saved address book (logged-in customers only). Powers the address selector.
228
254
  // Guests get an empty list and the plain form.
229
255
  const { addresses: savedAddresses } = useAddresses(!!customerId);
@@ -369,6 +395,13 @@ export function CheckoutFlow({ onComplete, onCancel, customerEmail, customerId,
369
395
  price: Math.round(item.price * 100), // Convert to cents
370
396
  quantity: item.quantity,
371
397
  }));
398
+ // A new quote invalidates any prior relay-point choice (the search is
399
+ // address-scoped).
400
+ relayFetchedKeyRef.current = null;
401
+ setRelayPoints([]);
402
+ setSelectedRelay(null);
403
+ setRelayError(null);
404
+ setShowAllRelays(false);
372
405
  const response = await fetch('/api/checkout/shipping', {
373
406
  method: 'POST',
374
407
  headers: { 'Content-Type': 'application/json' },
@@ -438,13 +471,106 @@ export function CheckoutFlow({ onComplete, onCancel, customerEmail, customerId,
438
471
  ...prev,
439
472
  selectedShipping: option,
440
473
  }));
474
+ // Leaving the relay option resets the point choice (a stale pick must not
475
+ // survive into a home-delivery selection).
476
+ if (option.fulfillment !== 'relay') {
477
+ setSelectedRelay(null);
478
+ setRelayError(null);
479
+ }
441
480
  }, []);
481
+ // Fetch relay points when the relay option is selected (Pattern C — the
482
+ // search runs against the committed shipping address). Deduped by an
483
+ // address-key ref, NOT by the loading flag — a loading-flag guard inside
484
+ // its own dependency list re-triggers the effect and cancels itself.
485
+ const relayFetchedKeyRef = useRef(null);
486
+ const [relayRetryNonce, setRelayRetryNonce] = useState(0);
487
+ useEffect(() => {
488
+ if (!isRelaySelected)
489
+ return;
490
+ const addr = state.shippingAddress;
491
+ if (!addr?.postalCode || !addr?.city)
492
+ return;
493
+ const key = `${addr.postalCode}|${addr.city}|${addr.line1 || ''}|${relayRetryNonce}`;
494
+ if (relayFetchedKeyRef.current === key)
495
+ return;
496
+ relayFetchedKeyRef.current = key;
497
+ // Staleness is checked against the ref (a NEWER key invalidates this
498
+ // result) rather than an effect-cleanup flag — a cleanup flag cancels the
499
+ // in-flight fetch on any same-key re-run and strands the loading state.
500
+ const isStale = () => relayFetchedKeyRef.current !== key;
501
+ // eslint-disable-next-line react-hooks/set-state-in-effect
502
+ setIsLoadingRelays(true);
503
+ setRelayError(null);
504
+ fetch('/api/checkout/colissimo-relays', {
505
+ method: 'POST',
506
+ headers: { 'Content-Type': 'application/json' },
507
+ body: JSON.stringify({
508
+ zipCode: addr.postalCode,
509
+ city: addr.city,
510
+ address: addr.line1 || undefined,
511
+ }),
512
+ })
513
+ .then((r) => r.json())
514
+ .then((data) => {
515
+ if (isStale())
516
+ return;
517
+ setIsLoadingRelays(false);
518
+ if (!data.success) {
519
+ setRelayError(data.error || t('checkout.relayError'));
520
+ return;
521
+ }
522
+ setRelayPoints(data.relays);
523
+ if (data.relays.length === 0) {
524
+ setRelayError(t('checkout.relayNone'));
525
+ }
526
+ })
527
+ .catch(() => {
528
+ if (isStale())
529
+ return;
530
+ setIsLoadingRelays(false);
531
+ setRelayError(t('checkout.relayError'));
532
+ });
533
+ }, [isRelaySelected, relayRetryNonce, state.shippingAddress, t]);
534
+ // Relay UX pre-validation: Colissimo notifies by SMS, a French mobile is
535
+ // mandatory (the pricing core re-validates server-side).
536
+ const relayMobileOk = isFrenchMobileClient(state.shippingAddress?.phone);
442
537
  // Handle shipping confirmation
443
538
  const handleShippingContinue = useCallback(() => {
444
539
  if (!state.selectedShipping)
445
540
  return;
541
+ if (state.selectedShipping.fulfillment === 'relay') {
542
+ if (!selectedRelay || !relayMobileOk)
543
+ return;
544
+ // Commit the chosen point onto the selection. `id` stays the RATE id
545
+ // (the pricing core re-derives the price from it like any manual
546
+ // rate); the point rides `relayPointId` and is re-verified with the
547
+ // carrier server-side. Name/description enrichment is display-only,
548
+ // derived from the pristine option so re-entering this step never
549
+ // double-suffixes.
550
+ const pristine = state.availableShipping
551
+ .flatMap((g) => g.options)
552
+ .find((o) => o.id === state.selectedShipping.id);
553
+ setState((prev) => ({
554
+ ...prev,
555
+ selectedShipping: prev.selectedShipping
556
+ ? {
557
+ ...prev.selectedShipping,
558
+ relayPointId: selectedRelay.id,
559
+ name: `${pristine?.name || t('checkout.relayOptionName')} — ${selectedRelay.name}`,
560
+ description: [
561
+ selectedRelay.line1,
562
+ `${selectedRelay.postalCode} ${selectedRelay.city}`,
563
+ ]
564
+ .filter(Boolean)
565
+ .join(', '),
566
+ }
567
+ : prev.selectedShipping,
568
+ step: 'review',
569
+ }));
570
+ return;
571
+ }
446
572
  setState((prev) => ({ ...prev, step: 'review' }));
447
- }, [state.selectedShipping]);
573
+ }, [state.selectedShipping, state.availableShipping, selectedRelay, relayMobileOk, t]);
448
574
  // ── Click & collect ───────────────────────────────────────────────────────
449
575
  const handleFulfillmentChange = useCallback((mode) => {
450
576
  setShowAllLocations(false);
@@ -658,7 +784,20 @@ export function CheckoutFlow({ onComplete, onCancel, customerEmail, customerId,
658
784
  // (same i18n key) and owns the contact email. Without these
659
785
  // two, the shopper gets the section title twice and two
660
786
  // required email boxes on one step.
661
- showHeading: false, showEmail: false, defaultValues: state.shippingAddress || undefined, onSubmit: handleAddressSubmit, onCancel: onCancel, showBillingAddress: true, onBillingAddressChange: (addr) => setState((prev) => ({ ...prev, billingAddress: addr })), allowedCountries: allowedCountries.length > 0 ? allowedCountries : undefined }, formKey)] }))] })), state.step === 'shipping' && (_jsxs("div", { className: "space-y-6", children: [_jsx("h2", { className: "text-xl font-semibold", children: t('checkout.shippingMethodTitle') }), _jsx(ShippingOptions, { options: state.availableShipping, selectedOption: state.selectedShipping, onSelect: handleShippingSelect, isLoading: state.isLoadingShipping, error: state.shippingError, currency: resolvedCurrency }), _jsxs("div", { className: "flex gap-4 pt-4", children: [_jsx("button", { type: "button", onClick: goBack, className: cn('flex-1 px-4 py-3 rounded-md font-medium', 'border border-input bg-background', 'hover:bg-muted', 'transition-colors'), children: t('common.back') }), _jsx("button", { type: "button", onClick: handleShippingContinue, disabled: !state.selectedShipping || state.isLoadingShipping, className: cn('flex-1 px-4 py-3 rounded-md font-medium', 'bg-primary text-primary-foreground', 'hover:bg-primary/90', 'transition-colors', 'disabled:opacity-50 disabled:cursor-not-allowed'), children: t('checkout.continueToReview') })] })] })), state.step === 'review' && state.shippingAddress && state.selectedShipping && (_jsxs("div", { className: "space-y-6", children: [_jsx("h2", { className: "text-xl font-semibold", children: t('checkout.reviewYourOrder') }), isPickup && state.selectedPickupLocation ? (_jsx("div", { className: "space-y-4", children: _jsxs("div", { className: "p-4 border rounded-lg space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("h4", { className: "flex items-center gap-2 font-medium", children: [_jsx(Store, { className: "h-4 w-4" }), t('checkout.pickupInStore')] }), _jsx("button", { type: "button", onClick: () => setState((prev) => ({ ...prev, step: 'address' })), className: "text-sm text-primary hover:underline shrink-0", children: t('common.edit') })] }), _jsxs("div", { className: "text-sm", children: [_jsx("p", { className: "font-medium", children: state.selectedPickupLocation.name }), _jsx("p", { className: "text-muted-foreground", children: pickupAddressLine(state.selectedPickupLocation) }), formatTodayHours(state.selectedPickupLocation, t) && (_jsxs("p", { className: "text-muted-foreground flex items-center gap-1 mt-1", children: [_jsx(Clock, { className: "h-3 w-3" }), formatTodayHours(state.selectedPickupLocation, t)] })), state.selectedPickupLocation.preparationTime && (_jsx("p", { className: "text-emerald-600 mt-1", children: t('checkout.usuallyReadyIn', { time: translateDynamic(t, 'prep', state.selectedPickupLocation.preparationTime) }) }))] }), _jsxs("div", { className: "border-t pt-3 text-sm", children: [_jsxs("p", { className: "font-medium", children: [pickupContact.firstName, " ", pickupContact.lastName] }), _jsx("p", { className: "text-muted-foreground", children: state.email || customerEmail || '' })] })] }) })) : (_jsx(ReviewSection, { shippingAddress: state.shippingAddress, billingAddress: state.billingAddress, selectedShipping: state.selectedShipping, email: state.email || customerEmail || '', currency: resolvedCurrency, onEditAddress: () => setState((prev) => ({ ...prev, step: 'address' })), onEditShipping: () => setState((prev) => ({ ...prev, step: 'shipping' })) })), !showOrderSummary && discountBlock, paymentMethods.length > 0 && (_jsxs("div", { className: "p-4 border rounded-lg", children: [_jsx("h4", { className: "font-medium mb-3", children: t('checkout.paymentMethod') }), _jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: cn('flex items-start gap-3 rounded-md border p-3 cursor-pointer transition-colors', selectedPaymentMethodId === '' && 'border-primary bg-primary/5'), children: [_jsx("input", { type: "radio", name: "payment-method", checked: selectedPaymentMethodId === '', onChange: () => setSelectedPaymentMethodId(''), className: "mt-1" }), _jsxs("span", { children: [_jsx("span", { className: "block text-sm font-medium", children: t('checkout.card') }), _jsx("span", { className: "block text-xs text-muted-foreground", children: t('checkout.secureViaStripe') })] })] }), paymentMethods.map((m) => (_jsxs("label", { className: cn('flex items-start gap-3 rounded-md border p-3 cursor-pointer transition-colors', selectedPaymentMethodId === m.id && 'border-primary bg-primary/5'), children: [_jsx("input", { type: "radio", name: "payment-method", checked: selectedPaymentMethodId === m.id, onChange: () => setSelectedPaymentMethodId(m.id), className: "mt-1" }), _jsxs("span", { children: [_jsx("span", { className: "block text-sm font-medium", children: m.name }), m.instructions && (_jsx("span", { className: "block text-xs text-muted-foreground line-clamp-2", children: m.instructions }))] })] }, m.id)))] })] })), _jsx("button", { type: "button", onClick: handleCheckout, disabled: state.isProcessing || isCheckoutLoading, className: cn('w-full px-4 py-4 rounded-md font-medium text-lg', 'bg-primary text-primary-foreground', 'hover:bg-primary/90', 'transition-colors', 'disabled:opacity-50 disabled:cursor-not-allowed', 'flex items-center justify-center gap-2'), children: (state.isProcessing || isCheckoutLoading) ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-5 w-5 animate-spin" }), t('common.processing')] })) : (_jsxs(_Fragment, { children: [_jsx(CreditCard, { className: "h-5 w-5" }), selectedPaymentMethodId ? t('checkout.placeOrder') : t('checkout.proceedToPayment')] })) }), _jsx("p", { className: "text-xs text-center text-muted-foreground", children: selectedPaymentMethodId
787
+ showHeading: false, showEmail: false, defaultValues: state.shippingAddress || undefined, onSubmit: handleAddressSubmit, onCancel: onCancel, showBillingAddress: true, onBillingAddressChange: (addr) => setState((prev) => ({ ...prev, billingAddress: addr })), allowedCountries: allowedCountries.length > 0 ? allowedCountries : undefined }, formKey)] }))] })), state.step === 'shipping' && (_jsxs("div", { className: "space-y-6", children: [_jsx("h2", { className: "text-xl font-semibold", children: t('checkout.shippingMethodTitle') }), _jsx(ShippingOptions, { options: state.availableShipping, selectedOption: state.selectedShipping, onSelect: handleShippingSelect, isLoading: state.isLoadingShipping, error: state.shippingError, currency: resolvedCurrency, renderOptionDetail: (option) => option.fulfillment === 'relay' && state.selectedShipping?.id === option.id ? (
788
+ /* Relay-point picker — a CHILD of the selected option,
789
+ nested inside the carrier group container. */
790
+ _jsxs("div", { className: "ml-8 space-y-3 rounded-lg border border-dashed border-border bg-muted/30 p-3", children: [_jsx("p", { className: "text-sm font-medium", children: t('checkout.relayPickerTitle') }), !relayMobileOk && (_jsx("p", { className: "text-sm text-destructive", children: t('checkout.relayMobileRequired') })), isLoadingRelays && (_jsxs("p", { className: "text-sm text-muted-foreground flex items-center gap-2", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), t('checkout.relayLoading')] })), relayError && !isLoadingRelays && (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm text-destructive", children: relayError }), _jsx("button", { type: "button", onClick: () => {
791
+ setRelayError(null);
792
+ setRelayPoints([]);
793
+ setRelayRetryNonce((n) => n + 1);
794
+ }, className: "text-sm underline text-muted-foreground hover:text-foreground", children: t('checkout.relayRetry') })] })), !isLoadingRelays && !relayError && relayPoints.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "space-y-2", children: (showAllRelays ? relayPoints : relayPoints.slice(0, 5)).map((relay) => (_jsxs("label", { className: cn('flex items-start justify-between gap-3 p-3 border rounded-lg cursor-pointer transition-colors bg-card', selectedRelay?.id === relay.id
795
+ ? 'border-primary ring-1 ring-primary'
796
+ : 'border-border hover:border-primary/50'), children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("input", { type: "radio", name: "colissimo-relay", checked: selectedRelay?.id === relay.id, onChange: () => setSelectedRelay(relay), className: "mt-1" }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium", children: relay.name }), _jsx("p", { className: "text-xs text-muted-foreground", children: [relay.line1, `${relay.postalCode} ${relay.city}`]
797
+ .filter(Boolean)
798
+ .join(', ') })] })] }), formatRelayDistance(relay.distanceMeters) && (_jsx("span", { className: "text-xs text-muted-foreground whitespace-nowrap", children: formatRelayDistance(relay.distanceMeters) }))] }, relay.id))) }), relayPoints.length > 5 && !showAllRelays && (_jsx("button", { type: "button", onClick: () => setShowAllRelays(true), className: "text-sm underline text-muted-foreground hover:text-foreground", children: t('checkout.relayShowMore', { count: relayPoints.length - 5 }) }))] }))] })) : null }), _jsxs("div", { className: "flex gap-4 pt-4", children: [_jsx("button", { type: "button", onClick: goBack, className: cn('flex-1 px-4 py-3 rounded-md font-medium', 'border border-input bg-background', 'hover:bg-muted', 'transition-colors'), children: t('common.back') }), _jsx("button", { type: "button", onClick: handleShippingContinue, disabled: !state.selectedShipping ||
799
+ state.isLoadingShipping ||
800
+ (isRelaySelected && (!selectedRelay || !relayMobileOk)), className: cn('flex-1 px-4 py-3 rounded-md font-medium', 'bg-primary text-primary-foreground', 'hover:bg-primary/90', 'transition-colors', 'disabled:opacity-50 disabled:cursor-not-allowed'), children: t('checkout.continueToReview') })] })] })), state.step === 'review' && state.shippingAddress && state.selectedShipping && (_jsxs("div", { className: "space-y-6", children: [_jsx("h2", { className: "text-xl font-semibold", children: t('checkout.reviewYourOrder') }), isPickup && state.selectedPickupLocation ? (_jsx("div", { className: "space-y-4", children: _jsxs("div", { className: "p-4 border rounded-lg space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("h4", { className: "flex items-center gap-2 font-medium", children: [_jsx(Store, { className: "h-4 w-4" }), t('checkout.pickupInStore')] }), _jsx("button", { type: "button", onClick: () => setState((prev) => ({ ...prev, step: 'address' })), className: "text-sm text-primary hover:underline shrink-0", children: t('common.edit') })] }), _jsxs("div", { className: "text-sm", children: [_jsx("p", { className: "font-medium", children: state.selectedPickupLocation.name }), _jsx("p", { className: "text-muted-foreground", children: pickupAddressLine(state.selectedPickupLocation) }), formatTodayHours(state.selectedPickupLocation, t) && (_jsxs("p", { className: "text-muted-foreground flex items-center gap-1 mt-1", children: [_jsx(Clock, { className: "h-3 w-3" }), formatTodayHours(state.selectedPickupLocation, t)] })), state.selectedPickupLocation.preparationTime && (_jsx("p", { className: "text-emerald-600 mt-1", children: t('checkout.usuallyReadyIn', { time: translateDynamic(t, 'prep', state.selectedPickupLocation.preparationTime) }) }))] }), _jsxs("div", { className: "border-t pt-3 text-sm", children: [_jsxs("p", { className: "font-medium", children: [pickupContact.firstName, " ", pickupContact.lastName] }), _jsx("p", { className: "text-muted-foreground", children: state.email || customerEmail || '' })] })] }) })) : (_jsx(ReviewSection, { shippingAddress: state.shippingAddress, billingAddress: state.billingAddress, selectedShipping: state.selectedShipping, email: state.email || customerEmail || '', currency: resolvedCurrency, onEditAddress: () => setState((prev) => ({ ...prev, step: 'address' })), onEditShipping: () => setState((prev) => ({ ...prev, step: 'shipping' })) })), !showOrderSummary && discountBlock, paymentMethods.length > 0 && (_jsxs("div", { className: "p-4 border rounded-lg", children: [_jsx("h4", { className: "font-medium mb-3", children: t('checkout.paymentMethod') }), _jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: cn('flex items-start gap-3 rounded-md border p-3 cursor-pointer transition-colors', selectedPaymentMethodId === '' && 'border-primary bg-primary/5'), children: [_jsx("input", { type: "radio", name: "payment-method", checked: selectedPaymentMethodId === '', onChange: () => setSelectedPaymentMethodId(''), className: "mt-1" }), _jsxs("span", { children: [_jsx("span", { className: "block text-sm font-medium", children: t('checkout.card') }), _jsx("span", { className: "block text-xs text-muted-foreground", children: t('checkout.secureViaStripe') })] })] }), paymentMethods.map((m) => (_jsxs("label", { className: cn('flex items-start gap-3 rounded-md border p-3 cursor-pointer transition-colors', selectedPaymentMethodId === m.id && 'border-primary bg-primary/5'), children: [_jsx("input", { type: "radio", name: "payment-method", checked: selectedPaymentMethodId === m.id, onChange: () => setSelectedPaymentMethodId(m.id), className: "mt-1" }), _jsxs("span", { children: [_jsx("span", { className: "block text-sm font-medium", children: m.name }), m.instructions && (_jsx("span", { className: "block text-xs text-muted-foreground line-clamp-2", children: m.instructions }))] })] }, m.id)))] })] })), _jsx("button", { type: "button", onClick: handleCheckout, disabled: state.isProcessing || isCheckoutLoading, className: cn('w-full px-4 py-4 rounded-md font-medium text-lg', 'bg-primary text-primary-foreground', 'hover:bg-primary/90', 'transition-colors', 'disabled:opacity-50 disabled:cursor-not-allowed', 'flex items-center justify-center gap-2'), children: (state.isProcessing || isCheckoutLoading) ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-5 w-5 animate-spin" }), t('common.processing')] })) : (_jsxs(_Fragment, { children: [_jsx(CreditCard, { className: "h-5 w-5" }), selectedPaymentMethodId ? t('checkout.placeOrder') : t('checkout.proceedToPayment')] })) }), _jsx("p", { className: "text-xs text-center text-muted-foreground", children: selectedPaymentMethodId
662
801
  ? t('checkout.manualConfirmNote')
663
802
  : t('checkout.stripeRedirectNote') })] }))] })) }), showOrderSummary && (_jsx("div", { className: "lg:col-span-1", children: _jsxs("div", { className: "sticky top-4 space-y-3", children: [_jsx(OrderSummary, { items: items.map((item) => ({
664
803
  productId: item.productId,