export type CheckoutContext = { productId?: string | null; qty?: string | number | null; addressId?: string | null; cross?: boolean | string | null; select?: boolean | string | null; }; export function readCheckoutContext(params: URLSearchParams): CheckoutContext { return { productId: params.get('productId'), qty: params.get('qty'), addressId: params.get('addressId'), cross: params.get('cross'), select: params.get('select'), }; } export function appendCheckoutContext(qs: URLSearchParams, ctx: CheckoutContext) { if (ctx.productId) qs.set('productId', ctx.productId); if (ctx.qty != null && ctx.qty !== '') qs.set('qty', String(ctx.qty)); if (ctx.addressId) qs.set('addressId', ctx.addressId); if (ctx.cross === true || ctx.cross === '1') qs.set('cross', '1'); if (ctx.select === true || ctx.select === '1') qs.set('select', '1'); } export function buildOrderConfirmUrl(search: CheckoutContext) { const qs = new URLSearchParams(); if (search.productId) qs.set('productId', search.productId); if (search.qty != null && search.qty !== '') qs.set('qty', String(search.qty)); if (search.addressId) qs.set('addressId', search.addressId); if (search.cross === true || search.cross === '1') qs.set('cross', '1'); const query = qs.toString(); return query ? `/order/confirm?${query}` : '/order/confirm'; } export function buildAddressListUrl(ctx: CheckoutContext = {}) { const qs = new URLSearchParams(); appendCheckoutContext(qs, ctx); const query = qs.toString(); return query ? `/addresses?${query}` : '/addresses'; } export function buildAddressEditUrl(id: string | 'new', ctx: CheckoutContext = {}) { const path = id === 'new' ? '/addresses/new' : `/addresses/${id}/edit`; const qs = new URLSearchParams(); appendCheckoutContext(qs, ctx); const query = qs.toString(); return query ? `${path}?${query}` : path; } export function buildProductDetailUrl(productId?: string | null) { return productId ? `/product/${productId}` : '/'; } export function buildOrderAddressSelectUrl(orderId: string) { return `/addresses?orderId=${orderId}&select=1`; } export function hasCheckoutContext(ctx: CheckoutContext) { return Boolean(ctx.productId || ctx.select === true || ctx.select === '1'); }