@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.
- package/dist/admin/api/index.d.ts +2 -2
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +2 -2
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/orders.d.ts +49 -0
- package/dist/admin/api/orders.d.ts.map +1 -1
- package/dist/admin/api/orders.js +293 -30
- package/dist/admin/api/orders.js.map +1 -1
- package/dist/admin/api/settings.d.ts.map +1 -1
- package/dist/admin/api/settings.js +6 -1
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/api/shipping.d.ts +49 -0
- package/dist/admin/api/shipping.d.ts.map +1 -1
- package/dist/admin/api/shipping.js +144 -0
- package/dist/admin/api/shipping.js.map +1 -1
- package/dist/admin/components/OrderDetails.d.ts.map +1 -1
- package/dist/admin/components/OrderDetails.js +69 -1
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
- package/dist/admin/components/ShippingSettings.js +313 -134
- package/dist/admin/components/ShippingSettings.js.map +1 -1
- package/dist/admin/types.d.ts +13 -0
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/checkout/api/colissimo-relays.d.ts +24 -0
- package/dist/checkout/api/colissimo-relays.d.ts.map +1 -0
- package/dist/checkout/api/colissimo-relays.js +60 -0
- package/dist/checkout/api/colissimo-relays.js.map +1 -0
- package/dist/checkout/api/manual.d.ts.map +1 -1
- package/dist/checkout/api/manual.js +21 -5
- package/dist/checkout/api/manual.js.map +1 -1
- package/dist/checkout/api/shipping.d.ts.map +1 -1
- package/dist/checkout/api/shipping.js +60 -82
- package/dist/checkout/api/shipping.js.map +1 -1
- package/dist/checkout/components/CheckoutFlow.d.ts.map +1 -1
- package/dist/checkout/components/CheckoutFlow.js +142 -3
- package/dist/checkout/components/CheckoutFlow.js.map +1 -1
- package/dist/checkout/components/ShippingOptions.d.ts +8 -1
- package/dist/checkout/components/ShippingOptions.d.ts.map +1 -1
- package/dist/checkout/components/ShippingOptions.js +40 -11
- package/dist/checkout/components/ShippingOptions.js.map +1 -1
- package/dist/checkout/components/colissimo-logo.d.ts +12 -0
- package/dist/checkout/components/colissimo-logo.d.ts.map +1 -0
- package/dist/checkout/components/colissimo-logo.js +12 -0
- package/dist/checkout/components/colissimo-logo.js.map +1 -0
- package/dist/checkout/server/create-checkout-session.d.ts.map +1 -1
- package/dist/checkout/server/create-checkout-session.js +55 -13
- package/dist/checkout/server/create-checkout-session.js.map +1 -1
- package/dist/checkout/server/handle-webhook.js +7 -3
- package/dist/checkout/server/handle-webhook.js.map +1 -1
- package/dist/checkout/server/order-service.d.ts.map +1 -1
- package/dist/checkout/server/order-service.js +25 -0
- package/dist/checkout/server/order-service.js.map +1 -1
- package/dist/checkout/server/pricing.d.ts +20 -0
- package/dist/checkout/server/pricing.d.ts.map +1 -1
- package/dist/checkout/server/pricing.js +51 -5
- package/dist/checkout/server/pricing.js.map +1 -1
- package/dist/checkout/types.d.ts +57 -1
- package/dist/checkout/types.d.ts.map +1 -1
- package/dist/core/db/queries.d.ts +157 -35
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +223 -1
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +323 -5
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +70 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/i18n/messages/en.d.ts.map +1 -1
- package/dist/core/i18n/messages/en.js +9 -0
- package/dist/core/i18n/messages/en.js.map +1 -1
- package/dist/core/i18n/messages/fr.d.ts.map +1 -1
- package/dist/core/i18n/messages/fr.js +9 -0
- package/dist/core/i18n/messages/fr.js.map +1 -1
- package/dist/shipping/colissimo.d.ts +166 -0
- package/dist/shipping/colissimo.d.ts.map +1 -0
- package/dist/shipping/colissimo.js +424 -0
- package/dist/shipping/colissimo.js.map +1 -0
- package/dist/shipping/index.d.ts +4 -1
- package/dist/shipping/index.d.ts.map +1 -1
- package/dist/shipping/index.js +3 -1
- package/dist/shipping/index.js.map +1 -1
- package/docs/changelog/epoch-07-shipping-carriers.md +125 -0
- package/package.json +6 -1
- package/templates/store-template/.claude/skills/manage-products/SKILL.md +1 -1
- package/templates/store-template/app/api/admin/orders/[id]/colissimo-defaults/route.ts +6 -0
- package/templates/store-template/app/api/admin/orders/[id]/label/route.ts +6 -0
- package/templates/store-template/app/api/admin/orders/[id]/ship-with-colissimo/route.ts +6 -0
- package/templates/store-template/app/api/admin/shipping/colissimo/route.ts +10 -0
- package/templates/store-template/app/api/checkout/colissimo-relays/route.ts +4 -0
- 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;
|
|
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
|
-
//
|
|
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:
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
|
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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AAOvD,OAAO,
|
|
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,
|
|
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
|
|
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,
|