@burdenoff/microfe-billing 2026.901.2 → 2026.903.2
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/billing/modules/checkout/components/StoreShippingSection.js +125 -99
- package/dist/billing/modules/checkout/components/StoreShippingSection.js.map +1 -1
- package/dist/billing/modules/checkout/hooks/useCheckout.js +49 -47
- package/dist/billing/modules/checkout/hooks/useCheckout.js.map +1 -1
- package/dist/billing/modules/checkout/pages/CheckoutPage.js +5 -3
- package/dist/billing/modules/checkout/pages/CheckoutPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoreShippingSection.js","names":[],"sources":["../../../../../src/billing/modules/checkout/components/StoreShippingSection.tsx"],"sourcesContent":["/**\n * StoreShippingSection\n * ============================================================================\n * Physical-store-order-only shipping picker rendered inside the checkout\n * left column. Lets the buyer pick (or add) a delivery address and a shipping\n * method, then fetches a DISPLAY-ONLY cost estimate. The authoritative cost is\n * recomputed and persisted server-side via `setStoreOrderShipping` at\n * proceed-to-payment time (see CheckoutPage.handleProceedToPayment).\n *\n * This component is only ever mounted for store orders that contain a PHYSICAL\n * line item, so nothing here runs on the digital/plan/addon/credits checkout\n * path.\n *\n * Field set / validation / country list mirror\n * `components/CompleteBillingAccountModal.tsx` for visual + behavioural\n * consistency (shipping adds a required recipient `fullName`).\n */\n\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { MapPin, Truck, Plus, Loader2, Check, X } from 'lucide-react';\nimport {\n useMyShippingAddresses,\n useCreateShippingAddress,\n useShippingMethods,\n useEstimateOrderShipping,\n type ShippingAddress,\n} from '../hooks/useStoreShipping';\n\n// Mirror of CompleteBillingAccountModal COUNTRY_OPTIONS.\nconst COUNTRY_OPTIONS = [\n { value: 'IN', label: 'India' },\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'AU', label: 'Australia' },\n { value: 'CA', label: 'Canada' },\n { value: 'SG', label: 'Singapore' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'UAE' },\n];\n\nexport interface StoreShippingSelection {\n shippingAddressId: string | null;\n shippingMethodId: string | null;\n /** DISPLAY-ONLY estimate in the order currency; backend recomputes on submit. */\n shippingCost: number;\n destinationCountry: string | null;\n}\n\ninterface Props {\n storeOrderId: string;\n /** Order/checkout currency, used only for formatting the estimate. */\n currency: string;\n onChange: (selection: StoreShippingSelection) => void;\n}\n\ninterface AddressFormState {\n fullName: string;\n phone: string;\n addressLine1: string;\n addressLine2: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n}\n\ninterface AddressFormErrors {\n fullName?: string;\n addressLine1?: string;\n city?: string;\n postalCode?: string;\n country?: string;\n}\n\nconst EMPTY_FORM: AddressFormState = {\n fullName: '',\n phone: '',\n addressLine1: '',\n addressLine2: '',\n city: '',\n state: '',\n postalCode: '',\n country: 'IN',\n};\n\nfunction formatCost(amount: number, currency: string): string {\n try {\n return amount.toLocaleString('en', { style: 'currency', currency: currency || 'USD' });\n } catch {\n return `${currency || 'USD'} ${amount.toFixed(2)}`;\n }\n}\n\nfunction formatEta(minDays?: number | null, maxDays?: number | null): string | null {\n if (minDays == null && maxDays == null) return null;\n if (minDays != null && maxDays != null) {\n return minDays === maxDays ? `${minDays} days` : `${minDays}–${maxDays} days`;\n }\n const single = minDays ?? maxDays;\n return single != null ? `${single} days` : null;\n}\n\nexport const StoreShippingSection: FC<Props> = ({ storeOrderId, currency, onChange }) => {\n const {\n addresses,\n loading: addressesLoading,\n refetch: refetchAddresses,\n } = useMyShippingAddresses();\n const { createShippingAddress, loading: creatingAddress } = useCreateShippingAddress();\n const { methods, loading: methodsLoading } = useShippingMethods();\n const [runEstimate, { data: estData, loading: estimateLoading }] = useEstimateOrderShipping();\n\n const [selectedAddressId, setSelectedAddressId] = useState<string | null>(null);\n const [selectedMethodId, setSelectedMethodId] = useState<string | null>(null);\n\n const [showAddForm, setShowAddForm] = useState(false);\n const [form, setForm] = useState<AddressFormState>(EMPTY_FORM);\n const [formErrors, setFormErrors] = useState<AddressFormErrors>({});\n const [formServerError, setFormServerError] = useState<string | null>(null);\n\n // Keep onChange in a ref so the emit effect never depends on its identity.\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n\n const selectedAddress = useMemo<ShippingAddress | undefined>(\n () => addresses.find((a) => a.id === selectedAddressId),\n [addresses, selectedAddressId]\n );\n\n // Methods available for the selected address' destination country.\n // Empty availableCountries is treated as \"available everywhere\".\n const availableMethods = useMemo(() => {\n if (!selectedAddress) return [];\n const country = selectedAddress.country;\n return methods\n .filter(\n (m) =>\n m.isActive &&\n (m.availableCountries.length === 0 || m.availableCountries.includes(country)) &&\n !m.excludedCountries.includes(country)\n )\n .sort((a, b) => a.displayOrder - b.displayOrder);\n }, [methods, selectedAddress]);\n\n // Default the address selection to the user's default (or first) address.\n useEffect(() => {\n if (!selectedAddressId && addresses.length > 0) {\n const preferred = addresses.find((a) => a.isDefault) ?? addresses[0];\n setSelectedAddressId(preferred.id);\n }\n }, [addresses, selectedAddressId]);\n\n // Drop a selected method that is no longer valid for the chosen destination.\n useEffect(() => {\n if (selectedMethodId && !availableMethods.some((m) => m.id === selectedMethodId)) {\n setSelectedMethodId(null);\n }\n }, [availableMethods, selectedMethodId]);\n\n // Fetch a fresh estimate whenever address + method are both chosen.\n useEffect(() => {\n if (selectedAddress && selectedMethodId) {\n void runEstimate({\n variables: {\n input: {\n orderId: storeOrderId,\n shippingMethodId: selectedMethodId,\n destinationCountry: selectedAddress.country,\n destinationPostalCode: selectedAddress.postalCode,\n },\n },\n });\n }\n }, [\n selectedAddress?.id,\n selectedAddress?.country,\n selectedAddress?.postalCode,\n selectedMethodId,\n storeOrderId,\n runEstimate,\n selectedAddress,\n ]);\n\n const estimate = estData?.estimateOrderShipping;\n const estimateReady = Boolean(\n selectedAddressId &&\n selectedMethodId &&\n !estimateLoading &&\n estimate &&\n estimate.shippingMethodId === selectedMethodId\n );\n\n // Emit the current selection upward. Method id + cost are only surfaced once a\n // matching estimate has resolved, so the parent's proceed gate stays disabled\n // while an estimate is in flight (free shipping resolves with cost 0, which is\n // still \"ready\").\n useEffect(() => {\n onChangeRef.current({\n shippingAddressId: selectedAddressId,\n shippingMethodId: estimateReady ? selectedMethodId : null,\n shippingCost: estimateReady && estimate ? estimate.cost : 0,\n destinationCountry: selectedAddress?.country ?? null,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- emit derived selection; estimate object identity excluded intentionally\n }, [\n selectedAddressId,\n selectedMethodId,\n estimateReady,\n estimate?.cost,\n selectedAddress?.country,\n ]);\n\n const setField = (field: keyof AddressFormState, value: string) =>\n setForm((prev) => ({ ...prev, [field]: value }));\n\n const validateForm = (): boolean => {\n const e: AddressFormErrors = {};\n if (!form.fullName.trim()) e.fullName = 'Recipient name is required';\n if (!form.addressLine1.trim()) e.addressLine1 = 'Street address is required';\n if (!form.city.trim()) e.city = 'City is required';\n if (!form.postalCode.trim()) e.postalCode = 'Postal code is required';\n if (!form.country.trim()) e.country = 'Country is required';\n setFormErrors(e);\n return Object.keys(e).length === 0;\n };\n\n const handleCreateAddress = async () => {\n if (!validateForm()) return;\n setFormServerError(null);\n try {\n const created = await createShippingAddress({\n fullName: form.fullName.trim(),\n ...(form.phone.trim() ? { phone: form.phone.trim() } : {}),\n addressLine1: form.addressLine1.trim(),\n ...(form.addressLine2.trim() ? { addressLine2: form.addressLine2.trim() } : {}),\n city: form.city.trim(),\n ...(form.state.trim() ? { state: form.state.trim() } : {}),\n postalCode: form.postalCode.trim(),\n country: form.country,\n isDefault: addresses.length === 0,\n });\n if (!created) {\n setFormServerError('Failed to save address. Please try again.');\n return;\n }\n await refetchAddresses();\n setSelectedAddressId(created.id);\n setSelectedMethodId(null);\n setForm(EMPTY_FORM);\n setFormErrors({});\n setShowAddForm(false);\n } catch {\n setFormServerError('Failed to save address. Please try again.');\n }\n };\n\n const inputClass = (hasError: boolean) =>\n `w-full px-3 py-2 text-sm border rounded-input bg-bg-surface text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] ${\n hasError ? 'border-status-error-border' : 'border-border-subtle'\n }`;\n\n return (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6 space-y-5\">\n <div className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping\n </div>\n\n {/* Delivery address */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <MapPin className=\"size-4 text-text-secondary\" />\n Delivery address\n </div>\n {!showAddForm && (\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(true);\n setFormServerError(null);\n }}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline\"\n >\n <Plus className=\"size-3.5\" />\n Add address\n </button>\n )}\n </div>\n\n {addressesLoading && addresses.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading addresses…\n </div>\n ) : (\n <>\n {addresses.length === 0 && !showAddForm && (\n <p className=\"text-sm text-text-secondary\">\n No saved delivery addresses yet. Add one to continue.\n </p>\n )}\n {addresses.length > 0 && (\n <div className=\"space-y-2\">\n {addresses.map((addr) => {\n const selected = addr.id === selectedAddressId;\n return (\n <button\n key={addr.id}\n type=\"button\"\n onClick={() => {\n setSelectedAddressId(addr.id);\n setSelectedMethodId(null);\n }}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">\n {addr.fullName}\n {addr.label ? (\n <span className=\"ml-2 text-xs text-text-muted\">({addr.label})</span>\n ) : null}\n </p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {[\n addr.addressLine1,\n addr.addressLine2,\n addr.city,\n addr.state,\n addr.postalCode,\n addr.country,\n ]\n .filter(Boolean)\n .join(', ')}\n </p>\n {addr.phone && (\n <p className=\"text-text-muted text-xs mt-0.5\">{addr.phone}</p>\n )}\n </div>\n {selected && (\n <Check className=\"size-4 text-action-primary-bg shrink-0 mt-0.5\" />\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n\n {/* Inline add-address form */}\n {showAddForm && (\n <div className=\"rounded-input border border-border-subtle p-3 space-y-3 bg-bg-sunken\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">New delivery address</span>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false);\n setFormErrors({});\n setFormServerError(null);\n }}\n className=\"p-1 text-text-secondary hover:text-text-primary rounded-button\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n\n {formServerError && (\n <div className=\"p-2 rounded-lg bg-status-error-bg-subtle border border-status-error-border text-xs text-status-error-text\">\n {formServerError}\n </div>\n )}\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Recipient name</label>\n <input\n type=\"text\"\n value={form.fullName}\n onChange={(e) => setField('fullName', e.target.value)}\n placeholder=\"Jane Doe\"\n className={inputClass(Boolean(formErrors.fullName))}\n />\n {formErrors.fullName && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.fullName}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Phone <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"tel\"\n value={form.phone}\n onChange={(e) => setField('phone', e.target.value)}\n placeholder=\"+91 98765 43210\"\n className={inputClass(false)}\n />\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Country</label>\n <select\n value={form.country}\n onChange={(e) => setField('country', e.target.value)}\n className={inputClass(Boolean(formErrors.country))}\n >\n {COUNTRY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>\n {c.label}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Street address</label>\n <input\n type=\"text\"\n value={form.addressLine1}\n onChange={(e) => setField('addressLine1', e.target.value)}\n placeholder=\"123 Main St\"\n className={inputClass(Boolean(formErrors.addressLine1))}\n />\n {formErrors.addressLine1 && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.addressLine1}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Apartment, suite, etc. <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.addressLine2}\n onChange={(e) => setField('addressLine2', e.target.value)}\n placeholder=\"Apt 4B\"\n className={inputClass(false)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">City</label>\n <input\n type=\"text\"\n value={form.city}\n onChange={(e) => setField('city', e.target.value)}\n placeholder=\"Mumbai\"\n className={inputClass(Boolean(formErrors.city))}\n />\n {formErrors.city && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.city}</p>\n )}\n </div>\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n State <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.state}\n onChange={(e) => setField('state', e.target.value)}\n placeholder=\"Maharashtra\"\n className={inputClass(false)}\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Postal code</label>\n <input\n type=\"text\"\n value={form.postalCode}\n onChange={(e) => setField('postalCode', e.target.value)}\n placeholder=\"400001\"\n className={inputClass(Boolean(formErrors.postalCode))}\n />\n {formErrors.postalCode && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.postalCode}</p>\n )}\n </div>\n\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={handleCreateAddress}\n disabled={creatingAddress}\n className=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg hover:bg-action-primary-bgHover rounded-lg transition-colors disabled:opacity-50\"\n >\n {creatingAddress && <Loader2 className=\"size-4 animate-spin\" />}\n Save address\n </button>\n </div>\n </div>\n )}\n </section>\n\n {/* Shipping method */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping method\n </div>\n\n {!selectedAddress ? (\n <p className=\"text-sm text-text-secondary\">Select a delivery address to see options.</p>\n ) : methodsLoading && methods.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading options…\n </div>\n ) : availableMethods.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n No shipping methods available for {selectedAddress.country}. Try a different address.\n </p>\n ) : (\n <div className=\"space-y-2\">\n {availableMethods.map((method) => {\n const selected = method.id === selectedMethodId;\n const eta = formatEta(method.estimatedMinDays, method.estimatedMaxDays);\n const showEstimate = selected && estimateReady && estimate;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedMethodId(method.id)}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">{method.name}</p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {method.carrier ? `${method.carrier} · ` : ''}\n {eta ?? 'Delivery time varies'}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n {selected && estimateLoading ? (\n <Loader2 className=\"size-4 animate-spin text-text-secondary\" />\n ) : (\n <span className=\"text-sm font-semibold text-text-primary\">\n {showEstimate\n ? formatCost(estimate.cost, estimate.currency || currency)\n : formatCost(method.baseCost, method.currency || currency)}\n </span>\n )}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n\n {estimateReady && estimate && (\n <p className=\"text-xs text-text-secondary\">\n Estimated shipping: {formatCost(estimate.cost, estimate.currency || currency)}\n {estimate.estimatedDeliveryDate\n ? ` · arrives around ${new Date(estimate.estimatedDeliveryDate).toLocaleDateString()}`\n : ''}\n </p>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StoreShippingSection.js","names":[],"sources":["../../../../../src/billing/modules/checkout/components/StoreShippingSection.tsx"],"sourcesContent":["/**\n * StoreShippingSection\n * ============================================================================\n * Physical-store-order-only shipping picker rendered inside the checkout\n * left column. Lets the buyer pick (or add) a delivery address and a shipping\n * method, then fetches a DISPLAY-ONLY cost estimate. The authoritative cost is\n * recomputed and persisted server-side via `setStoreOrderShipping` at\n * proceed-to-payment time (see CheckoutPage.handleProceedToPayment).\n *\n * This component is only ever mounted for store orders that contain a PHYSICAL\n * line item, so nothing here runs on the digital/plan/addon/credits checkout\n * path.\n *\n * Field set / validation / country list mirror\n * `components/CompleteBillingAccountModal.tsx` for visual + behavioural\n * consistency (shipping adds a required recipient `fullName`).\n */\n\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { MapPin, Truck, Plus, Loader2, Check, X } from 'lucide-react';\nimport {\n useMyShippingAddresses,\n useCreateShippingAddress,\n useShippingMethods,\n useEstimateOrderShipping,\n type ShippingAddress,\n} from '../hooks/useStoreShipping';\n\n// Mirror of CompleteBillingAccountModal COUNTRY_OPTIONS.\nconst COUNTRY_OPTIONS = [\n { value: 'IN', label: 'India' },\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'AU', label: 'Australia' },\n { value: 'CA', label: 'Canada' },\n { value: 'SG', label: 'Singapore' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'UAE' },\n];\n\nexport interface StoreShippingSelection {\n shippingAddressId: string | null;\n shippingMethodId: string | null;\n /** DISPLAY-ONLY estimate in the order currency; backend recomputes on submit. */\n shippingCost: number;\n destinationCountry: string | null;\n}\n\ninterface Props {\n storeOrderId: string;\n /** Order/checkout currency, used only for formatting the estimate. */\n currency: string;\n onChange: (selection: StoreShippingSelection) => void;\n}\n\ninterface AddressFormState {\n fullName: string;\n phone: string;\n addressLine1: string;\n addressLine2: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n}\n\ninterface AddressFormErrors {\n fullName?: string;\n addressLine1?: string;\n city?: string;\n postalCode?: string;\n country?: string;\n}\n\nconst EMPTY_FORM: AddressFormState = {\n fullName: '',\n phone: '',\n addressLine1: '',\n addressLine2: '',\n city: '',\n state: '',\n postalCode: '',\n country: 'IN',\n};\n\nfunction formatCost(amount: number, currency: string): string {\n try {\n return amount.toLocaleString('en', { style: 'currency', currency: currency || 'USD' });\n } catch {\n return `${currency || 'USD'} ${amount.toFixed(2)}`;\n }\n}\n\nfunction formatEta(minDays?: number | null, maxDays?: number | null): string | null {\n if (minDays == null && maxDays == null) return null;\n if (minDays != null && maxDays != null) {\n return minDays === maxDays ? `${minDays} days` : `${minDays}–${maxDays} days`;\n }\n const single = minDays ?? maxDays;\n return single != null ? `${single} days` : null;\n}\n\nexport const StoreShippingSection: FC<Props> = ({ storeOrderId, currency, onChange }) => {\n const {\n addresses,\n loading: addressesLoading,\n refetch: refetchAddresses,\n } = useMyShippingAddresses();\n const { createShippingAddress, loading: creatingAddress } = useCreateShippingAddress();\n const { methods, loading: methodsLoading } = useShippingMethods();\n const [runEstimate, { data: estData, loading: estimateLoading }] = useEstimateOrderShipping();\n\n const [selectedAddressId, setSelectedAddressId] = useState<string | null>(null);\n const [selectedMethodId, setSelectedMethodId] = useState<string | null>(null);\n\n const [showAddForm, setShowAddForm] = useState(false);\n const [form, setForm] = useState<AddressFormState>(EMPTY_FORM);\n const [formErrors, setFormErrors] = useState<AddressFormErrors>({});\n const [formServerError, setFormServerError] = useState<string | null>(null);\n\n // Keep onChange in a ref so the emit effect never depends on its identity.\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n\n const selectedAddress = useMemo<ShippingAddress | undefined>(\n () => addresses.find((a) => a.id === selectedAddressId),\n [addresses, selectedAddressId]\n );\n\n // Methods available for the selected address' destination country.\n // Empty availableCountries is treated as \"available everywhere\".\n const availableMethods = useMemo(() => {\n if (!selectedAddress) return [];\n const country = selectedAddress.country;\n return methods\n .filter(\n (m) =>\n m.isActive &&\n (m.availableCountries.length === 0 || m.availableCountries.includes(country)) &&\n !m.excludedCountries.includes(country)\n )\n .sort((a, b) => a.displayOrder - b.displayOrder);\n }, [methods, selectedAddress]);\n\n // Default the address selection to the user's default (or first) address.\n useEffect(() => {\n if (!selectedAddressId && addresses.length > 0) {\n const preferred = addresses.find((a) => a.isDefault) ?? addresses[0];\n setSelectedAddressId(preferred.id);\n }\n }, [addresses, selectedAddressId]);\n\n // Drop a selected method that is no longer valid for the chosen destination.\n useEffect(() => {\n if (selectedMethodId && !availableMethods.some((m) => m.id === selectedMethodId)) {\n setSelectedMethodId(null);\n }\n }, [availableMethods, selectedMethodId]);\n\n // Default the method selection when there's exactly one option — nothing to\n // actually choose between, so don't make the buyer click it.\n useEffect(() => {\n if (!selectedMethodId && availableMethods.length === 1) {\n setSelectedMethodId(availableMethods[0].id);\n }\n }, [availableMethods, selectedMethodId]);\n\n // Fetch a fresh estimate whenever address + method are both chosen.\n useEffect(() => {\n if (selectedAddress && selectedMethodId) {\n void runEstimate({\n variables: {\n input: {\n orderId: storeOrderId,\n shippingMethodId: selectedMethodId,\n destinationCountry: selectedAddress.country,\n destinationPostalCode: selectedAddress.postalCode,\n },\n },\n });\n }\n }, [\n selectedAddress?.id,\n selectedAddress?.country,\n selectedAddress?.postalCode,\n selectedMethodId,\n storeOrderId,\n runEstimate,\n selectedAddress,\n ]);\n\n const estimate = estData?.estimateOrderShipping;\n const estimateReady = Boolean(\n selectedAddressId &&\n selectedMethodId &&\n !estimateLoading &&\n estimate &&\n estimate.shippingMethodId === selectedMethodId\n );\n\n // Emit the current selection upward. Method id + cost are only surfaced once a\n // matching estimate has resolved, so the parent's proceed gate stays disabled\n // while an estimate is in flight (free shipping resolves with cost 0, which is\n // still \"ready\").\n useEffect(() => {\n onChangeRef.current({\n shippingAddressId: selectedAddressId,\n shippingMethodId: estimateReady ? selectedMethodId : null,\n shippingCost: estimateReady && estimate ? estimate.cost : 0,\n destinationCountry: selectedAddress?.country ?? null,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- emit derived selection; estimate object identity excluded intentionally\n }, [\n selectedAddressId,\n selectedMethodId,\n estimateReady,\n estimate?.cost,\n selectedAddress?.country,\n ]);\n\n const setField = (field: keyof AddressFormState, value: string) =>\n setForm((prev) => ({ ...prev, [field]: value }));\n\n const validateForm = (): boolean => {\n const e: AddressFormErrors = {};\n if (!form.fullName.trim()) e.fullName = 'Recipient name is required';\n if (!form.addressLine1.trim()) e.addressLine1 = 'Street address is required';\n if (!form.city.trim()) e.city = 'City is required';\n if (!form.postalCode.trim()) e.postalCode = 'Postal code is required';\n if (!form.country.trim()) e.country = 'Country is required';\n setFormErrors(e);\n return Object.keys(e).length === 0;\n };\n\n const handleCreateAddress = async () => {\n if (!validateForm()) return;\n setFormServerError(null);\n try {\n const created = await createShippingAddress({\n fullName: form.fullName.trim(),\n ...(form.phone.trim() ? { phone: form.phone.trim() } : {}),\n addressLine1: form.addressLine1.trim(),\n ...(form.addressLine2.trim() ? { addressLine2: form.addressLine2.trim() } : {}),\n city: form.city.trim(),\n ...(form.state.trim() ? { state: form.state.trim() } : {}),\n postalCode: form.postalCode.trim(),\n country: form.country,\n isDefault: addresses.length === 0,\n });\n if (!created) {\n setFormServerError('Failed to save address. Please try again.');\n return;\n }\n await refetchAddresses();\n setSelectedAddressId(created.id);\n setSelectedMethodId(null);\n setForm(EMPTY_FORM);\n setFormErrors({});\n setShowAddForm(false);\n } catch {\n setFormServerError('Failed to save address. Please try again.');\n }\n };\n\n const inputClass = (hasError: boolean) =>\n `w-full px-3 py-2 text-sm border rounded-input bg-bg-surface text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] ${\n hasError ? 'border-status-error-border' : 'border-border-subtle'\n }`;\n\n return (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6 space-y-5\">\n <div className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping\n </div>\n\n {/* Delivery address */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <MapPin className=\"size-4 text-text-secondary\" />\n Delivery address\n </div>\n {!showAddForm && (\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(true);\n setFormServerError(null);\n }}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline\"\n >\n <Plus className=\"size-3.5\" />\n Add address\n </button>\n )}\n </div>\n\n {addressesLoading && addresses.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading addresses…\n </div>\n ) : (\n <>\n {addresses.length === 0 && !showAddForm && (\n <p className=\"text-sm text-text-secondary\">\n No saved delivery addresses yet. Add one to continue.\n </p>\n )}\n {addresses.length > 0 && (\n <div className=\"space-y-2\">\n {addresses.map((addr) => {\n const selected = addr.id === selectedAddressId;\n return (\n <button\n key={addr.id}\n type=\"button\"\n onClick={() => {\n setSelectedAddressId(addr.id);\n setSelectedMethodId(null);\n }}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">\n {addr.fullName}\n {addr.label ? (\n <span className=\"ml-2 text-xs text-text-muted\">({addr.label})</span>\n ) : null}\n </p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {[\n addr.addressLine1,\n addr.addressLine2,\n addr.city,\n addr.state,\n addr.postalCode,\n addr.country,\n ]\n .filter(Boolean)\n .join(', ')}\n </p>\n {addr.phone && (\n <p className=\"text-text-muted text-xs mt-0.5\">{addr.phone}</p>\n )}\n </div>\n {selected && (\n <Check className=\"size-4 text-action-primary-bg shrink-0 mt-0.5\" />\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n\n {/* Inline add-address form */}\n {showAddForm && (\n <div className=\"rounded-input border border-border-subtle p-3 space-y-3 bg-bg-sunken\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">New delivery address</span>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false);\n setFormErrors({});\n setFormServerError(null);\n }}\n className=\"p-1 text-text-secondary hover:text-text-primary rounded-button\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n\n {formServerError && (\n <div className=\"p-2 rounded-lg bg-status-error-bg-subtle border border-status-error-border text-xs text-status-error-text\">\n {formServerError}\n </div>\n )}\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Recipient name</label>\n <input\n type=\"text\"\n value={form.fullName}\n onChange={(e) => setField('fullName', e.target.value)}\n placeholder=\"Jane Doe\"\n className={inputClass(Boolean(formErrors.fullName))}\n />\n {formErrors.fullName && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.fullName}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Phone <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"tel\"\n value={form.phone}\n onChange={(e) => setField('phone', e.target.value)}\n placeholder=\"+91 98765 43210\"\n className={inputClass(false)}\n />\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Country</label>\n <select\n value={form.country}\n onChange={(e) => setField('country', e.target.value)}\n className={inputClass(Boolean(formErrors.country))}\n >\n {COUNTRY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>\n {c.label}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Street address</label>\n <input\n type=\"text\"\n value={form.addressLine1}\n onChange={(e) => setField('addressLine1', e.target.value)}\n placeholder=\"123 Main St\"\n className={inputClass(Boolean(formErrors.addressLine1))}\n />\n {formErrors.addressLine1 && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.addressLine1}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Apartment, suite, etc. <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.addressLine2}\n onChange={(e) => setField('addressLine2', e.target.value)}\n placeholder=\"Apt 4B\"\n className={inputClass(false)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">City</label>\n <input\n type=\"text\"\n value={form.city}\n onChange={(e) => setField('city', e.target.value)}\n placeholder=\"Mumbai\"\n className={inputClass(Boolean(formErrors.city))}\n />\n {formErrors.city && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.city}</p>\n )}\n </div>\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n State <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.state}\n onChange={(e) => setField('state', e.target.value)}\n placeholder=\"Maharashtra\"\n className={inputClass(false)}\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Postal code</label>\n <input\n type=\"text\"\n value={form.postalCode}\n onChange={(e) => setField('postalCode', e.target.value)}\n placeholder=\"400001\"\n className={inputClass(Boolean(formErrors.postalCode))}\n />\n {formErrors.postalCode && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.postalCode}</p>\n )}\n </div>\n\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={handleCreateAddress}\n disabled={creatingAddress}\n className=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg hover:bg-action-primary-bgHover rounded-lg transition-colors disabled:opacity-50\"\n >\n {creatingAddress && <Loader2 className=\"size-4 animate-spin\" />}\n Save address\n </button>\n </div>\n </div>\n )}\n </section>\n\n {/* Shipping method */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping method\n </div>\n\n {!selectedAddress ? (\n <p className=\"text-sm text-text-secondary\">Select a delivery address to see options.</p>\n ) : methodsLoading && methods.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading options…\n </div>\n ) : availableMethods.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n No shipping methods available for {selectedAddress.country}. Try a different address.\n </p>\n ) : availableMethods.length === 1 ? (\n (() => {\n const method = availableMethods[0];\n const eta = formatEta(method.estimatedMinDays, method.estimatedMaxDays);\n const showEstimate = estimateReady && estimate;\n return (\n <div className=\"w-full p-3 rounded-input border border-action-primary-bg bg-bg-sunken\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">{method.name}</p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {method.carrier ? `${method.carrier} · ` : ''}\n {eta ?? 'Delivery time varies'}\n </p>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {estimateLoading ? (\n <Loader2 className=\"size-4 animate-spin text-text-secondary\" />\n ) : (\n <span className=\"text-sm font-semibold text-text-primary\">\n {showEstimate\n ? formatCost(estimate.cost, estimate.currency || currency)\n : formatCost(method.baseCost, method.currency || currency)}\n </span>\n )}\n <Check className=\"size-4 text-action-primary-bg\" />\n </div>\n </div>\n </div>\n );\n })()\n ) : (\n <div className=\"space-y-2\">\n {availableMethods.map((method) => {\n const selected = method.id === selectedMethodId;\n const eta = formatEta(method.estimatedMinDays, method.estimatedMaxDays);\n const showEstimate = selected && estimateReady && estimate;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedMethodId(method.id)}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">{method.name}</p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {method.carrier ? `${method.carrier} · ` : ''}\n {eta ?? 'Delivery time varies'}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n {selected && estimateLoading ? (\n <Loader2 className=\"size-4 animate-spin text-text-secondary\" />\n ) : (\n <span className=\"text-sm font-semibold text-text-primary\">\n {showEstimate\n ? formatCost(estimate.cost, estimate.currency || currency)\n : formatCost(method.baseCost, method.currency || currency)}\n </span>\n )}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n\n {estimateReady && estimate && (\n <p className=\"text-xs text-text-secondary\">\n Estimated shipping: {formatCost(estimate.cost, estimate.currency || currency)}\n {estimate.estimatedDeliveryDate\n ? ` · arrives around ${new Date(estimate.estimatedDeliveryDate).toLocaleDateString()}`\n : ''}\n </p>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { useCallback as o, useEffect as s, useMemo as c, useState as l } from "r
|
|
|
5
5
|
//#region src/billing/modules/checkout/hooks/useCheckout.ts
|
|
6
6
|
var te = 100;
|
|
7
7
|
function u(u = {}) {
|
|
8
|
-
let { currentUser: d } = e(), { defaultCurrency: f = "USD", defaultSaveCard: p = !1, upgradeFromSubscriptionId: m, downgradeFromSubscriptionId: h, defaultSubscriptionId: g } = u, [_, v] = l([]), [y, ne] = l(null), [b, re] = l("AUTO"), [x, S] = l(f), [C, w] = l(""), [T, E] = l(0), [ie, D] = l("PERCENTAGE"), [O, k] = l(!1), [A, j] = l(0), [M, N] = l("idle"), [ae, P] = l(null), [F, I] = l(0), [oe, L] = l(0), [se, R] = l("NONE"), [z, ce] = l(null), [B, le] = l(p), [V,
|
|
8
|
+
let { currentUser: d } = e(), { defaultCurrency: f = "USD", defaultSaveCard: p = !1, upgradeFromSubscriptionId: m, downgradeFromSubscriptionId: h, defaultSubscriptionId: g } = u, [_, v] = l([]), [y, ne] = l(null), [b, re] = l("AUTO"), [x, S] = l(f), [C, w] = l(""), [T, E] = l(0), [ie, D] = l("PERCENTAGE"), [O, k] = l(!1), [A, j] = l(0), [M, N] = l("idle"), [ae, P] = l(null), [F, I] = l(0), [oe, L] = l(0), [se, R] = l("NONE"), [z, ce] = l(null), [B, le] = l(p), [V, ue] = l(!1), [H, U] = l(null), [W, G] = l(g ?? null), [de] = r(), [fe] = n(), [pe] = i(), [K, { data: me, loading: he }] = t(), [ge] = a(), q = c(() => _[0]?.currency ?? "USD", [_]), J = c(() => _.reduce((e, t) => e + t.price * t.quantity, 0), [_]), Y = c(() => _.reduce((e, t) => e + (t.priceUSD ?? t.price) * t.quantity, 0), [_]), X = c(() => T ? Math.min(T, J) : 0, [J, T]), Z = c(() => {
|
|
9
9
|
let e = J - X;
|
|
10
10
|
return (O ? Math.max(0, e - A) : e) + F;
|
|
11
11
|
}, [
|
|
@@ -14,24 +14,25 @@ function u(u = {}) {
|
|
|
14
14
|
O,
|
|
15
15
|
A,
|
|
16
16
|
F
|
|
17
|
-
]), Q = y?.creditAmount ?? 0,
|
|
17
|
+
]), Q = y?.creditAmount ?? 0, _e = c(() => Q >= Y * te, [Q, Y]), ve = c(() => !_.some((e) => e.type === "CREDITS") && Q > 0, [_, Q]), ye = me?.convertCurrency?.amount ?? null, be = me?.convertCurrency?.exchangeRate ?? 1, xe = ye ?? Z, Se = M === "loading" || he, Ce = M === "processing";
|
|
18
18
|
s(() => {
|
|
19
|
-
if (b !== "CREDITS" && _.length !== 0 && !_.every((e) => e.currency === x || e.type === "CREDITS") && Z > 0 &&
|
|
19
|
+
if (b !== "CREDITS" && _.length !== 0 && !_.every((e) => e.currency === x || e.type === "CREDITS") && Z > 0 && q !== x) {
|
|
20
20
|
if (x === "INR" && F === 0 && J > 0) return;
|
|
21
|
-
|
|
21
|
+
K({ variables: {
|
|
22
22
|
amount: Z,
|
|
23
23
|
toCurrency: x,
|
|
24
|
-
fromCurrency:
|
|
24
|
+
fromCurrency: q
|
|
25
25
|
} });
|
|
26
26
|
}
|
|
27
27
|
}, [
|
|
28
28
|
Z,
|
|
29
29
|
x,
|
|
30
30
|
b,
|
|
31
|
-
|
|
31
|
+
K,
|
|
32
32
|
F,
|
|
33
33
|
J,
|
|
34
|
-
_
|
|
34
|
+
_,
|
|
35
|
+
q
|
|
35
36
|
]), s(() => {
|
|
36
37
|
if (!y || J <= 0) {
|
|
37
38
|
I(0), L(0), R("NONE");
|
|
@@ -54,7 +55,7 @@ function u(u = {}) {
|
|
|
54
55
|
x,
|
|
55
56
|
b
|
|
56
57
|
]);
|
|
57
|
-
let
|
|
58
|
+
let we = o((e) => {
|
|
58
59
|
v((t) => e.type === "PLAN" ? t.find((e) => e.type === "PLAN") ? t.map((t) => t.type === "PLAN" ? {
|
|
59
60
|
...e,
|
|
60
61
|
quantity: 1
|
|
@@ -67,7 +68,7 @@ function u(u = {}) {
|
|
|
67
68
|
} : t) : [...t, e]);
|
|
68
69
|
}, []), $ = o((e) => {
|
|
69
70
|
v((t) => t.filter((t) => t.id !== e));
|
|
70
|
-
}, []),
|
|
71
|
+
}, []), Te = o((e, t) => {
|
|
71
72
|
if (t <= 0) {
|
|
72
73
|
$(e);
|
|
73
74
|
return;
|
|
@@ -79,7 +80,7 @@ function u(u = {}) {
|
|
|
79
80
|
...n,
|
|
80
81
|
quantity: t
|
|
81
82
|
} : n));
|
|
82
|
-
}, [$]),
|
|
83
|
+
}, [$]), Ee = o((e, t, n) => {
|
|
83
84
|
v((r) => r.map((r) => {
|
|
84
85
|
if (r.id !== e) return r;
|
|
85
86
|
let i = { price: t };
|
|
@@ -88,22 +89,23 @@ function u(u = {}) {
|
|
|
88
89
|
...i
|
|
89
90
|
};
|
|
90
91
|
}));
|
|
91
|
-
}, []),
|
|
92
|
+
}, []), De = o(() => {
|
|
92
93
|
v([]);
|
|
93
|
-
}, []), De = o((e) => {
|
|
94
|
-
ne(e), k(!1), j(0);
|
|
95
94
|
}, []), Oe = o((e) => {
|
|
95
|
+
ne(e), k(!1), j(0);
|
|
96
|
+
}, []), ke = o((e) => {
|
|
96
97
|
S(e);
|
|
97
98
|
let t = _.every((t) => t.currency === e || t.type === "CREDITS");
|
|
98
|
-
Z > 0 &&
|
|
99
|
+
Z > 0 && q !== e && !t && K({ variables: {
|
|
99
100
|
amount: Z,
|
|
100
101
|
toCurrency: e,
|
|
101
|
-
fromCurrency:
|
|
102
|
+
fromCurrency: q
|
|
102
103
|
} });
|
|
103
104
|
}, [
|
|
104
105
|
Z,
|
|
105
|
-
|
|
106
|
-
_
|
|
106
|
+
K,
|
|
107
|
+
_,
|
|
108
|
+
q
|
|
107
109
|
]);
|
|
108
110
|
return {
|
|
109
111
|
items: _,
|
|
@@ -120,8 +122,8 @@ function u(u = {}) {
|
|
|
120
122
|
selectedPaymentMethodId: z,
|
|
121
123
|
saveCard: B,
|
|
122
124
|
autoRenew: V,
|
|
123
|
-
autoRenewPaymentMethodId:
|
|
124
|
-
selectedSubscriptionId:
|
|
125
|
+
autoRenewPaymentMethodId: H,
|
|
126
|
+
selectedSubscriptionId: W,
|
|
125
127
|
subtotal: J,
|
|
126
128
|
subtotalUSD: Y,
|
|
127
129
|
discountAmount: X,
|
|
@@ -129,25 +131,25 @@ function u(u = {}) {
|
|
|
129
131
|
taxRate: oe,
|
|
130
132
|
taxType: se,
|
|
131
133
|
total: Z,
|
|
132
|
-
totalInSelectedCurrency:
|
|
134
|
+
totalInSelectedCurrency: xe,
|
|
133
135
|
availableCredits: Q,
|
|
134
|
-
hasEnoughCredits:
|
|
135
|
-
canPayWithCredits:
|
|
136
|
-
isLoading:
|
|
137
|
-
isProcessing:
|
|
136
|
+
hasEnoughCredits: _e,
|
|
137
|
+
canPayWithCredits: ve,
|
|
138
|
+
isLoading: Se,
|
|
139
|
+
isProcessing: Ce,
|
|
138
140
|
isCalculatingTax: !1,
|
|
139
|
-
conversionRate:
|
|
140
|
-
convertedAmount:
|
|
141
|
-
addItem:
|
|
141
|
+
conversionRate: be,
|
|
142
|
+
convertedAmount: ye,
|
|
143
|
+
addItem: we,
|
|
142
144
|
removeItem: $,
|
|
143
|
-
updateItemQuantity:
|
|
144
|
-
updateItemPrice:
|
|
145
|
-
clearItems:
|
|
146
|
-
setBillingAccount:
|
|
145
|
+
updateItemQuantity: Te,
|
|
146
|
+
updateItemPrice: Ee,
|
|
147
|
+
clearItems: De,
|
|
148
|
+
setBillingAccount: Oe,
|
|
147
149
|
setPaymentProvider: o((e) => {
|
|
148
150
|
re(e), e === "RAZORPAY" && x !== "INR" && S("INR");
|
|
149
151
|
}, [x]),
|
|
150
|
-
setCurrency:
|
|
152
|
+
setCurrency: ke,
|
|
151
153
|
setPromoCode: w,
|
|
152
154
|
validatePromoCode: o(async () => {
|
|
153
155
|
if (!C.trim()) return {
|
|
@@ -159,7 +161,7 @@ function u(u = {}) {
|
|
|
159
161
|
};
|
|
160
162
|
try {
|
|
161
163
|
N("loading");
|
|
162
|
-
let { data: e, error: t } = await
|
|
164
|
+
let { data: e, error: t } = await ge({ variables: { input: {
|
|
163
165
|
code: C.trim().toUpperCase(),
|
|
164
166
|
userId: d?.id ?? "",
|
|
165
167
|
userEmail: d?.email,
|
|
@@ -211,7 +213,7 @@ function u(u = {}) {
|
|
|
211
213
|
C,
|
|
212
214
|
x,
|
|
213
215
|
J,
|
|
214
|
-
|
|
216
|
+
ge
|
|
215
217
|
]),
|
|
216
218
|
clearPromoCode: o(() => {
|
|
217
219
|
w(""), E(0), D("PERCENTAGE");
|
|
@@ -227,9 +229,9 @@ function u(u = {}) {
|
|
|
227
229
|
]),
|
|
228
230
|
setSelectedPaymentMethodId: ce,
|
|
229
231
|
setSaveCard: le,
|
|
230
|
-
setAutoRenew:
|
|
231
|
-
setAutoRenewPaymentMethodId:
|
|
232
|
-
setSelectedSubscriptionId:
|
|
232
|
+
setAutoRenew: ue,
|
|
233
|
+
setAutoRenewPaymentMethodId: U,
|
|
234
|
+
setSelectedSubscriptionId: G,
|
|
233
235
|
initiatePayment: o(async (e) => {
|
|
234
236
|
let t = e?.shippingOverride;
|
|
235
237
|
if (!y) return {
|
|
@@ -291,7 +293,7 @@ function u(u = {}) {
|
|
|
291
293
|
productId: e.metadata?.productId ?? void 0,
|
|
292
294
|
variantId: e.metadata?.variantId ?? void 0
|
|
293
295
|
}
|
|
294
|
-
})), { data: c } = await
|
|
296
|
+
})), { data: c } = await fe({ variables: { input: {
|
|
295
297
|
externalOrderId: r,
|
|
296
298
|
externalService: "STORE",
|
|
297
299
|
currency: x,
|
|
@@ -321,7 +323,7 @@ function u(u = {}) {
|
|
|
321
323
|
}
|
|
322
324
|
}
|
|
323
325
|
if (o === "CREDITS") {
|
|
324
|
-
let e = _.filter((e) => e.type === "ADDON"), t = _.find((e) => e.type === "PLAN"), { data: n } = await
|
|
326
|
+
let e = _.filter((e) => e.type === "ADDON"), t = _.find((e) => e.type === "PLAN"), { data: n } = await pe({ variables: { input: {
|
|
325
327
|
billingAccountId: y.id,
|
|
326
328
|
planId: t ? t.metadata?.planId || t.id : void 0,
|
|
327
329
|
addOnIds: e.length > 0 ? e.map((e) => ({
|
|
@@ -331,7 +333,7 @@ function u(u = {}) {
|
|
|
331
333
|
isAnnual: t?.metadata?.duration === "yearly",
|
|
332
334
|
upgradeFromSubscriptionId: m || void 0,
|
|
333
335
|
downgradeFromSubscriptionId: h || void 0,
|
|
334
|
-
subscriptionId: e.length > 0 ?
|
|
336
|
+
subscriptionId: e.length > 0 ? W : void 0,
|
|
335
337
|
seatCount: t?.metadata?.seatCount
|
|
336
338
|
} } }), r = n?.spendCredits;
|
|
337
339
|
return r?.creditTransactionID ? (N("success"), {
|
|
@@ -358,7 +360,7 @@ function u(u = {}) {
|
|
|
358
360
|
error: "Failed to process credit payment"
|
|
359
361
|
});
|
|
360
362
|
}
|
|
361
|
-
let s = _.filter((e) => e.type === "ADDON"), c = s.length > 0 ? s.map((e) => e.metadata?.addonId || e.id) : void 0, l = s.length > 0 ? s.map((e) => e.quantity) : void 0, te = _.find((e) => e.type === "PLAN")?.metadata?.duration === "yearly", u = n === "PLAN" && V && (
|
|
363
|
+
let s = _.filter((e) => e.type === "ADDON"), c = s.length > 0 ? s.map((e) => e.metadata?.addonId || e.id) : void 0, l = s.length > 0 ? s.map((e) => e.quantity) : void 0, te = _.find((e) => e.type === "PLAN")?.metadata?.duration === "yearly", u = n === "PLAN" && V && (H || z) || void 0, { data: d } = await de({ variables: { input: {
|
|
362
364
|
billingAccountId: y.id,
|
|
363
365
|
amount: a,
|
|
364
366
|
currency: x,
|
|
@@ -371,7 +373,7 @@ function u(u = {}) {
|
|
|
371
373
|
quantity: n === "ADDON" && s.length === 1 && !i ? s[0].quantity : void 0,
|
|
372
374
|
addonIds: n === "ADDON" && s.length > 1 && !i ? c : void 0,
|
|
373
375
|
quantities: n === "ADDON" && s.length > 1 && !i ? l : void 0,
|
|
374
|
-
subscriptionId: n === "ADDON" && !i ?
|
|
376
|
+
subscriptionId: n === "ADDON" && !i ? W : void 0,
|
|
375
377
|
paymentMethodId: z || void 0,
|
|
376
378
|
saveCard: z ? void 0 : B || V,
|
|
377
379
|
upgradeFromSubscriptionId: m || void 0,
|
|
@@ -419,16 +421,16 @@ function u(u = {}) {
|
|
|
419
421
|
z,
|
|
420
422
|
B,
|
|
421
423
|
V,
|
|
422
|
-
|
|
423
|
-
|
|
424
|
+
H,
|
|
425
|
+
W,
|
|
424
426
|
m,
|
|
425
427
|
h,
|
|
426
|
-
ue,
|
|
427
428
|
de,
|
|
428
|
-
fe
|
|
429
|
+
fe,
|
|
430
|
+
pe
|
|
429
431
|
]),
|
|
430
432
|
reset: o(() => {
|
|
431
|
-
v([]), ne(null), re("AUTO"), S(f), w(""), E(0), D("PERCENTAGE"), k(!1), j(0), N("idle"), P(null), I(0), L(0), R("NONE"), ce(null), le(p),
|
|
433
|
+
v([]), ne(null), re("AUTO"), S(f), w(""), E(0), D("PERCENTAGE"), k(!1), j(0), N("idle"), P(null), I(0), L(0), R("NONE"), ce(null), le(p), ue(!1), U(null), G(g ?? null);
|
|
432
434
|
}, [
|
|
433
435
|
f,
|
|
434
436
|
p,
|