@lockerverse/react 0.2.190-dev.1 → 0.2.191

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.
@@ -1 +1 @@
1
- {"version":3,"file":"auction-payment-view.js","names":["formatMoney"],"sources":["../src/auction-checkout-view.tsx","../src/auction-checkout.tsx","../src/auction-payment-view.tsx"],"sourcesContent":["import type {\n LockerverseAuctionItem,\n LockerverseAuctionPricing,\n} from \"@lockerverse/sdk/auctions\";\nimport { AddressElement, PaymentElement } from \"@stripe/react-stripe-js\";\nimport type {\n StripeAddressElementChangeEvent,\n StripePaymentElementOptions,\n} from \"@stripe/stripe-js\";\nimport { ArrowRight, ChevronLeft } from \"lucide-react\";\nimport type { FormEventHandler } from \"react\";\nimport { formatAuctionMoney as formatMoney } from \"./auction-display.ts\";\nimport { Checkbox, EmailField, FormField } from \"./form-field.tsx\";\nimport type { PhoneInputValue } from \"./phone-field.tsx\";\nimport { PhoneInput } from \"./phone-field.tsx\";\n\ntype AuctionCheckoutViewProps = {\n buttonText: string;\n communityName: string;\n email: string;\n contactErrors: { email?: string; phone?: string };\n phoneCountry: string;\n id: string;\n includeServiceFee: boolean;\n isPurchase: boolean;\n isTerminal: boolean;\n item: LockerverseAuctionItem;\n locked: boolean;\n message: string | null;\n onBack?: (() => void) | undefined;\n onBillingChange: (event: StripeAddressElementChangeEvent) => void;\n onEmailChange: (value: string) => void;\n onIncludeServiceFeeChange?: ((value: boolean) => void) | undefined;\n onPaymentLoadError: () => void;\n onPhoneChange: (value: PhoneInputValue) => void;\n onSameAsBillingChange: (value: boolean) => void;\n onShippingChange: (event: StripeAddressElementChangeEvent) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n phone: string;\n pricing: LockerverseAuctionPricing;\n quantity: number;\n sameAsBilling: boolean;\n serviceFeeCents: number;\n serviceFeeEnabled: boolean;\n showFields: boolean;\n submitDisabled: boolean;\n};\n\nfunction getPaymentOptions(isPurchase: boolean): StripePaymentElementOptions {\n return {\n business: { name: \"Lockerverse\" },\n fields: {\n billingDetails: {\n address: \"never\",\n email: \"never\",\n name: \"never\",\n phone: \"never\",\n },\n },\n terms: {\n applePay: isPurchase ? \"auto\" : \"never\",\n auBecsDebit: \"never\",\n bancontact: \"never\",\n card: \"always\",\n cashapp: \"never\",\n googlePay: \"never\",\n ideal: \"never\",\n paypal: isPurchase ? \"auto\" : \"never\",\n sepaDebit: \"never\",\n sofort: \"never\",\n usBankAccount: \"never\",\n },\n wallets: { applePay: isPurchase ? \"auto\" : \"never\", googlePay: \"never\" },\n };\n}\n\nexport function AuctionCheckoutView(props: AuctionCheckoutViewProps) {\n const { isPurchase, item, pricing, id } = props;\n return (\n <form\n className=\"lockerverse-auctions__checkout\"\n noValidate\n onSubmit={props.onSubmit}\n >\n <div className=\"lockerverse-auctions__checkout-header\">\n <div className=\"lockerverse-auctions__checkout-navigation\">\n <button\n aria-label=\"Back\"\n className=\"lockerverse-auctions__checkout-back\"\n disabled={!props.onBack}\n onClick={props.onBack}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={20} />\n </button>\n <div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Step 2 of 2\n </p>\n <p>{isPurchase ? \"Secure checkout\" : \"Secure payment method\"}</p>\n </div>\n </div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n {props.communityName}\n </p>\n <h2>\n {isPurchase\n ? \"Finalize your purchase.\"\n : \"Finalize your bid authorization.\"}\n </h2>\n <p className=\"lockerverse-auctions__checkout-summary\">\n {isPurchase ? (\n <>\n Pay <strong>{formatMoney(pricing.totalCents)}</strong> for{\" \"}\n {props.quantity} {props.quantity === 1 ? \"item\" : \"items\"} of{\" \"}\n <strong>{item.name}</strong>. Your card is charged immediately\n once checkout succeeds.\n </>\n ) : (\n <>\n Authorize a payment method for your bid of{\" \"}\n <strong>{formatMoney(pricing.subtotalCents)}</strong> on{\" \"}\n <strong>{item.name}</strong>. Your card is only charged if this\n bid wins the item.\n </>\n )}\n </p>\n {item.collectShippingAddress && (\n <div className=\"lockerverse-auctions__checkout-physical\">\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Physical item\n </p>\n <p>\n This item requires a delivery address. Billing details are used by\n default, and you can switch to a separate delivery address below\n if needed.\n </p>\n </div>\n )}\n </div>\n <div className=\"lockerverse-auctions__checkout-body\">\n {props.showFields && (\n <fieldset disabled={props.locked}>\n <div className=\"lockerverse-auctions__checkout-contact\">\n <EmailField\n error={props.contactErrors.email}\n id={`${id}-email`}\n label=\"Email\"\n name=\"email\"\n onChange={(event) => props.onEmailChange(event.target.value)}\n required\n value={props.email}\n />\n <FormField\n error={props.contactErrors.phone}\n id={`${id}-phone`}\n label=\"Phone\"\n >\n <PhoneInput\n country={props.phoneCountry}\n error={props.contactErrors.phone}\n errorId={`${id}-phone-error`}\n id={`${id}-phone`}\n name=\"phone\"\n onChange={props.onPhoneChange}\n required\n value={props.phone}\n />\n </FormField>\n </div>\n <section\n aria-label=\"Payment Information\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <div className=\"lockerverse-auctions__checkout-section-heading\">\n <h3>Payment Information</h3>\n <p>\n {isPurchase\n ? \"Processed securely and charged immediately for this purchase.\"\n : \"Stored securely and charged only if your bid finishes on top.\"}\n </p>\n </div>\n <PaymentElement\n onLoadError={props.onPaymentLoadError}\n options={getPaymentOptions(isPurchase)}\n />\n </section>\n <section\n aria-label=\"Billing Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <h3>Billing Details</h3>\n <AddressElement\n onChange={props.onBillingChange}\n options={{ mode: \"billing\" }}\n />\n <p>\n {isPurchase\n ? \"Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.\"\n : \"Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.\"}\n </p>\n </section>\n {item.collectShippingAddress && (\n <section\n aria-label=\"Delivery Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <label\n className=\"lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery\"\n htmlFor={`${id}-delivery-same-as-billing`}\n >\n <Checkbox\n checked={props.sameAsBilling}\n id={`${id}-delivery-same-as-billing`}\n onChange={(event) =>\n props.onSameAsBillingChange(event.target.checked)\n }\n />\n <span>\n <strong>Delivery address is the same as billing</strong>\n <span>\n Leave this on for the fastest flow. Turn it off only if\n the delivery address should differ from the billing\n details above.\n </span>\n </span>\n </label>\n {!props.sameAsBilling && (\n <>\n <h3>Delivery Address</h3>\n <AddressElement\n onChange={props.onShippingChange}\n options={{ mode: \"shipping\" }}\n />\n </>\n )}\n </section>\n )}\n {props.serviceFeeEnabled && <CheckoutServiceFee {...props} />}\n </fieldset>\n )}\n {props.message && (\n <p\n aria-live=\"polite\"\n className=\"lockerverse-auctions__notice\"\n role=\"status\"\n >\n {props.message}\n </p>\n )}\n {!props.isTerminal && (\n <div className=\"lockerverse-auctions__checkout-footer\">\n <p>\n {isPurchase\n ? \"By continuing, you agree to be charged for this purchase.\"\n : \"By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.\"}\n {item.collectShippingAddress\n ? ` Your delivery details are stored with the ${isPurchase ? \"order\" : \"bid\"} so the seller can fulfill the item after payment.`\n : \"\"}\n </p>\n <button\n className=\"lockerverse-auctions__button lockerverse-auctions__checkout-submit\"\n disabled={props.submitDisabled}\n type=\"submit\"\n >\n {props.buttonText}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n )}\n </div>\n </form>\n );\n}\n\nfunction CheckoutServiceFee(props: AuctionCheckoutViewProps) {\n const { isPurchase, pricing } = props;\n return (\n <section\n aria-label=\"Processing fees\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n {props.onIncludeServiceFeeChange ? (\n <label\n className=\"lockerverse-auctions__checkout-checkbox\"\n htmlFor={`${props.id}-service-fee`}\n >\n <Checkbox\n checked={props.includeServiceFee}\n id={`${props.id}-service-fee`}\n onChange={(event) =>\n props.onIncludeServiceFeeChange?.(event.target.checked)\n }\n />\n <span>\n <strong>\n {isPurchase ? \"Add\" : \"If I win, add\"}{\" \"}\n {formatMoney(props.serviceFeeCents)} to help cover processing fees\n </strong>\n <span>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </span>\n </span>\n </label>\n ) : (\n <p>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </p>\n )}\n </section>\n );\n}\n","// biome-ignore-all lint/suspicious/noUnnecessaryConditions: React refs change in effect cleanup and event handlers outside this static control flow.\nimport {\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionPurchaseResult,\n LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport type { StripeAddressElementChangeEvent } from \"@stripe/stripe-js\";\nimport { type FormEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { AuctionCheckoutView } from \"./auction-checkout-view.tsx\";\nimport type {\n LockerverseAuctionItemProps,\n LockerverseAuctionPurchaseRecovery,\n} from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n auctionExpectedPricing,\n completeAuctionAction,\n createAuctionConfirmationToken,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n hasAuctionCheckoutChanged,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { type ContactErrors, validateContact } from \"./payment-validation.ts\";\nimport { getInternationalPhone, resolvePhoneCountry } from \"./phone.ts\";\n\ntype AuctionCheckoutProps = LockerverseAuctionItemProps & {\n item: LockerverseAuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact?: { email: string; phone: string };\n onContactChange?: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange?: (value: boolean) => void;\n onInteractionLockChange?: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\ntype CheckoutState =\n | \"ready\"\n | \"busy\"\n | \"pending\"\n | \"retry\"\n | \"complete\"\n | \"uncertain\";\n\nfunction getSubmitLabel(\n state: CheckoutState,\n hasRecovery: boolean,\n isPurchase: boolean\n) {\n if (state === \"busy\") {\n return isPurchase ? \"Processing...\" : \"Authorizing...\";\n }\n if (state === \"retry\") {\n return \"Retry original purchase\";\n }\n if (hasRecovery) {\n return \"Check purchase status\";\n }\n return isPurchase ? \"Buy Now\" : \"Authorize Bid\";\n}\n\nexport function AuctionCheckout(props: AuctionCheckoutProps) {\n const { auction, item, selection, client, onReview, onBack } = props;\n const stripe = useStripe();\n const elements = useElements();\n const id = useId();\n const [email, setEmail] = useState(props.contact?.email ?? \"\");\n const [phone, setPhone] = useState(props.contact?.phone ?? \"\");\n const [phoneCountry, setPhoneCountry] = useState<string>(() =>\n resolvePhoneCountry(props.contact?.phone ?? \"\")\n );\n const [contactErrors, setContactErrors] = useState<ContactErrors>({});\n const [sameAsBilling, setSameAsBilling] = useState(true);\n const [billing, setBilling] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [shipping, setShipping] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [recovery, setRecovery] = useState(props.resumePurchase ?? null);\n const [state, setState] = useState<CheckoutState>(\n props.resumePurchase ? \"pending\" : \"ready\"\n );\n const [message, setMessage] = useState<string | null>(null);\n const purchaseRequestId = useRef<string | null>(\n props.resumePurchase?.submission.clientRequestId ?? null\n );\n const isTerminal = state === \"complete\" || state === \"uncertain\";\n const busy = useRef<boolean>(false);\n const mounted = useRef<boolean>(true);\n const callbacks = useRef(props);\n callbacks.current = props;\n const outcomeReported = useRef(false);\n\n function transition(next: CheckoutState) {\n if (mounted.current) {\n setState(next);\n }\n notifyHostCallback(\n callbacks.current.onInteractionLockChange,\n next !== \"ready\" && next !== \"complete\"\n );\n }\n function showMessage(value: string | null) {\n if (mounted.current) {\n setMessage(value);\n }\n }\n function reportUncertain(kind: \"bid\" | \"purchase\") {\n transition(kind === \"bid\" ? \"uncertain\" : \"pending\");\n showMessage(\n kind === \"bid\"\n ? \"We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.\"\n : \"We could not confirm the purchase result. Check its status using the same purchase request.\"\n );\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onUncertain, kind);\n }\n }\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const isPurchase =\n Boolean(recovery ?? props.resumePurchase) || item.saleMode === \"buy_now\";\n const pricing =\n recovery?.pricing ??\n props.resumePurchase?.pricing ??\n getAuctionSelectionPricing(auction, item, selection);\n\n const payment =\n recovery?.payment ?? props.resumePurchase?.payment ?? auction.payment;\n\n function rememberPurchase(value: LockerverseAuctionPurchaseRecovery | null) {\n if (mounted.current) {\n setRecovery(value);\n }\n notifyHostCallback(callbacks.current.onPurchaseRecoveryChange, value);\n }\n\n function finishPurchase(result: LockerverseAuctionPurchaseResult) {\n if (result.status === \"paid\") {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n kind: \"purchase\",\n purchaseId: result.purchaseId,\n quantity: result.quantity,\n serviceFeeCents: result.serviceFeeCents,\n status: \"paid\",\n subtotalCents: result.subtotalCents,\n totalCents: result.totalCents,\n unitAmountCents: result.subtotalCents / result.quantity,\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onPurchaseComplete, result);\n }\n } else if (result.status === \"pending_payment\") {\n transition(\"pending\");\n showMessage(\n \"Your purchase is pending. Check its status before making another payment.\"\n );\n } else {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `This purchase is ${result.status.replaceAll(\"_\", \" \")}. You can start a new purchase.`\n );\n }\n }\n\n function readContact() {\n const phoneNumber = getInternationalPhone(phone, phoneCountry);\n const contact = validateContact({ email, phone: phoneNumber }, true);\n setContactErrors(contact.errors);\n if (!contact.value) {\n document\n .getElementById(`${id}-${contact.errors.email ? \"email\" : \"phone\"}`)\n ?.focus();\n return null;\n }\n return { email: contact.value.email, phone: phoneNumber };\n }\n\n async function prepareSubmission(\n contact: { email: string; phone: string } | null\n ) {\n if (!contact) {\n throw new Error(\"Check the contact fields below.\");\n }\n if (!(stripe && elements && auction.payment)) {\n throw new Error(\"Payment details are still loading.\");\n }\n const current = await client.load(auction.slug);\n if (!mounted.current) {\n return null;\n }\n const currentItem = current.items.find(\n (candidate) => candidate.id === item.id\n );\n if (!currentItem) {\n onReview(current, \"This item is no longer available.\");\n return null;\n }\n const selectionError = getAuctionSelectionError(\n current,\n currentItem,\n selection\n );\n if (\n selectionError ||\n hasAuctionCheckoutChanged(auction, current, item, currentItem, selection)\n ) {\n onReview(\n current,\n selectionError ??\n \"The checkout details changed. Review them before continuing.\"\n );\n return null;\n }\n const confirmationToken = await createAuctionConfirmationToken({\n billing,\n collectShippingAddress: item.collectShippingAddress,\n elements,\n email: contact.email,\n phone: contact.phone,\n shipping: sameAsBilling ? billing : shipping,\n stripe,\n });\n if (!mounted.current) {\n return null;\n }\n return {\n confirmationToken,\n email: contact.email,\n includeServiceFee: selection.includeServiceFee,\n phone: contact.phone,\n ...auctionExpectedPricing(pricing),\n };\n }\n\n async function sendBid(\n submission: NonNullable<Awaited<ReturnType<typeof prepareSubmission>>>\n ) {\n const result = await client.createBid(auction.slug, item.id, {\n ...submission,\n amount: selection.amount,\n });\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"bid\");\n return;\n }\n await completeAuctionAction(stripe, result);\n }\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n amountCents: result.subtotalCents,\n kind: \"bid\",\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onBidSubmitted, result);\n }\n }\n\n async function resolvePurchase(\n result: LockerverseAuctionPurchaseResult,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"purchase\");\n return;\n }\n await completeAuctionAction(stripe, result);\n const updated = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (updated) {\n finishPurchase(updated);\n } else {\n transition(\"pending\");\n showMessage(\n \"Payment status is not available yet. Check again shortly.\"\n );\n }\n return;\n }\n finishPurchase(result);\n if (!mounted.current && result.status === \"pending_payment\") {\n reportUncertain(\"purchase\");\n }\n }\n\n async function checkPurchase(active: LockerverseAuctionPurchaseRecovery) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n } else {\n if (!mounted.current) {\n reportUncertain(\"purchase\");\n return;\n }\n transition(\"retry\");\n showMessage(\n \"No purchase is recorded yet. You can retry the original purchase with the same request ID.\"\n );\n }\n }\n\n async function clearRejectedPurchase(\n error: LockerverseSdkError,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n return;\n }\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `The purchase was rejected. Review the item and payment details before trying again. (${error.status ?? \"validation\"})`\n );\n }\n\n async function handleFailure<Failure>(\n error: Failure,\n requestSent: boolean,\n active: LockerverseAuctionPurchaseRecovery | null,\n wasRecovery: boolean\n ) {\n const uncertain =\n requestSent &&\n (!(error instanceof LockerverseSdkError) || error.recoveryRecommended);\n showMessage(\n error instanceof Error\n ? error.message\n : \"Unable to complete this request.\"\n );\n if (isPurchase && active) {\n if (\n !wasRecovery &&\n error instanceof LockerverseSdkError &&\n !error.recoveryRecommended\n ) {\n try {\n await clearRejectedPurchase(error, active);\n return;\n } catch {\n /* Keep the original request when status cannot be established. */\n }\n }\n reportUncertain(\"purchase\");\n } else if (uncertain) {\n reportUncertain(\"bid\");\n } else {\n transition(\"ready\");\n }\n }\n\n function getPurchaseRequestId() {\n purchaseRequestId.current ??= globalThis.crypto.randomUUID();\n return purchaseRequestId.current;\n }\n\n function canSendPurchase() {\n if (mounted.current) {\n return true;\n }\n if (!recovery) {\n rememberPurchase(null);\n transition(\"ready\");\n }\n return false;\n }\n\n async function sendOrCheckPurchase(\n active: LockerverseAuctionPurchaseRecovery,\n statusOnly: boolean\n ) {\n if (statusOnly) {\n await checkPurchase(active);\n return;\n }\n if (!canSendPurchase()) {\n return;\n }\n const result = await client.createPurchase(\n auction.slug,\n item.id,\n active.submission\n );\n await resolvePurchase(result, active);\n }\n\n const checkoutPayment = stripe && elements && payment;\n\n function startSubmission() {\n if (busy.current || isTerminal) {\n return null;\n }\n if (!checkoutPayment) {\n showMessage(\"Payment details are still loading.\");\n return null;\n }\n const contact = recovery ? null : readContact();\n if (!(recovery || contact)) {\n return null;\n }\n return { checkoutPayment, contact, retryOriginal: state === \"retry\" };\n }\n\n async function submit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n const start = startSubmission();\n if (!start) {\n return;\n }\n const { contact, checkoutPayment: readyPayment, retryOriginal } = start;\n busy.current = true;\n outcomeReported.current = false;\n transition(\"busy\");\n showMessage(null);\n let requestSent = false;\n let activeRecovery = recovery;\n try {\n if (!activeRecovery) {\n const submission = await prepareSubmission(contact);\n if (!(submission && mounted.current)) {\n transition(\"ready\");\n return;\n }\n if (!isPurchase) {\n requestSent = true;\n await sendBid(submission);\n return;\n }\n activeRecovery = Object.freeze({\n auctionId: auction.id,\n item,\n itemId: item.id,\n payment: Object.freeze({ ...readyPayment }),\n pricing,\n submission: Object.freeze({\n ...submission,\n clientRequestId: getPurchaseRequestId(),\n paymentMethodTypes: Object.freeze([\"card\"] as const),\n quantity: selection.quantity,\n }),\n });\n rememberPurchase(activeRecovery);\n }\n requestSent = true;\n await sendOrCheckPurchase(\n activeRecovery,\n Boolean(recovery) && !retryOriginal\n );\n } catch (error) {\n await handleFailure(\n error,\n requestSent,\n activeRecovery,\n recovery !== null && !retryOriginal\n );\n } finally {\n busy.current = false;\n }\n }\n\n const buttonText = getSubmitLabel(state, recovery !== null, isPurchase);\n\n const locked = state !== \"ready\";\n return (\n <AuctionCheckoutView\n buttonText={buttonText}\n communityName={props.communityName ?? auction.name}\n contactErrors={contactErrors}\n email={email}\n id={id}\n includeServiceFee={selection.includeServiceFee}\n isPurchase={isPurchase}\n isTerminal={isTerminal}\n item={item}\n locked={locked}\n message={message}\n onBack={state === \"ready\" ? onBack : undefined}\n onBillingChange={setBilling}\n onEmailChange={(value) => {\n setEmail(value);\n props.onContactChange?.({\n email: value,\n phone: getInternationalPhone(phone, phoneCountry),\n });\n }}\n onIncludeServiceFeeChange={props.onIncludeServiceFeeChange}\n onPaymentLoadError={() => showMessage(\"Unable to load payment form.\")}\n onPhoneChange={({ value, country }) => {\n setPhone(value);\n setPhoneCountry(country);\n props.onContactChange?.({\n email,\n phone: getInternationalPhone(value, country),\n });\n }}\n onSameAsBillingChange={setSameAsBilling}\n onShippingChange={setShipping}\n onSubmit={submit}\n phone={phone}\n phoneCountry={phoneCountry}\n pricing={pricing}\n quantity={selection.quantity}\n sameAsBilling={sameAsBilling}\n serviceFeeCents={\n recovery\n ? pricing.serviceFeeCents\n : getAuctionSelectionPricing(auction, item, {\n ...selection,\n includeServiceFee: auction.serviceFeeEnabled,\n }).serviceFeeCents\n }\n serviceFeeEnabled={auction.serviceFeeEnabled}\n showFields={!(recovery || isTerminal)}\n submitDisabled={state === \"busy\" || !stripe || !elements}\n />\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport type {\n StripeElementsOptions,\n StripeElementsOptionsMode,\n} from \"@stripe/stripe-js\";\nimport { type RefObject, useEffect, useState } from \"react\";\nimport { AuctionCheckout } from \"./auction-checkout.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { useStripeAppearance } from \"./stripe-appearance.ts\";\nimport { defaultLockerverseStripeLoader } from \"./stripe-loader.ts\";\n\nexport type AuctionPaymentProps = LockerverseAuctionItemProps & {\n appearanceRoot: RefObject<HTMLElement | null>;\n interactionLocked: boolean;\n item: AuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact: { email: string; phone: string };\n onContactChange: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange: (value: boolean) => void;\n onInteractionLockChange: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\nexport function AuctionPayment(props: AuctionPaymentProps) {\n const {\n auction,\n item,\n selection,\n theme = \"dark\",\n stripeLoader = defaultLockerverseStripeLoader,\n style,\n onBack,\n resumePurchase,\n } = props;\n const [stripe, setStripe] =\n useState<Awaited<ReturnType<typeof defaultLockerverseStripeLoader>>>(null);\n const [failed, setFailed] = useState(false);\n const [revision, setRevision] = useState(0);\n const appearance = useStripeAppearance(\n props.appearanceRoot,\n theme,\n style,\n props.interactionLocked\n );\n const payment = resumePurchase?.payment ?? auction.payment;\n useEffect(() => {\n let active = true;\n if (!payment) {\n setFailed(true);\n return;\n }\n Promise.resolve()\n .then(() =>\n stripeLoader(\n payment.publishableKey,\n payment.connectedAccountId\n ? { stripeAccount: payment.connectedAccountId }\n : undefined\n )\n )\n .then(\n (loaded) => {\n if (active) {\n setStripe(loaded);\n setFailed(!loaded);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, [payment, stripeLoader, revision]);\n if (failed) {\n return (\n <div>\n <p role=\"alert\">Payment details could not load.</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n <button\n onClick={() => {\n setFailed(false);\n setStripe(null);\n setRevision((value) => value + 1);\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n );\n }\n if (!(stripe && appearance)) {\n return (\n <div>\n <p role=\"status\">Loading secure payment details…</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n </div>\n );\n }\n let paymentOptions: StripeElementsOptionsMode = {\n mode: \"setup\",\n setupFutureUsage: \"off_session\",\n };\n if (resumePurchase) {\n paymentOptions = {\n amount: resumePurchase.pricing.totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n } else if (item.saleMode === \"buy_now\") {\n paymentOptions = {\n amount: getAuctionSelectionPricing(auction, item, selection).totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n }\n const options: StripeElementsOptions = {\n ...paymentOptions,\n appearance,\n currency: \"usd\",\n paymentMethodTypes: [\"card\"],\n syncAddressCheckbox: \"none\",\n };\n return (\n <Elements options={options} stripe={stripe}>\n <AuctionCheckout {...props} />\n </Elements>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auction-payment-view.js","names":["formatMoney"],"sources":["../src/auction-checkout-view.tsx","../src/auction-checkout.tsx","../src/auction-payment-view.tsx"],"sourcesContent":["import type {\n LockerverseAuctionItem,\n LockerverseAuctionPricing,\n} from \"@lockerverse/sdk/auctions\";\nimport { AddressElement, PaymentElement } from \"@stripe/react-stripe-js\";\nimport type {\n StripeAddressElementChangeEvent,\n StripePaymentElementOptions,\n} from \"@stripe/stripe-js\";\nimport { ArrowRight, ChevronLeft } from \"lucide-react\";\nimport type { FormEventHandler } from \"react\";\nimport { formatAuctionMoney as formatMoney } from \"./auction-display.ts\";\nimport { Checkbox, EmailField, FormField } from \"./form-field.tsx\";\nimport type { PhoneInputValue } from \"./phone-field.tsx\";\nimport { PhoneInput } from \"./phone-field.tsx\";\n\ntype AuctionCheckoutViewProps = {\n buttonText: string;\n communityName: string;\n email: string;\n contactErrors: { email?: string; phone?: string };\n phoneCountry: string;\n id: string;\n includeServiceFee: boolean;\n isPurchase: boolean;\n isTerminal: boolean;\n item: LockerverseAuctionItem;\n locked: boolean;\n message: string | null;\n onBack?: (() => void) | undefined;\n onBillingChange: (event: StripeAddressElementChangeEvent) => void;\n onEmailChange: (value: string) => void;\n onIncludeServiceFeeChange?: ((value: boolean) => void) | undefined;\n onPaymentLoadError: () => void;\n onPhoneChange: (value: PhoneInputValue) => void;\n onSameAsBillingChange: (value: boolean) => void;\n onShippingChange: (event: StripeAddressElementChangeEvent) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n phone: string;\n pricing: LockerverseAuctionPricing;\n quantity: number;\n sameAsBilling: boolean;\n serviceFeeCents: number;\n serviceFeeEnabled: boolean;\n showFields: boolean;\n submitDisabled: boolean;\n};\n\nfunction getPaymentOptions(isPurchase: boolean): StripePaymentElementOptions {\n return {\n business: { name: \"Lockerverse\" },\n fields: {\n billingDetails: {\n address: \"never\",\n email: \"never\",\n name: \"never\",\n phone: \"never\",\n },\n },\n terms: {\n applePay: isPurchase ? \"auto\" : \"never\",\n auBecsDebit: \"never\",\n bancontact: \"never\",\n card: \"always\",\n cashapp: \"never\",\n googlePay: \"never\",\n ideal: \"never\",\n paypal: isPurchase ? \"auto\" : \"never\",\n sepaDebit: \"never\",\n sofort: \"never\",\n usBankAccount: \"never\",\n },\n wallets: { applePay: isPurchase ? \"auto\" : \"never\", googlePay: \"never\" },\n };\n}\n\nexport function AuctionCheckoutView(props: AuctionCheckoutViewProps) {\n const { isPurchase, item, pricing, id } = props;\n return (\n <form\n className=\"lockerverse-auctions__checkout\"\n noValidate\n onSubmit={props.onSubmit}\n >\n <div className=\"lockerverse-auctions__checkout-header\">\n <div className=\"lockerverse-auctions__checkout-navigation\">\n <button\n aria-label=\"Back\"\n className=\"lockerverse-auctions__checkout-back\"\n disabled={!props.onBack}\n onClick={props.onBack}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={20} />\n </button>\n <div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Step 2 of 2\n </p>\n <p>{isPurchase ? \"Secure checkout\" : \"Secure payment method\"}</p>\n </div>\n </div>\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n {props.communityName}\n </p>\n <h2>\n {isPurchase\n ? \"Finalize your purchase.\"\n : \"Finalize your bid authorization.\"}\n </h2>\n <p className=\"lockerverse-auctions__checkout-summary\">\n {isPurchase ? (\n <>\n Pay <strong>{formatMoney(pricing.totalCents)}</strong> for{\" \"}\n {props.quantity} {props.quantity === 1 ? \"item\" : \"items\"} of{\" \"}\n <strong>{item.name}</strong>. Your card is charged immediately\n once checkout succeeds.\n </>\n ) : (\n <>\n Authorize a payment method for your bid of{\" \"}\n <strong>{formatMoney(pricing.subtotalCents)}</strong> on{\" \"}\n <strong>{item.name}</strong>. Your card is only charged if this\n bid wins the item.\n </>\n )}\n </p>\n {item.collectShippingAddress && (\n <div className=\"lockerverse-auctions__checkout-physical\">\n <p className=\"lockerverse-auctions__checkout-eyebrow\">\n Physical item\n </p>\n <p>\n This item requires a delivery address. Billing details are used by\n default, and you can switch to a separate delivery address below\n if needed.\n </p>\n </div>\n )}\n </div>\n <div className=\"lockerverse-auctions__checkout-body\">\n {props.showFields && (\n <fieldset disabled={props.locked}>\n <div className=\"lockerverse-auctions__checkout-contact\">\n <EmailField\n error={props.contactErrors.email}\n id={`${id}-email`}\n label=\"Email\"\n name=\"email\"\n onChange={(event) => props.onEmailChange(event.target.value)}\n required\n value={props.email}\n />\n <FormField\n error={props.contactErrors.phone}\n id={`${id}-phone`}\n label=\"Phone\"\n >\n <PhoneInput\n country={props.phoneCountry}\n error={props.contactErrors.phone}\n errorId={`${id}-phone-error`}\n id={`${id}-phone`}\n name=\"phone\"\n onChange={props.onPhoneChange}\n required\n value={props.phone}\n />\n </FormField>\n </div>\n <section\n aria-label=\"Payment Information\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <div className=\"lockerverse-auctions__checkout-section-heading\">\n <h3>Payment Information</h3>\n <p>\n {isPurchase\n ? \"Processed securely and charged immediately for this purchase.\"\n : \"Stored securely and charged only if your bid finishes on top.\"}\n </p>\n </div>\n <PaymentElement\n onLoadError={props.onPaymentLoadError}\n options={getPaymentOptions(isPurchase)}\n />\n </section>\n <section\n aria-label=\"Billing Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <h3>Billing Details</h3>\n <AddressElement\n onChange={props.onBillingChange}\n options={{ mode: \"billing\" }}\n />\n <p>\n {isPurchase\n ? \"Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.\"\n : \"Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.\"}\n </p>\n </section>\n {item.collectShippingAddress && (\n <section\n aria-label=\"Delivery Details\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <label\n className=\"lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery\"\n htmlFor={`${id}-delivery-same-as-billing`}\n >\n <Checkbox\n checked={props.sameAsBilling}\n id={`${id}-delivery-same-as-billing`}\n onChange={(event) =>\n props.onSameAsBillingChange(event.target.checked)\n }\n />\n <span>\n <strong>Delivery address is the same as billing</strong>\n <span>\n Leave this on for the fastest flow. Turn it off only if\n the delivery address should differ from the billing\n details above.\n </span>\n </span>\n </label>\n {!props.sameAsBilling && (\n <>\n <h3>Delivery Address</h3>\n <AddressElement\n onChange={props.onShippingChange}\n options={{ mode: \"shipping\" }}\n />\n </>\n )}\n </section>\n )}\n <CheckoutAdditionalCharge\n isPurchase={isPurchase}\n pricing={pricing}\n />\n {props.serviceFeeEnabled && <CheckoutServiceFee {...props} />}\n </fieldset>\n )}\n {props.message && (\n <p\n aria-live=\"polite\"\n className=\"lockerverse-auctions__notice\"\n role=\"status\"\n >\n {props.message}\n </p>\n )}\n {!props.isTerminal && (\n <div className=\"lockerverse-auctions__checkout-footer\">\n <p>\n {isPurchase\n ? \"By continuing, you agree to be charged for this purchase.\"\n : \"By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.\"}\n {item.collectShippingAddress\n ? ` Your delivery details are stored with the ${isPurchase ? \"order\" : \"bid\"} so the seller can fulfill the item after payment.`\n : \"\"}\n </p>\n <button\n className=\"lockerverse-auctions__button lockerverse-auctions__checkout-submit\"\n disabled={props.submitDisabled}\n type=\"submit\"\n >\n {props.buttonText}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n )}\n </div>\n </form>\n );\n}\n\nfunction CheckoutServiceFee(props: AuctionCheckoutViewProps) {\n const { isPurchase, pricing } = props;\n return (\n <section\n aria-label=\"Processing fees\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n {props.onIncludeServiceFeeChange ? (\n <label\n className=\"lockerverse-auctions__checkout-checkbox\"\n htmlFor={`${props.id}-service-fee`}\n >\n <Checkbox\n checked={props.includeServiceFee}\n id={`${props.id}-service-fee`}\n onChange={(event) =>\n props.onIncludeServiceFeeChange?.(event.target.checked)\n }\n />\n <span>\n <strong>\n {isPurchase ? \"Add\" : \"If I win, add\"}{\" \"}\n {formatMoney(props.serviceFeeCents)} to help cover processing fees\n </strong>\n <span>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </span>\n </span>\n </label>\n ) : (\n <p>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </p>\n )}\n </section>\n );\n}\n\nfunction CheckoutAdditionalCharge({\n pricing,\n isPurchase,\n}: {\n pricing: LockerverseAuctionPricing;\n isPurchase: boolean;\n}) {\n if (!pricing.additionalCharge) {\n return null;\n }\n return (\n <section\n aria-label=\"Order amounts\"\n className=\"lockerverse-auctions__checkout-section\"\n >\n <p>\n {isPurchase ? \"Subtotal\" : \"Bid amount\"}:{\" \"}\n {formatMoney(pricing.subtotalCents)}\n </p>\n <p>\n {pricing.additionalCharge.name}:{\" \"}\n {formatMoney(pricing.additionalChargeCents ?? 0)}\n </p>\n <p>\n {isPurchase ? \"Total\" : \"Total if I win\"}:{\" \"}\n {formatMoney(pricing.totalCents)}\n </p>\n </section>\n );\n}\n","// biome-ignore-all lint/suspicious/noUnnecessaryConditions: React refs change in effect cleanup and event handlers outside this static control flow.\nimport {\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionPurchaseResult,\n LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport type { StripeAddressElementChangeEvent } from \"@stripe/stripe-js\";\nimport { type FormEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { AuctionCheckoutView } from \"./auction-checkout-view.tsx\";\nimport type {\n LockerverseAuctionItemProps,\n LockerverseAuctionPurchaseRecovery,\n} from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n auctionExpectedPricing,\n completeAuctionAction,\n createAuctionConfirmationToken,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n hasAuctionCheckoutChanged,\n sameAuctionAdditionalCharge,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { type ContactErrors, validateContact } from \"./payment-validation.ts\";\nimport { getInternationalPhone, resolvePhoneCountry } from \"./phone.ts\";\n\ntype AuctionCheckoutProps = LockerverseAuctionItemProps & {\n item: LockerverseAuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact?: { email: string; phone: string };\n onContactChange?: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange?: (value: boolean) => void;\n onInteractionLockChange?: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\ntype CheckoutState =\n | \"ready\"\n | \"busy\"\n | \"pending\"\n | \"retry\"\n | \"complete\"\n | \"uncertain\";\n\nfunction getSubmitLabel(\n state: CheckoutState,\n hasRecovery: boolean,\n isPurchase: boolean\n) {\n if (state === \"busy\") {\n return isPurchase ? \"Processing...\" : \"Authorizing...\";\n }\n if (state === \"retry\") {\n return \"Retry original purchase\";\n }\n if (hasRecovery) {\n return \"Check purchase status\";\n }\n return isPurchase ? \"Buy Now\" : \"Authorize Bid\";\n}\n\nexport function AuctionCheckout(props: AuctionCheckoutProps) {\n const { auction, item, selection, client, onReview, onBack } = props;\n const stripe = useStripe();\n const elements = useElements();\n const id = useId();\n const [email, setEmail] = useState(props.contact?.email ?? \"\");\n const [phone, setPhone] = useState(props.contact?.phone ?? \"\");\n const [phoneCountry, setPhoneCountry] = useState<string>(() =>\n resolvePhoneCountry(props.contact?.phone ?? \"\")\n );\n const [contactErrors, setContactErrors] = useState<ContactErrors>({});\n const [sameAsBilling, setSameAsBilling] = useState(true);\n const [billing, setBilling] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [shipping, setShipping] =\n useState<StripeAddressElementChangeEvent | null>(null);\n const [recovery, setRecovery] = useState(props.resumePurchase ?? null);\n const [state, setState] = useState<CheckoutState>(\n props.resumePurchase ? \"pending\" : \"ready\"\n );\n const [message, setMessage] = useState<string | null>(null);\n const purchaseRequestId = useRef<string | null>(\n props.resumePurchase?.submission.clientRequestId ?? null\n );\n const isTerminal = state === \"complete\" || state === \"uncertain\";\n const busy = useRef<boolean>(false);\n const mounted = useRef<boolean>(true);\n const callbacks = useRef(props);\n callbacks.current = props;\n const outcomeReported = useRef(false);\n\n function transition(next: CheckoutState) {\n if (mounted.current) {\n setState(next);\n }\n notifyHostCallback(\n callbacks.current.onInteractionLockChange,\n next !== \"ready\" && next !== \"complete\"\n );\n }\n function showMessage(value: string | null) {\n if (mounted.current) {\n setMessage(value);\n }\n }\n function reportUncertain(kind: \"bid\" | \"purchase\") {\n transition(kind === \"bid\" ? \"uncertain\" : \"pending\");\n showMessage(\n kind === \"bid\"\n ? \"We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.\"\n : \"We could not confirm the purchase result. Check its status using the same purchase request.\"\n );\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onUncertain, kind);\n }\n }\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const isPurchase =\n Boolean(recovery ?? props.resumePurchase) || item.saleMode === \"buy_now\";\n const pricing =\n recovery?.pricing ??\n props.resumePurchase?.pricing ??\n getAuctionSelectionPricing(auction, item, selection);\n\n const payment =\n recovery?.payment ?? props.resumePurchase?.payment ?? auction.payment;\n\n function rememberPurchase(value: LockerverseAuctionPurchaseRecovery | null) {\n if (mounted.current) {\n setRecovery(value);\n }\n notifyHostCallback(callbacks.current.onPurchaseRecoveryChange, value);\n }\n\n function finishPurchase(result: LockerverseAuctionPurchaseResult) {\n if (result.status === \"paid\") {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n additionalCharge: result.additionalCharge ?? null,\n additionalChargeCents: result.additionalChargeCents ?? 0,\n kind: \"purchase\",\n purchaseId: result.purchaseId,\n quantity: result.quantity,\n serviceFeeCents: result.serviceFeeCents,\n status: \"paid\",\n subtotalCents: result.subtotalCents,\n totalCents: result.totalCents,\n unitAmountCents: result.subtotalCents / result.quantity,\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onPurchaseComplete, result);\n }\n } else if (result.status === \"pending_payment\") {\n transition(\"pending\");\n showMessage(\n \"Your purchase is pending. Check its status before making another payment.\"\n );\n } else {\n purchaseRequestId.current = null;\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `This purchase is ${result.status.replaceAll(\"_\", \" \")}. You can start a new purchase.`\n );\n }\n }\n\n function readContact() {\n const phoneNumber = getInternationalPhone(phone, phoneCountry);\n const contact = validateContact({ email, phone: phoneNumber }, true);\n setContactErrors(contact.errors);\n if (!contact.value) {\n document\n .getElementById(`${id}-${contact.errors.email ? \"email\" : \"phone\"}`)\n ?.focus();\n return null;\n }\n return { email: contact.value.email, phone: phoneNumber };\n }\n\n function requireCurrentSelection() {\n const latest = callbacks.current.selection;\n if (\n selection.quantity !== latest.quantity ||\n selection.amount !== latest.amount ||\n selection.includeServiceFee !== latest.includeServiceFee\n ) {\n throw new Error(\n \"Your selection changed. Review the total before continuing.\"\n );\n }\n }\n\n async function verifyPurchaseQuote(current: LockerverseAuction) {\n if (!(isPurchase && item.additionalCharge)) {\n return true;\n }\n const quote = await client.getPurchaseQuote(auction.slug, item.id, {\n includeServiceFee: selection.includeServiceFee,\n quantity: selection.quantity,\n });\n if (!mounted.current) {\n return false;\n }\n if (\n quote.subtotalCents !== pricing.subtotalCents ||\n (quote.additionalChargeCents ?? 0) !==\n (pricing.additionalChargeCents ?? 0) ||\n quote.serviceFeeCents !== pricing.serviceFeeCents ||\n quote.totalCents !== pricing.totalCents ||\n !sameAuctionAdditionalCharge(\n quote.additionalCharge,\n pricing.additionalCharge\n )\n ) {\n onReview(\n current,\n \"The checkout details changed. Review them before continuing.\"\n );\n return false;\n }\n return true;\n }\n\n async function prepareSubmission(\n contact: { email: string; phone: string } | null\n ) {\n if (!contact) {\n throw new Error(\"Check the contact fields below.\");\n }\n if (!(stripe && elements && auction.payment)) {\n throw new Error(\"Payment details are still loading.\");\n }\n const current = await client.load(auction.slug);\n if (!mounted.current) {\n return null;\n }\n const currentItem = current.items.find(\n (candidate) => candidate.id === item.id\n );\n if (!currentItem) {\n onReview(current, \"This item is no longer available.\");\n return null;\n }\n const selectionError = getAuctionSelectionError(\n current,\n currentItem,\n selection\n );\n if (\n selectionError ||\n hasAuctionCheckoutChanged(auction, current, item, currentItem, selection)\n ) {\n onReview(\n current,\n selectionError ??\n \"The checkout details changed. Review them before continuing.\"\n );\n return null;\n }\n if (!(await verifyPurchaseQuote(current))) {\n return null;\n }\n const confirmationToken = await createAuctionConfirmationToken({\n billing,\n collectShippingAddress: item.collectShippingAddress,\n elements,\n email: contact.email,\n phone: contact.phone,\n shipping: sameAsBilling ? billing : shipping,\n stripe,\n });\n if (!mounted.current) {\n return null;\n }\n requireCurrentSelection();\n return {\n confirmationToken,\n email: contact.email,\n includeServiceFee: selection.includeServiceFee,\n phone: contact.phone,\n ...auctionExpectedPricing(pricing),\n };\n }\n\n async function sendBid(\n submission: NonNullable<Awaited<ReturnType<typeof prepareSubmission>>>\n ) {\n const result = await client.createBid(auction.slug, item.id, {\n ...submission,\n amount: selection.amount,\n });\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"bid\");\n return;\n }\n await completeAuctionAction(stripe, result);\n }\n transition(\"complete\");\n notifyHostCallback(callbacks.current.onResult, {\n additionalCharge: result.additionalCharge ?? null,\n additionalChargeCents: result.additionalChargeCents ?? 0,\n amountCents: result.subtotalCents,\n kind: \"bid\",\n serviceFeeCents: result.serviceFeeCents,\n totalCents: result.totalCents,\n });\n if (!outcomeReported.current) {\n outcomeReported.current = true;\n notifyHostCallback(callbacks.current.onBidSubmitted, result);\n }\n }\n\n async function resolvePurchase(\n result: LockerverseAuctionPurchaseResult,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n if (result.requiresAction) {\n if (!(mounted.current && stripe)) {\n reportUncertain(\"purchase\");\n return;\n }\n await completeAuctionAction(stripe, result);\n const updated = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (updated) {\n finishPurchase(updated);\n } else {\n transition(\"pending\");\n showMessage(\n \"Payment status is not available yet. Check again shortly.\"\n );\n }\n return;\n }\n finishPurchase(result);\n if (!mounted.current && result.status === \"pending_payment\") {\n reportUncertain(\"purchase\");\n }\n }\n\n async function checkPurchase(active: LockerverseAuctionPurchaseRecovery) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n } else {\n if (!mounted.current) {\n reportUncertain(\"purchase\");\n return;\n }\n transition(\"retry\");\n showMessage(\n \"No purchase is recorded yet. You can retry the original purchase with the same request ID.\"\n );\n }\n }\n\n async function clearRejectedPurchase(\n error: LockerverseSdkError,\n active: LockerverseAuctionPurchaseRecovery\n ) {\n const result = await client.getPurchaseStatus(\n auction.slug,\n item.id,\n active.submission.clientRequestId\n );\n if (result) {\n await resolvePurchase(result, active);\n return;\n }\n rememberPurchase(null);\n transition(\"ready\");\n showMessage(\n `The purchase was rejected. Review the item and payment details before trying again. (${error.status ?? \"validation\"})`\n );\n }\n\n async function handleFailure<Failure>(\n error: Failure,\n requestSent: boolean,\n active: LockerverseAuctionPurchaseRecovery | null,\n wasRecovery: boolean\n ) {\n const uncertain =\n requestSent &&\n (!(error instanceof LockerverseSdkError) || error.recoveryRecommended);\n showMessage(\n error instanceof Error\n ? error.message\n : \"Unable to complete this request.\"\n );\n if (isPurchase && active) {\n if (\n !wasRecovery &&\n error instanceof LockerverseSdkError &&\n !error.recoveryRecommended\n ) {\n try {\n await clearRejectedPurchase(error, active);\n return;\n } catch {\n /* Keep the original request when status cannot be established. */\n }\n }\n reportUncertain(\"purchase\");\n } else if (uncertain) {\n reportUncertain(\"bid\");\n } else {\n transition(\"ready\");\n }\n }\n\n function getPurchaseRequestId() {\n purchaseRequestId.current ??= globalThis.crypto.randomUUID();\n return purchaseRequestId.current;\n }\n\n function canSendPurchase() {\n if (mounted.current) {\n return true;\n }\n if (!recovery) {\n rememberPurchase(null);\n transition(\"ready\");\n }\n return false;\n }\n\n async function sendOrCheckPurchase(\n active: LockerverseAuctionPurchaseRecovery,\n statusOnly: boolean\n ) {\n if (statusOnly) {\n await checkPurchase(active);\n return;\n }\n if (!canSendPurchase()) {\n return;\n }\n const result = await client.createPurchase(\n auction.slug,\n item.id,\n active.submission\n );\n await resolvePurchase(result, active);\n }\n\n const checkoutPayment = stripe && elements && payment;\n\n function startSubmission() {\n if (busy.current || isTerminal) {\n return null;\n }\n if (!checkoutPayment) {\n showMessage(\"Payment details are still loading.\");\n return null;\n }\n const contact = recovery ? null : readContact();\n if (!(recovery || contact)) {\n return null;\n }\n return { checkoutPayment, contact, retryOriginal: state === \"retry\" };\n }\n\n async function submit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n const start = startSubmission();\n if (!start) {\n return;\n }\n const { contact, checkoutPayment: readyPayment, retryOriginal } = start;\n busy.current = true;\n outcomeReported.current = false;\n transition(\"busy\");\n showMessage(null);\n let requestSent = false;\n let activeRecovery = recovery;\n try {\n if (!activeRecovery) {\n const submission = await prepareSubmission(contact);\n if (!(submission && mounted.current)) {\n transition(\"ready\");\n return;\n }\n if (!isPurchase) {\n requestSent = true;\n await sendBid(submission);\n return;\n }\n activeRecovery = Object.freeze({\n auctionId: auction.id,\n item,\n itemId: item.id,\n payment: Object.freeze({ ...readyPayment }),\n pricing,\n submission: Object.freeze({\n ...submission,\n clientRequestId: getPurchaseRequestId(),\n paymentMethodTypes: Object.freeze([\"card\"] as const),\n quantity: selection.quantity,\n }),\n });\n rememberPurchase(activeRecovery);\n }\n requestSent = true;\n await sendOrCheckPurchase(\n activeRecovery,\n Boolean(recovery) && !retryOriginal\n );\n } catch (error) {\n await handleFailure(\n error,\n requestSent,\n activeRecovery,\n recovery !== null && !retryOriginal\n );\n } finally {\n busy.current = false;\n }\n }\n\n const buttonText = getSubmitLabel(state, recovery !== null, isPurchase);\n\n const locked = state !== \"ready\";\n return (\n <AuctionCheckoutView\n buttonText={buttonText}\n communityName={props.communityName ?? auction.name}\n contactErrors={contactErrors}\n email={email}\n id={id}\n includeServiceFee={selection.includeServiceFee}\n isPurchase={isPurchase}\n isTerminal={isTerminal}\n item={item}\n locked={locked}\n message={message}\n onBack={state === \"ready\" ? onBack : undefined}\n onBillingChange={setBilling}\n onEmailChange={(value) => {\n setEmail(value);\n props.onContactChange?.({\n email: value,\n phone: getInternationalPhone(phone, phoneCountry),\n });\n }}\n onIncludeServiceFeeChange={props.onIncludeServiceFeeChange}\n onPaymentLoadError={() => showMessage(\"Unable to load payment form.\")}\n onPhoneChange={({ value, country }) => {\n setPhone(value);\n setPhoneCountry(country);\n props.onContactChange?.({\n email,\n phone: getInternationalPhone(value, country),\n });\n }}\n onSameAsBillingChange={setSameAsBilling}\n onShippingChange={setShipping}\n onSubmit={submit}\n phone={phone}\n phoneCountry={phoneCountry}\n pricing={pricing}\n quantity={selection.quantity}\n sameAsBilling={sameAsBilling}\n serviceFeeCents={\n recovery\n ? pricing.serviceFeeCents\n : getAuctionSelectionPricing(auction, item, {\n ...selection,\n includeServiceFee: auction.serviceFeeEnabled,\n }).serviceFeeCents\n }\n serviceFeeEnabled={auction.serviceFeeEnabled}\n showFields={!(recovery || isTerminal)}\n submitDisabled={state === \"busy\" || !stripe || !elements}\n />\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport type {\n StripeElementsOptions,\n StripeElementsOptionsMode,\n} from \"@stripe/stripe-js\";\nimport { type RefObject, useEffect, useState } from \"react\";\nimport { AuctionCheckout } from \"./auction-checkout.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport type { LockerverseAuctionOutcome } from \"./auction-result.tsx\";\nimport { useStripeAppearance } from \"./stripe-appearance.ts\";\nimport { defaultLockerverseStripeLoader } from \"./stripe-loader.ts\";\n\nexport type AuctionPaymentProps = LockerverseAuctionItemProps & {\n appearanceRoot: RefObject<HTMLElement | null>;\n interactionLocked: boolean;\n item: AuctionItem;\n selection: AuctionSelection;\n onReview: (auction: LockerverseAuction, message: string) => void;\n onBack: () => void;\n contact: { email: string; phone: string };\n onContactChange: (contact: { email: string; phone: string }) => void;\n onIncludeServiceFeeChange: (value: boolean) => void;\n onInteractionLockChange: (locked: boolean) => void;\n onResult: (outcome: LockerverseAuctionOutcome) => void;\n};\n\nexport function AuctionPayment(props: AuctionPaymentProps) {\n const {\n auction,\n item,\n selection,\n theme = \"dark\",\n stripeLoader = defaultLockerverseStripeLoader,\n style,\n onBack,\n resumePurchase,\n } = props;\n const [stripe, setStripe] =\n useState<Awaited<ReturnType<typeof defaultLockerverseStripeLoader>>>(null);\n const [failed, setFailed] = useState(false);\n const [revision, setRevision] = useState(0);\n const appearance = useStripeAppearance(\n props.appearanceRoot,\n theme,\n style,\n props.interactionLocked\n );\n const payment = resumePurchase?.payment ?? auction.payment;\n useEffect(() => {\n let active = true;\n if (!payment) {\n setFailed(true);\n return;\n }\n Promise.resolve()\n .then(() =>\n stripeLoader(\n payment.publishableKey,\n payment.connectedAccountId\n ? { stripeAccount: payment.connectedAccountId }\n : undefined\n )\n )\n .then(\n (loaded) => {\n if (active) {\n setStripe(loaded);\n setFailed(!loaded);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, [payment, stripeLoader, revision]);\n if (failed) {\n return (\n <div>\n <p role=\"alert\">Payment details could not load.</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n <button\n onClick={() => {\n setFailed(false);\n setStripe(null);\n setRevision((value) => value + 1);\n }}\n type=\"button\"\n >\n Try again\n </button>\n </div>\n );\n }\n if (!(stripe && appearance)) {\n return (\n <div>\n <p role=\"status\">Loading secure payment details…</p>\n {resumePurchase ? null : (\n <button onClick={onBack} type=\"button\">\n Back to item\n </button>\n )}\n </div>\n );\n }\n let paymentOptions: StripeElementsOptionsMode = {\n mode: \"setup\",\n setupFutureUsage: \"off_session\",\n };\n if (resumePurchase) {\n paymentOptions = {\n amount: resumePurchase.pricing.totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n } else if (item.saleMode === \"buy_now\") {\n paymentOptions = {\n amount: getAuctionSelectionPricing(auction, item, selection).totalCents,\n currency: \"usd\",\n mode: \"payment\",\n };\n }\n const options: StripeElementsOptions = {\n ...paymentOptions,\n appearance,\n currency: \"usd\",\n paymentMethodTypes: [\"card\"],\n syncAddressCheckbox: \"none\",\n };\n return (\n <Elements options={options} stripe={stripe}>\n <AuctionCheckout {...props} />\n </Elements>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e}from"./use-auction-boundary.js";import{calculateLockerverseAuctionPricing as t,getLockerverseAuctionMinimumBid as n}from"@lockerverse/sdk/auctions";function r(e,n,r){return t(e,n.saleMode===`buy_now`?(n.buyNowPriceAmount??0)*r.quantity:r.amount,r.includeServiceFee)}function i(t,r,i){if(e(t,r)!==`active`)return`This item is not accepting bids or purchases.`;if(r.saleMode===`hybrid`)return`This item type is not supported for checkout.`;if(r.saleMode===`buy_now`){if(r.isSoldOut||r.availableQuantity===0)return`This item is sold out.`;if(!(r.buyNowPriceAmount&&Number.isSafeInteger(i.quantity))||i.quantity<1||r.availableQuantity!==null&&i.quantity>r.availableQuantity)return`Select an available quantity.`}else if(!Number.isSafeInteger(i.amount)||i.amount%100!=0||i.amount<n(r))return`Enter a whole-dollar bid at or above the minimum bid.`;return null}function a(e,t,n,i,a){return e.payment?.publishableKey!==t.payment?.publishableKey||e.payment?.connectedAccountId!==t.payment?.connectedAccountId||e.serviceFeeEnabled!==t.serviceFeeEnabled||n.saleMode!==i.saleMode||n.collectShippingAddress!==i.collectShippingAddress||JSON.stringify(r(e,n,a))!==JSON.stringify(r(t,i,a))}function o(e){return{expectedServiceFeeCents:e.serviceFeeCents,expectedSubtotalCents:e.subtotalCents,expectedTotalCents:e.totalCents}}async function s({stripe:e,elements:t,email:n,phone:r,billing:i,shipping:a,collectShippingAddress:o}){if(!(i?.complete&&i.value.name.trim()))throw Error(`Complete your billing name and address.`);if(o&&!(a?.complete&&a.value.name.trim()))throw Error(`Complete your shipping name and address.`);let s=await t.submit();if(s.error)throw Error(s.error.message??`Check your payment details.`);let c=await e.createConfirmationToken({elements:t,params:{payment_method_data:{allow_redisplay:`always`,billing_details:{address:i.value.address,email:n,name:i.value.name,phone:r}},return_url:window.location.href,...o&&a?{shipping:{address:a.value.address,name:a.value.name,phone:r}}:void 0}});if(c.error||!c.confirmationToken)throw Error(c.error?.message??`Unable to prepare payment details.`);return c.confirmationToken.id}async function c(e,t){if(!t.requiresAction)return;if(!t.clientSecret)throw Error(`Payment confirmation is incomplete. Check its status before trying again.`);let n=await e.handleNextAction({clientSecret:t.clientSecret});if(n.error)throw Error(n.error.message??`Payment confirmation is incomplete.`)}export{r as a,i,c as n,a as o,s as r,o as t};
1
+ import{a as e}from"./use-auction-boundary.js";import{calculateLockerverseAuctionPricing as t,getLockerverseAuctionMinimumBid as n}from"@lockerverse/sdk/auctions";function r(e,n,r){let i=t(e,n.saleMode===`buy_now`?(n.buyNowPriceAmount??0)*r.quantity:r.amount,r.includeServiceFee,n.additionalCharge?n.additionalCharge.firstUnitAmountCents+n.additionalCharge.additionalUnitAmountCents*(n.saleMode===`buy_now`?r.quantity-1:0):0);return n.additionalCharge?{...i,additionalCharge:n.additionalCharge}:i}function i(t,r,i){if(e(t,r)!==`active`)return`This item is not accepting bids or purchases.`;if(r.saleMode===`hybrid`)return`This item type is not supported for checkout.`;if(r.saleMode===`buy_now`){if(r.isSoldOut||r.availableQuantity===0)return`This item is sold out.`;if(i.quantity>(r.maxQuantityPerOrder??1/0))return`You can buy up to ${r.maxQuantityPerOrder} items per order.`;if(!(r.buyNowPriceAmount&&Number.isSafeInteger(i.quantity))||i.quantity<1||r.availableQuantity!==null&&i.quantity>r.availableQuantity)return`Select an available quantity.`}else if(!Number.isSafeInteger(i.amount)||i.amount%100!=0||i.amount<n(r))return`Enter a whole-dollar bid at or above the minimum bid.`;return null}function a(e,t){return e?.name===t?.name&&e?.category===t?.category&&e?.firstUnitAmountCents===t?.firstUnitAmountCents&&e?.additionalUnitAmountCents===t?.additionalUnitAmountCents}function o(e,t,n,i,o){return e.payment?.publishableKey!==t.payment?.publishableKey||e.payment?.connectedAccountId!==t.payment?.connectedAccountId||e.serviceFeeEnabled!==t.serviceFeeEnabled||n.saleMode!==i.saleMode||!a(n.additionalCharge,i.additionalCharge)||n.collectShippingAddress!==i.collectShippingAddress||JSON.stringify(r(e,n,o))!==JSON.stringify(r(t,i,o))}function s(e){return{expectedAdditionalChargeCents:e.additionalChargeCents??0,expectedServiceFeeCents:e.serviceFeeCents,expectedSubtotalCents:e.subtotalCents,expectedTotalCents:e.totalCents}}async function c({stripe:e,elements:t,email:n,phone:r,billing:i,shipping:a,collectShippingAddress:o}){if(!(i?.complete&&i.value.name.trim()))throw Error(`Complete your billing name and address.`);if(o&&!(a?.complete&&a.value.name.trim()))throw Error(`Complete your shipping name and address.`);let s=await t.submit();if(s.error)throw Error(s.error.message??`Check your payment details.`);let c=await e.createConfirmationToken({elements:t,params:{payment_method_data:{allow_redisplay:`always`,billing_details:{address:i.value.address,email:n,name:i.value.name,phone:r}},return_url:window.location.href,...o&&a?{shipping:{address:a.value.address,name:a.value.name,phone:r}}:void 0}});if(c.error||!c.confirmationToken)throw Error(c.error?.message??`Unable to prepare payment details.`);return c.confirmationToken.id}async function l(e,t){if(!t.requiresAction)return;if(!t.clientSecret)throw Error(`Payment confirmation is incomplete. Check its status before trying again.`);let n=await e.handleNextAction({clientSecret:t.clientSecret});if(n.error)throw Error(n.error.message??`Payment confirmation is incomplete.`)}export{r as a,i,l as n,o,c as r,a as s,s as t};
2
2
  //# sourceMappingURL=auction-payment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auction-payment.js","names":[],"sources":["../src/auction-payment.ts"],"sourcesContent":["import type {\n LockerverseAuction,\n LockerverseAuctionBidResult,\n LockerverseAuctionItem,\n LockerverseAuctionPricing,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n calculateLockerverseAuctionPricing,\n getLockerverseAuctionMinimumBid,\n} from \"@lockerverse/sdk/auctions\";\nimport type {\n Stripe,\n StripeAddressElementChangeEvent,\n StripeElements,\n} from \"@stripe/stripe-js\";\nimport { getAuctionDisplayStatus } from \"./auction-display.ts\";\n\nexport type AuctionSelection = {\n amount: number;\n quantity: number;\n includeServiceFee: boolean;\n};\n\nexport function getAuctionSelectionPricing(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n selection: AuctionSelection\n) {\n return calculateLockerverseAuctionPricing(\n auction,\n item.saleMode === \"buy_now\"\n ? (item.buyNowPriceAmount ?? 0) * selection.quantity\n : selection.amount,\n selection.includeServiceFee\n );\n}\n\nexport function getAuctionSelectionError(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n selection: AuctionSelection\n) {\n if (getAuctionDisplayStatus(auction, item) !== \"active\") {\n return \"This item is not accepting bids or purchases.\";\n }\n if (item.saleMode === \"hybrid\") {\n return \"This item type is not supported for checkout.\";\n }\n if (item.saleMode === \"buy_now\") {\n if (item.isSoldOut || item.availableQuantity === 0) {\n return \"This item is sold out.\";\n }\n if (\n !(item.buyNowPriceAmount && Number.isSafeInteger(selection.quantity)) ||\n selection.quantity < 1 ||\n (item.availableQuantity !== null &&\n selection.quantity > item.availableQuantity)\n ) {\n return \"Select an available quantity.\";\n }\n } else if (\n !Number.isSafeInteger(selection.amount) ||\n selection.amount % 100 !== 0 ||\n selection.amount < getLockerverseAuctionMinimumBid(item)\n ) {\n return \"Enter a whole-dollar bid at or above the minimum bid.\";\n }\n return null;\n}\n\nexport function hasAuctionCheckoutChanged(\n previous: LockerverseAuction,\n current: LockerverseAuction,\n item: LockerverseAuctionItem,\n nextItem: LockerverseAuctionItem,\n selection: AuctionSelection\n) {\n return (\n previous.payment?.publishableKey !== current.payment?.publishableKey ||\n previous.payment?.connectedAccountId !==\n current.payment?.connectedAccountId ||\n previous.serviceFeeEnabled !== current.serviceFeeEnabled ||\n item.saleMode !== nextItem.saleMode ||\n item.collectShippingAddress !== nextItem.collectShippingAddress ||\n JSON.stringify(getAuctionSelectionPricing(previous, item, selection)) !==\n JSON.stringify(getAuctionSelectionPricing(current, nextItem, selection))\n );\n}\n\nexport function auctionExpectedPricing(pricing: LockerverseAuctionPricing) {\n return {\n expectedServiceFeeCents: pricing.serviceFeeCents,\n expectedSubtotalCents: pricing.subtotalCents,\n expectedTotalCents: pricing.totalCents,\n };\n}\n\nexport async function createAuctionConfirmationToken({\n stripe,\n elements,\n email,\n phone,\n billing,\n shipping,\n collectShippingAddress,\n}: {\n stripe: Stripe;\n elements: StripeElements;\n email: string;\n phone: string;\n billing: StripeAddressElementChangeEvent | null;\n shipping: StripeAddressElementChangeEvent | null;\n collectShippingAddress: boolean;\n}) {\n if (!(billing?.complete && billing.value.name.trim())) {\n throw new Error(\"Complete your billing name and address.\");\n }\n if (\n collectShippingAddress &&\n !(shipping?.complete && shipping.value.name.trim())\n ) {\n throw new Error(\"Complete your shipping name and address.\");\n }\n const submitted = await elements.submit();\n if (submitted.error) {\n throw new Error(submitted.error.message ?? \"Check your payment details.\");\n }\n const result = await stripe.createConfirmationToken({\n elements,\n params: {\n payment_method_data: {\n allow_redisplay: \"always\",\n billing_details: {\n address: billing.value.address,\n email,\n name: billing.value.name,\n phone,\n },\n },\n return_url: window.location.href,\n ...(collectShippingAddress && shipping\n ? {\n shipping: {\n address: shipping.value.address,\n name: shipping.value.name,\n phone,\n },\n }\n : undefined),\n },\n });\n if (result.error || !result.confirmationToken) {\n throw new Error(\n result.error?.message ?? \"Unable to prepare payment details.\"\n );\n }\n return result.confirmationToken.id;\n}\n\nexport async function completeAuctionAction(\n stripe: Stripe,\n result: LockerverseAuctionBidResult\n) {\n if (!result.requiresAction) {\n return;\n }\n if (!result.clientSecret) {\n throw new Error(\n \"Payment confirmation is incomplete. Check its status before trying again.\"\n );\n }\n const action = await stripe.handleNextAction({\n clientSecret: result.clientSecret,\n });\n if (action.error) {\n throw new Error(\n action.error.message ?? \"Payment confirmation is incomplete.\"\n );\n }\n}\n"],"mappings":"kKAuBA,SAAgB,EACd,EACA,EACA,EACA,CACA,OAAO,EACL,EACA,EAAK,WAAa,WACb,EAAK,mBAAqB,GAAK,EAAU,SAC1C,EAAU,OACd,EAAU,iBACZ,CACF,CAEA,SAAgB,EACd,EACA,EACA,EACA,CACA,GAAI,EAAwB,EAAS,CAAI,IAAM,SAC7C,MAAO,gDAET,GAAI,EAAK,WAAa,SACpB,MAAO,gDAET,GAAI,EAAK,WAAa,UAAW,CAC/B,GAAI,EAAK,WAAa,EAAK,oBAAsB,EAC/C,MAAO,yBAET,GACE,EAAE,EAAK,mBAAqB,OAAO,cAAc,EAAU,QAAQ,IACnE,EAAU,SAAW,GACpB,EAAK,oBAAsB,MAC1B,EAAU,SAAW,EAAK,kBAE5B,MAAO,+BAEX,MAAO,GACL,CAAC,OAAO,cAAc,EAAU,MAAM,GACtC,EAAU,OAAS,KAAQ,GAC3B,EAAU,OAAS,EAAgC,CAAI,EAEvD,MAAO,wDAET,OAAO,IACT,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACA,CACA,OACE,EAAS,SAAS,iBAAmB,EAAQ,SAAS,gBACtD,EAAS,SAAS,qBAChB,EAAQ,SAAS,oBACnB,EAAS,oBAAsB,EAAQ,mBACvC,EAAK,WAAa,EAAS,UAC3B,EAAK,yBAA2B,EAAS,wBACzC,KAAK,UAAU,EAA2B,EAAU,EAAM,CAAS,CAAC,IAClE,KAAK,UAAU,EAA2B,EAAS,EAAU,CAAS,CAAC,CAE7E,CAEA,SAAgB,EAAuB,EAAoC,CACzE,MAAO,CACL,wBAAyB,EAAQ,gBACjC,sBAAuB,EAAQ,cAC/B,mBAAoB,EAAQ,UAC9B,CACF,CAEA,eAAsB,EAA+B,CACnD,SACA,WACA,QACA,QACA,UACA,WACA,0BASC,CACD,GAAI,EAAE,GAAS,UAAY,EAAQ,MAAM,KAAK,KAAK,GACjD,MAAU,MAAM,yCAAyC,EAE3D,GACE,GACA,EAAE,GAAU,UAAY,EAAS,MAAM,KAAK,KAAK,GAEjD,MAAU,MAAM,0CAA0C,EAE5D,IAAM,EAAY,MAAM,EAAS,OAAO,EACxC,GAAI,EAAU,MACZ,MAAU,MAAM,EAAU,MAAM,SAAW,6BAA6B,EAE1E,IAAM,EAAS,MAAM,EAAO,wBAAwB,CAClD,WACA,OAAQ,CACN,oBAAqB,CACnB,gBAAiB,SACjB,gBAAiB,CACf,QAAS,EAAQ,MAAM,QACvB,QACA,KAAM,EAAQ,MAAM,KACpB,OACF,CACF,EACA,WAAY,OAAO,SAAS,KAC5B,GAAI,GAA0B,EAC1B,CACE,SAAU,CACR,QAAS,EAAS,MAAM,QACxB,KAAM,EAAS,MAAM,KACrB,OACF,CACF,EACA,IAAA,EACN,CACF,CAAC,EACD,GAAI,EAAO,OAAS,CAAC,EAAO,kBAC1B,MAAU,MACR,EAAO,OAAO,SAAW,oCAC3B,EAEF,OAAO,EAAO,kBAAkB,EAClC,CAEA,eAAsB,EACpB,EACA,EACA,CACA,GAAI,CAAC,EAAO,eACV,OAEF,GAAI,CAAC,EAAO,aACV,MAAU,MACR,2EACF,EAEF,IAAM,EAAS,MAAM,EAAO,iBAAiB,CAC3C,aAAc,EAAO,YACvB,CAAC,EACD,GAAI,EAAO,MACT,MAAU,MACR,EAAO,MAAM,SAAW,qCAC1B,CAEJ"}
1
+ {"version":3,"file":"auction-payment.js","names":[],"sources":["../src/auction-payment.ts"],"sourcesContent":["import type {\n LockerverseAuction,\n LockerverseAuctionAdditionalCharge,\n LockerverseAuctionBidResult,\n LockerverseAuctionItem,\n LockerverseAuctionPricing,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n calculateLockerverseAuctionPricing,\n getLockerverseAuctionMinimumBid,\n} from \"@lockerverse/sdk/auctions\";\nimport type {\n Stripe,\n StripeAddressElementChangeEvent,\n StripeElements,\n} from \"@stripe/stripe-js\";\nimport { getAuctionDisplayStatus } from \"./auction-display.ts\";\n\nexport type AuctionSelection = {\n amount: number;\n quantity: number;\n includeServiceFee: boolean;\n};\n\nexport function getAuctionSelectionPricing(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n selection: AuctionSelection\n) {\n const pricing = calculateLockerverseAuctionPricing(\n auction,\n item.saleMode === \"buy_now\"\n ? (item.buyNowPriceAmount ?? 0) * selection.quantity\n : selection.amount,\n selection.includeServiceFee,\n item.additionalCharge\n ? item.additionalCharge.firstUnitAmountCents +\n item.additionalCharge.additionalUnitAmountCents *\n (item.saleMode === \"buy_now\" ? selection.quantity - 1 : 0)\n : 0\n );\n return item.additionalCharge\n ? { ...pricing, additionalCharge: item.additionalCharge }\n : pricing;\n}\n\nexport function getAuctionSelectionError(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n selection: AuctionSelection\n) {\n if (getAuctionDisplayStatus(auction, item) !== \"active\") {\n return \"This item is not accepting bids or purchases.\";\n }\n if (item.saleMode === \"hybrid\") {\n return \"This item type is not supported for checkout.\";\n }\n if (item.saleMode === \"buy_now\") {\n if (item.isSoldOut || item.availableQuantity === 0) {\n return \"This item is sold out.\";\n }\n if (\n selection.quantity >\n (item.maxQuantityPerOrder ?? Number.POSITIVE_INFINITY)\n ) {\n return `You can buy up to ${item.maxQuantityPerOrder} items per order.`;\n }\n if (\n !(item.buyNowPriceAmount && Number.isSafeInteger(selection.quantity)) ||\n selection.quantity < 1 ||\n (item.availableQuantity !== null &&\n selection.quantity > item.availableQuantity)\n ) {\n return \"Select an available quantity.\";\n }\n } else if (\n !Number.isSafeInteger(selection.amount) ||\n selection.amount % 100 !== 0 ||\n selection.amount < getLockerverseAuctionMinimumBid(item)\n ) {\n return \"Enter a whole-dollar bid at or above the minimum bid.\";\n }\n return null;\n}\n\nexport function sameAuctionAdditionalCharge(\n left: LockerverseAuctionAdditionalCharge | null | undefined,\n right: LockerverseAuctionAdditionalCharge | null | undefined\n) {\n return (\n left?.name === right?.name &&\n left?.category === right?.category &&\n left?.firstUnitAmountCents === right?.firstUnitAmountCents &&\n left?.additionalUnitAmountCents === right?.additionalUnitAmountCents\n );\n}\n\nexport function hasAuctionCheckoutChanged(\n previous: LockerverseAuction,\n current: LockerverseAuction,\n item: LockerverseAuctionItem,\n nextItem: LockerverseAuctionItem,\n selection: AuctionSelection\n) {\n return (\n previous.payment?.publishableKey !== current.payment?.publishableKey ||\n previous.payment?.connectedAccountId !==\n current.payment?.connectedAccountId ||\n previous.serviceFeeEnabled !== current.serviceFeeEnabled ||\n item.saleMode !== nextItem.saleMode ||\n !sameAuctionAdditionalCharge(\n item.additionalCharge,\n nextItem.additionalCharge\n ) ||\n item.collectShippingAddress !== nextItem.collectShippingAddress ||\n JSON.stringify(getAuctionSelectionPricing(previous, item, selection)) !==\n JSON.stringify(getAuctionSelectionPricing(current, nextItem, selection))\n );\n}\n\nexport function auctionExpectedPricing(pricing: LockerverseAuctionPricing) {\n return {\n expectedAdditionalChargeCents: pricing.additionalChargeCents ?? 0,\n expectedServiceFeeCents: pricing.serviceFeeCents,\n expectedSubtotalCents: pricing.subtotalCents,\n expectedTotalCents: pricing.totalCents,\n };\n}\n\nexport async function createAuctionConfirmationToken({\n stripe,\n elements,\n email,\n phone,\n billing,\n shipping,\n collectShippingAddress,\n}: {\n stripe: Stripe;\n elements: StripeElements;\n email: string;\n phone: string;\n billing: StripeAddressElementChangeEvent | null;\n shipping: StripeAddressElementChangeEvent | null;\n collectShippingAddress: boolean;\n}) {\n if (!(billing?.complete && billing.value.name.trim())) {\n throw new Error(\"Complete your billing name and address.\");\n }\n if (\n collectShippingAddress &&\n !(shipping?.complete && shipping.value.name.trim())\n ) {\n throw new Error(\"Complete your shipping name and address.\");\n }\n const submitted = await elements.submit();\n if (submitted.error) {\n throw new Error(submitted.error.message ?? \"Check your payment details.\");\n }\n const result = await stripe.createConfirmationToken({\n elements,\n params: {\n payment_method_data: {\n allow_redisplay: \"always\",\n billing_details: {\n address: billing.value.address,\n email,\n name: billing.value.name,\n phone,\n },\n },\n return_url: window.location.href,\n ...(collectShippingAddress && shipping\n ? {\n shipping: {\n address: shipping.value.address,\n name: shipping.value.name,\n phone,\n },\n }\n : undefined),\n },\n });\n if (result.error || !result.confirmationToken) {\n throw new Error(\n result.error?.message ?? \"Unable to prepare payment details.\"\n );\n }\n return result.confirmationToken.id;\n}\n\nexport async function completeAuctionAction(\n stripe: Stripe,\n result: LockerverseAuctionBidResult\n) {\n if (!result.requiresAction) {\n return;\n }\n if (!result.clientSecret) {\n throw new Error(\n \"Payment confirmation is incomplete. Check its status before trying again.\"\n );\n }\n const action = await stripe.handleNextAction({\n clientSecret: result.clientSecret,\n });\n if (action.error) {\n throw new Error(\n action.error.message ?? \"Payment confirmation is incomplete.\"\n );\n }\n}\n"],"mappings":"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"}
@@ -1,16 +1,23 @@
1
1
  import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
2
+ import { LockerverseAuctionAdditionalCharge } from "@lockerverse/sdk/auctions";
2
3
  //#region src/auction-result.d.ts
3
4
  type AuctionPurchaseDetails = {
4
5
  purchaseId: string;
5
6
  unitAmountCents: number;
6
7
  quantity: number;
7
8
  subtotalCents: number;
9
+ additionalChargeCents?: number;
10
+ additionalCharge?: LockerverseAuctionAdditionalCharge | null;
8
11
  serviceFeeCents: number;
9
12
  totalCents: number;
10
13
  };
11
14
  type LockerverseAuctionOutcome = {
12
15
  kind: "bid";
13
16
  amountCents?: number;
17
+ additionalCharge?: LockerverseAuctionAdditionalCharge | null;
18
+ additionalChargeCents?: number;
19
+ totalCents?: number;
20
+ serviceFeeCents?: number;
14
21
  } | (AuctionPurchaseDetails & {
15
22
  kind: "purchase";
16
23
  /** Use only after the server confirms payment. Receipt amounts alone are not proof. */
@@ -1 +1 @@
1
- {"version":3,"file":"auction-result.d.ts","names":[],"sources":["../src/auction-result.tsx"],"mappings":";;KAYK;EACH;EACA;EACA;EACA;EACA;EACA;;KAGU;EACN;EAAa;KACd;EACC;;EAEA;MAED;EAA2B;;KAEpB;EACV;EACA;EACA;;KAGU;EACV,SAAS;EACT;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB,kBAAkB;EAClB;EACA,QAAQ;EACR,QAAQ;;EAER;;;iBAwHc,yBAAyB,OAAO,gDAA6B,IAAA"}
1
+ {"version":3,"file":"auction-result.d.ts","names":[],"sources":["../src/auction-result.tsx"],"mappings":";;;KAaK;EACH;EACA;EACA;EACA;EACA;EACA,mBAAmB;EACnB;EACA;;KAGU;EAEN;EACA;EACA,mBAAmB;EACnB;EACA;EACA;KAED;EACC;;EAEA;MAED;EAA2B;;KAEpB;EACV;EACA;EACA;;KAGU;EACV,SAAS;EACT;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB,kBAAkB;EAClB;EACA,QAAQ;EACR,QAAQ;;EAER;;;iBAkJc,yBAAyB,OAAO,gDAA6B,IAAA"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./format-money.js";import{t}from"./auction-image.js";import{ArrowRight as n,BadgeCheck as r,FileText as i,ShieldCheck as a,TimerReset as o}from"lucide-react";import{useEffect as s,useId as c,useRef as l}from"react";import{Fragment as u,jsx as d,jsxs as f}from"react/jsx-runtime";function p({action:e,secondary:t=!1}){let r=`lockerverse-auction-result__action${t?` lockerverse-auction-result__action--secondary`:``}`,i=f(u,{children:[e.label,t?null:d(n,{"aria-hidden":`true`,size:18})]});return e.href?d(`a`,{className:r,href:e.href,onClick:e.onClick,children:i}):d(`button`,{className:r,onClick:e.onClick,type:`button`,children:i})}const m={bid:{assurance:`A bid is not a purchase. Payment is collected only if you win at settlement.`,assuranceTitle:`Bid authorization saved`,badge:`Bid submitted`,description:`Your bid and payment method are recorded. You have not been charged for this bid.`,next:`Other bidders can still place bids until the item closes.`,nextTitle:`Follow the auction`,receiptLabel:`Bid summary`,steps:[`Your bid is recorded. This does not confirm that you have won.`,`Your saved payment method can be charged if you win at settlement.`,`Watch your email for bid updates and return to the item to check its status.`],title:`Bid received`},purchase:{assurance:`This receipt shows the amount paid for your purchase.`,assuranceTitle:`Payment processed`,badge:`Purchase confirmed`,description:`Your payment is confirmed and your purchase is recorded.`,next:`The community handles delivery or collection for this item.`,nextTitle:`Next steps`,receiptLabel:`Purchase receipt`,steps:[`Your payment is complete and your purchase is recorded.`,`The community can review your buyer and delivery details.`,`Keep your receipt number. Contact the community if you need help with your order.`],title:`Purchase complete`},receipt:{assurance:`The amounts below are the recorded purchase amounts, not proof of payment.`,assuranceTitle:`Recorded purchase`,badge:`Purchase details`,description:`Payment status is not confirmed on this page.`,next:`Contact the community if you need to confirm your payment or order status.`,nextTitle:`Next steps`,receiptLabel:`Purchase receipt`,steps:[`These are the recorded purchase details. They do not confirm payment.`,`Check your purchase confirmation for the payment result.`,`Contact the community with your receipt number if you need help.`],title:`Purchase details`}};function h({outcome:t,auctionName:n,communityName:r,closesAtLabel:i}){let a=[];return t.kind===`bid`?t.amountCents!==void 0&&a.push([`Bid amount`,e(t.amountCents)]):(a.push([`Unit price`,e(t.unitAmountCents)],[`Quantity`,String(t.quantity)],[`Subtotal`,e(t.subtotalCents)]),t.serviceFeeCents>0&&a.push([`Service fee`,e(t.serviceFeeCents)]),a.push([t.kind===`purchase`?`Total paid`:`Total`,e(t.totalCents)],[`Receipt`,t.purchaseId])),n&&a.push([`Auction`,n]),r&&a.push([`Community`,r]),i&&a.push([`Closes`,i]),a}function g(e){let{outcome:n,itemName:u,imageUrl:g,communityName:_,primaryAction:v,secondaryAction:y,className:b,theme:x=`dark`,style:S}=e,C=c(),w=l(null);s(()=>{e.focusHeading&&w.current?.focus()},[e.focusHeading]);let T=m[n.kind],E=n.kind===`receipt`?i:r,D=n.kind===`receipt`?i:a,O=h(e);return d(`section`,{"aria-labelledby":C,className:[`lockerverse-auctions lockerverse-auction-result`,b].filter(Boolean).join(` `),"data-lockerverse-theme":x,style:S,children:f(`div`,{className:`lockerverse-auction-result__layout`,children:[f(`div`,{className:`lockerverse-auction-result__summary`,children:[f(`span`,{className:`lockerverse-auction-result__badge`,children:[d(E,{"aria-hidden":`true`,size:18}),T.badge]}),_?d(`p`,{className:`lockerverse-auction-result__community`,children:_}):null,f(`h2`,{className:`lockerverse-auction-result__title`,id:C,ref:w,tabIndex:e.focusHeading?-1:void 0,children:[T.title,` for `,u,`.`]}),d(`p`,{className:`lockerverse-auction-result__description`,children:T.description}),f(`div`,{className:`lockerverse-auction-result__assurance`,children:[d(D,{"aria-hidden":`true`,size:22}),f(`div`,{children:[d(`strong`,{children:T.assuranceTitle}),d(`p`,{children:T.assurance})]})]}),f(`div`,{className:`lockerverse-auction-result__assurance`,children:[d(o,{"aria-hidden":`true`,size:22}),f(`div`,{children:[d(`strong`,{children:T.nextTitle}),d(`p`,{children:T.next})]})]}),v||y?f(`div`,{className:`lockerverse-auction-result__actions`,children:[v?d(p,{action:v}):null,y?d(p,{action:y,secondary:!0}):null]}):null]}),f(`aside`,{"aria-label":T.receiptLabel,className:`lockerverse-auction-result__receipt`,children:[g?d(t,{alt:u,className:`lockerverse-auction-result__image`,height:300,maxWidth:960,sizes:`100vw`,src:g,width:420}):null,f(`div`,{className:`lockerverse-auction-result__receipt-body`,children:[d(`p`,{className:`lockerverse-auction-result__eyebrow`,children:T.receiptLabel}),d(`h3`,{className:`lockerverse-auction-result__receipt-title`,children:u}),d(`dl`,{className:`lockerverse-auction-result__details`,children:O.map(([e,t])=>f(`div`,{children:[d(`dt`,{children:e}),d(`dd`,{children:t})]},e))}),d(`h4`,{children:`What happens next`}),d(`ol`,{className:`lockerverse-auction-result__steps`,role:`list`,children:T.steps.map((e,t)=>f(`li`,{children:[d(`span`,{"aria-hidden":`true`,className:`lockerverse-auction-result__step-number`,children:String(t+1).padStart(2,`0`)}),d(`span`,{children:e})]},e))})]})]})]})})}export{g as t};
1
+ import{t as e}from"./format-money.js";import{t}from"./auction-image.js";import{ArrowRight as n,BadgeCheck as r,FileText as i,ShieldCheck as a,TimerReset as o}from"lucide-react";import{useEffect as s,useId as c,useRef as l}from"react";import{Fragment as u,jsx as d,jsxs as f}from"react/jsx-runtime";function p({action:e,secondary:t=!1}){let r=`lockerverse-auction-result__action${t?` lockerverse-auction-result__action--secondary`:``}`,i=f(u,{children:[e.label,t?null:d(n,{"aria-hidden":`true`,size:18})]});return e.href?d(`a`,{className:r,href:e.href,onClick:e.onClick,children:i}):d(`button`,{className:r,onClick:e.onClick,type:`button`,children:i})}const m={bid:{assurance:`A bid is not a purchase. Payment is collected only if you win at settlement.`,assuranceTitle:`Bid authorization saved`,badge:`Bid submitted`,description:`Your bid and payment method are recorded. You have not been charged for this bid.`,next:`Other bidders can still place bids until the item closes.`,nextTitle:`Follow the auction`,receiptLabel:`Bid summary`,steps:[`Your bid is recorded. This does not confirm that you have won.`,`Your saved payment method can be charged if you win at settlement.`,`Watch your email for bid updates and return to the item to check its status.`],title:`Bid received`},purchase:{assurance:`This receipt shows the amount paid for your purchase.`,assuranceTitle:`Payment processed`,badge:`Purchase confirmed`,description:`Your payment is confirmed and your purchase is recorded.`,next:`The community handles delivery or collection for this item.`,nextTitle:`Next steps`,receiptLabel:`Purchase receipt`,steps:[`Your payment is complete and your purchase is recorded.`,`The community can review your buyer and delivery details.`,`Keep your receipt number. Contact the community if you need help with your order.`],title:`Purchase complete`},receipt:{assurance:`The amounts below are the recorded purchase amounts, not proof of payment.`,assuranceTitle:`Recorded purchase`,badge:`Purchase details`,description:`Payment status is not confirmed on this page.`,next:`Contact the community if you need to confirm your payment or order status.`,nextTitle:`Next steps`,receiptLabel:`Purchase receipt`,steps:[`These are the recorded purchase details. They do not confirm payment.`,`Check your purchase confirmation for the payment result.`,`Contact the community with your receipt number if you need help.`],title:`Purchase details`}};function h(t){let n=[];return t.amountCents!==void 0&&n.push([`Bid amount`,e(t.amountCents)]),t.additionalCharge&&(n.push([t.additionalCharge.name,e(t.additionalChargeCents??0)]),(t.serviceFeeCents??0)>0&&n.push([`Service fee`,e(t.serviceFeeCents??0)]),t.totalCents!==void 0&&n.push([`Total if I win`,e(t.totalCents)])),n}function g({outcome:t,auctionName:n,communityName:r,closesAtLabel:i}){let a=[];return t.kind===`bid`?a.push(...h(t)):(a.push([`Unit price`,e(t.unitAmountCents)],[`Quantity`,String(t.quantity)],[`Subtotal`,e(t.subtotalCents)]),t.additionalCharge&&a.push([t.additionalCharge.name,e(t.additionalChargeCents??0)]),t.serviceFeeCents>0&&a.push([`Service fee`,e(t.serviceFeeCents)]),a.push([t.kind===`purchase`?`Total paid`:`Total`,e(t.totalCents)],[`Receipt`,t.purchaseId])),n&&a.push([`Auction`,n]),r&&a.push([`Community`,r]),i&&a.push([`Closes`,i]),a}function _(e){let{outcome:n,itemName:u,imageUrl:h,communityName:_,primaryAction:v,secondaryAction:y,className:b,theme:x=`dark`,style:S}=e,C=c(),w=l(null);s(()=>{e.focusHeading&&w.current?.focus()},[e.focusHeading]);let T=m[n.kind],E=n.kind===`receipt`?i:r,D=n.kind===`receipt`?i:a,O=g(e);return d(`section`,{"aria-labelledby":C,className:[`lockerverse-auctions lockerverse-auction-result`,b].filter(Boolean).join(` `),"data-lockerverse-theme":x,style:S,children:f(`div`,{className:`lockerverse-auction-result__layout`,children:[f(`div`,{className:`lockerverse-auction-result__summary`,children:[f(`span`,{className:`lockerverse-auction-result__badge`,children:[d(E,{"aria-hidden":`true`,size:18}),T.badge]}),_?d(`p`,{className:`lockerverse-auction-result__community`,children:_}):null,f(`h2`,{className:`lockerverse-auction-result__title`,id:C,ref:w,tabIndex:e.focusHeading?-1:void 0,children:[T.title,` for `,u,`.`]}),d(`p`,{className:`lockerverse-auction-result__description`,children:T.description}),f(`div`,{className:`lockerverse-auction-result__assurance`,children:[d(D,{"aria-hidden":`true`,size:22}),f(`div`,{children:[d(`strong`,{children:T.assuranceTitle}),d(`p`,{children:T.assurance})]})]}),f(`div`,{className:`lockerverse-auction-result__assurance`,children:[d(o,{"aria-hidden":`true`,size:22}),f(`div`,{children:[d(`strong`,{children:T.nextTitle}),d(`p`,{children:T.next})]})]}),v||y?f(`div`,{className:`lockerverse-auction-result__actions`,children:[v?d(p,{action:v}):null,y?d(p,{action:y,secondary:!0}):null]}):null]}),f(`aside`,{"aria-label":T.receiptLabel,className:`lockerverse-auction-result__receipt`,children:[h?d(t,{alt:u,className:`lockerverse-auction-result__image`,height:300,maxWidth:960,sizes:`100vw`,src:h,width:420}):null,f(`div`,{className:`lockerverse-auction-result__receipt-body`,children:[d(`p`,{className:`lockerverse-auction-result__eyebrow`,children:T.receiptLabel}),d(`h3`,{className:`lockerverse-auction-result__receipt-title`,children:u}),d(`dl`,{className:`lockerverse-auction-result__details`,children:O.map(([e,t])=>f(`div`,{children:[d(`dt`,{children:e}),d(`dd`,{children:t})]},e))}),d(`h4`,{children:`What happens next`}),d(`ol`,{className:`lockerverse-auction-result__steps`,role:`list`,children:T.steps.map((e,t)=>f(`li`,{children:[d(`span`,{"aria-hidden":`true`,className:`lockerverse-auction-result__step-number`,children:String(t+1).padStart(2,`0`)}),d(`span`,{children:e})]},e))})]})]})]})})}export{_ as t};
2
2
  //# sourceMappingURL=auction-result2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auction-result2.js","names":[],"sources":["../src/auction-result.tsx"],"sourcesContent":["import {\n ArrowRight,\n BadgeCheck,\n FileText,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useEffect, useId, useRef } from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { formatMoney } from \"./format-money.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\n\ntype AuctionPurchaseDetails = {\n purchaseId: string;\n unitAmountCents: number;\n quantity: number;\n subtotalCents: number;\n serviceFeeCents: number;\n totalCents: number;\n};\n\nexport type LockerverseAuctionOutcome =\n | { kind: \"bid\"; amountCents?: number }\n | (AuctionPurchaseDetails & {\n kind: \"purchase\";\n /** Use only after the server confirms payment. Receipt amounts alone are not proof. */\n status: \"paid\";\n })\n | (AuctionPurchaseDetails & { kind: \"receipt\" });\n\nexport type LockerverseAuctionResultAction = {\n label: string;\n href?: string;\n onClick?: () => void;\n};\n\nexport type LockerverseAuctionResultProps = {\n outcome: LockerverseAuctionOutcome;\n itemName: string;\n imageUrl?: string | undefined;\n auctionName?: string | undefined;\n communityName?: string | undefined;\n closesAtLabel?: string | undefined;\n primaryAction?: LockerverseAuctionResultAction | undefined;\n secondaryAction?: LockerverseAuctionResultAction | undefined;\n className?: string | undefined;\n theme?: LockerverseTheme | undefined;\n style?: LockerverseStyle | undefined;\n /** Focus the result after an inline checkout completes. Defaults to false. */\n focusHeading?: boolean | undefined;\n};\n\nfunction ResultAction({\n action,\n secondary = false,\n}: {\n action: LockerverseAuctionResultAction;\n secondary?: boolean;\n}) {\n const className = `lockerverse-auction-result__action${secondary ? \" lockerverse-auction-result__action--secondary\" : \"\"}`;\n const content = (\n <>\n {action.label}\n {secondary ? null : <ArrowRight aria-hidden=\"true\" size={18} />}\n </>\n );\n return action.href ? (\n <a className={className} href={action.href} onClick={action.onClick}>\n {content}\n </a>\n ) : (\n <button className={className} onClick={action.onClick} type=\"button\">\n {content}\n </button>\n );\n}\n\nconst outcomeCopy = {\n bid: {\n assurance:\n \"A bid is not a purchase. Payment is collected only if you win at settlement.\",\n assuranceTitle: \"Bid authorization saved\",\n badge: \"Bid submitted\",\n description:\n \"Your bid and payment method are recorded. You have not been charged for this bid.\",\n next: \"Other bidders can still place bids until the item closes.\",\n nextTitle: \"Follow the auction\",\n receiptLabel: \"Bid summary\",\n steps: [\n \"Your bid is recorded. This does not confirm that you have won.\",\n \"Your saved payment method can be charged if you win at settlement.\",\n \"Watch your email for bid updates and return to the item to check its status.\",\n ],\n title: \"Bid received\",\n },\n purchase: {\n assurance: \"This receipt shows the amount paid for your purchase.\",\n assuranceTitle: \"Payment processed\",\n badge: \"Purchase confirmed\",\n description: \"Your payment is confirmed and your purchase is recorded.\",\n next: \"The community handles delivery or collection for this item.\",\n nextTitle: \"Next steps\",\n receiptLabel: \"Purchase receipt\",\n steps: [\n \"Your payment is complete and your purchase is recorded.\",\n \"The community can review your buyer and delivery details.\",\n \"Keep your receipt number. Contact the community if you need help with your order.\",\n ],\n title: \"Purchase complete\",\n },\n receipt: {\n assurance:\n \"The amounts below are the recorded purchase amounts, not proof of payment.\",\n assuranceTitle: \"Recorded purchase\",\n badge: \"Purchase details\",\n description: \"Payment status is not confirmed on this page.\",\n next: \"Contact the community if you need to confirm your payment or order status.\",\n nextTitle: \"Next steps\",\n receiptLabel: \"Purchase receipt\",\n steps: [\n \"These are the recorded purchase details. They do not confirm payment.\",\n \"Check your purchase confirmation for the payment result.\",\n \"Contact the community with your receipt number if you need help.\",\n ],\n title: \"Purchase details\",\n },\n};\n\nfunction getResultDetails({\n outcome,\n auctionName,\n communityName,\n closesAtLabel,\n}: LockerverseAuctionResultProps) {\n const details: [string, string][] = [];\n if (outcome.kind === \"bid\") {\n if (outcome.amountCents !== undefined) {\n details.push([\"Bid amount\", formatMoney(outcome.amountCents)]);\n }\n } else {\n details.push(\n [\"Unit price\", formatMoney(outcome.unitAmountCents)],\n [\"Quantity\", String(outcome.quantity)],\n [\"Subtotal\", formatMoney(outcome.subtotalCents)]\n );\n if (outcome.serviceFeeCents > 0) {\n details.push([\"Service fee\", formatMoney(outcome.serviceFeeCents)]);\n }\n details.push(\n [\n outcome.kind === \"purchase\" ? \"Total paid\" : \"Total\",\n formatMoney(outcome.totalCents),\n ],\n [\"Receipt\", outcome.purchaseId]\n );\n }\n if (auctionName) {\n details.push([\"Auction\", auctionName]);\n }\n if (communityName) {\n details.push([\"Community\", communityName]);\n }\n if (closesAtLabel) {\n details.push([\"Closes\", closesAtLabel]);\n }\n return details;\n}\n\n/** Shared result view. Hosts must provide a verified outcome or a neutral receipt. */\nexport function LockerverseAuctionResult(props: LockerverseAuctionResultProps) {\n const {\n outcome,\n itemName,\n imageUrl,\n communityName,\n primaryAction,\n secondaryAction,\n className,\n theme = \"dark\",\n style,\n } = props;\n const titleId = useId();\n const headingRef = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (props.focusHeading) {\n headingRef.current?.focus();\n }\n }, [props.focusHeading]);\n const copy = outcomeCopy[outcome.kind];\n const StatusIcon = outcome.kind === \"receipt\" ? FileText : BadgeCheck;\n const AssuranceIcon = outcome.kind === \"receipt\" ? FileText : ShieldCheck;\n const details = getResultDetails(props);\n return (\n <section\n aria-labelledby={titleId}\n className={[\"lockerverse-auctions lockerverse-auction-result\", className]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <div className=\"lockerverse-auction-result__layout\">\n <div className=\"lockerverse-auction-result__summary\">\n <span className=\"lockerverse-auction-result__badge\">\n <StatusIcon aria-hidden=\"true\" size={18} />\n {copy.badge}\n </span>\n {communityName ? (\n <p className=\"lockerverse-auction-result__community\">\n {communityName}\n </p>\n ) : null}\n <h2\n className=\"lockerverse-auction-result__title\"\n id={titleId}\n ref={headingRef}\n tabIndex={props.focusHeading ? -1 : undefined}\n >\n {copy.title} for {itemName}.\n </h2>\n <p className=\"lockerverse-auction-result__description\">\n {copy.description}\n </p>\n <div className=\"lockerverse-auction-result__assurance\">\n <AssuranceIcon aria-hidden=\"true\" size={22} />\n <div>\n <strong>{copy.assuranceTitle}</strong>\n <p>{copy.assurance}</p>\n </div>\n </div>\n <div className=\"lockerverse-auction-result__assurance\">\n <TimerReset aria-hidden=\"true\" size={22} />\n <div>\n <strong>{copy.nextTitle}</strong>\n <p>{copy.next}</p>\n </div>\n </div>\n {primaryAction || secondaryAction ? (\n <div className=\"lockerverse-auction-result__actions\">\n {primaryAction ? <ResultAction action={primaryAction} /> : null}\n {secondaryAction ? (\n <ResultAction action={secondaryAction} secondary />\n ) : null}\n </div>\n ) : null}\n </div>\n <aside\n aria-label={copy.receiptLabel}\n className=\"lockerverse-auction-result__receipt\"\n >\n {imageUrl ? (\n <AuctionImage\n alt={itemName}\n className=\"lockerverse-auction-result__image\"\n height={300}\n maxWidth={960}\n sizes=\"100vw\"\n src={imageUrl}\n width={420}\n />\n ) : null}\n <div className=\"lockerverse-auction-result__receipt-body\">\n <p className=\"lockerverse-auction-result__eyebrow\">\n {copy.receiptLabel}\n </p>\n <h3 className=\"lockerverse-auction-result__receipt-title\">\n {itemName}\n </h3>\n <dl className=\"lockerverse-auction-result__details\">\n {details.map(([label, value]) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n <h4>What happens next</h4>\n {/* biome-ignore lint/a11y/noRedundantRoles: Keep list semantics in Safari when visual markers replace list-style. */}\n <ol className=\"lockerverse-auction-result__steps\" role=\"list\">\n {copy.steps.map((step, index) => (\n <li key={step}>\n <span\n aria-hidden=\"true\"\n className=\"lockerverse-auction-result__step-number\"\n >\n {String(index + 1).padStart(2, \"0\")}\n </span>\n <span>{step}</span>\n </li>\n ))}\n </ol>\n </div>\n </aside>\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auction-result2.js","names":[],"sources":["../src/auction-result.tsx"],"sourcesContent":["import type { LockerverseAuctionAdditionalCharge } from \"@lockerverse/sdk/auctions\";\nimport {\n ArrowRight,\n BadgeCheck,\n FileText,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useEffect, useId, useRef } from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { formatMoney } from \"./format-money.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\n\ntype AuctionPurchaseDetails = {\n purchaseId: string;\n unitAmountCents: number;\n quantity: number;\n subtotalCents: number;\n additionalChargeCents?: number;\n additionalCharge?: LockerverseAuctionAdditionalCharge | null;\n serviceFeeCents: number;\n totalCents: number;\n};\n\nexport type LockerverseAuctionOutcome =\n | {\n kind: \"bid\";\n amountCents?: number;\n additionalCharge?: LockerverseAuctionAdditionalCharge | null;\n additionalChargeCents?: number;\n totalCents?: number;\n serviceFeeCents?: number;\n }\n | (AuctionPurchaseDetails & {\n kind: \"purchase\";\n /** Use only after the server confirms payment. Receipt amounts alone are not proof. */\n status: \"paid\";\n })\n | (AuctionPurchaseDetails & { kind: \"receipt\" });\n\nexport type LockerverseAuctionResultAction = {\n label: string;\n href?: string;\n onClick?: () => void;\n};\n\nexport type LockerverseAuctionResultProps = {\n outcome: LockerverseAuctionOutcome;\n itemName: string;\n imageUrl?: string | undefined;\n auctionName?: string | undefined;\n communityName?: string | undefined;\n closesAtLabel?: string | undefined;\n primaryAction?: LockerverseAuctionResultAction | undefined;\n secondaryAction?: LockerverseAuctionResultAction | undefined;\n className?: string | undefined;\n theme?: LockerverseTheme | undefined;\n style?: LockerverseStyle | undefined;\n /** Focus the result after an inline checkout completes. Defaults to false. */\n focusHeading?: boolean | undefined;\n};\n\nfunction ResultAction({\n action,\n secondary = false,\n}: {\n action: LockerverseAuctionResultAction;\n secondary?: boolean;\n}) {\n const className = `lockerverse-auction-result__action${secondary ? \" lockerverse-auction-result__action--secondary\" : \"\"}`;\n const content = (\n <>\n {action.label}\n {secondary ? null : <ArrowRight aria-hidden=\"true\" size={18} />}\n </>\n );\n return action.href ? (\n <a className={className} href={action.href} onClick={action.onClick}>\n {content}\n </a>\n ) : (\n <button className={className} onClick={action.onClick} type=\"button\">\n {content}\n </button>\n );\n}\n\nconst outcomeCopy = {\n bid: {\n assurance:\n \"A bid is not a purchase. Payment is collected only if you win at settlement.\",\n assuranceTitle: \"Bid authorization saved\",\n badge: \"Bid submitted\",\n description:\n \"Your bid and payment method are recorded. You have not been charged for this bid.\",\n next: \"Other bidders can still place bids until the item closes.\",\n nextTitle: \"Follow the auction\",\n receiptLabel: \"Bid summary\",\n steps: [\n \"Your bid is recorded. This does not confirm that you have won.\",\n \"Your saved payment method can be charged if you win at settlement.\",\n \"Watch your email for bid updates and return to the item to check its status.\",\n ],\n title: \"Bid received\",\n },\n purchase: {\n assurance: \"This receipt shows the amount paid for your purchase.\",\n assuranceTitle: \"Payment processed\",\n badge: \"Purchase confirmed\",\n description: \"Your payment is confirmed and your purchase is recorded.\",\n next: \"The community handles delivery or collection for this item.\",\n nextTitle: \"Next steps\",\n receiptLabel: \"Purchase receipt\",\n steps: [\n \"Your payment is complete and your purchase is recorded.\",\n \"The community can review your buyer and delivery details.\",\n \"Keep your receipt number. Contact the community if you need help with your order.\",\n ],\n title: \"Purchase complete\",\n },\n receipt: {\n assurance:\n \"The amounts below are the recorded purchase amounts, not proof of payment.\",\n assuranceTitle: \"Recorded purchase\",\n badge: \"Purchase details\",\n description: \"Payment status is not confirmed on this page.\",\n next: \"Contact the community if you need to confirm your payment or order status.\",\n nextTitle: \"Next steps\",\n receiptLabel: \"Purchase receipt\",\n steps: [\n \"These are the recorded purchase details. They do not confirm payment.\",\n \"Check your purchase confirmation for the payment result.\",\n \"Contact the community with your receipt number if you need help.\",\n ],\n title: \"Purchase details\",\n },\n};\n\nfunction getBidDetails(\n outcome: Extract<LockerverseAuctionOutcome, { kind: \"bid\" }>\n) {\n const details: [string, string][] = [];\n if (outcome.amountCents !== undefined) {\n details.push([\"Bid amount\", formatMoney(outcome.amountCents)]);\n }\n if (outcome.additionalCharge) {\n details.push([\n outcome.additionalCharge.name,\n formatMoney(outcome.additionalChargeCents ?? 0),\n ]);\n if ((outcome.serviceFeeCents ?? 0) > 0) {\n details.push([\"Service fee\", formatMoney(outcome.serviceFeeCents ?? 0)]);\n }\n if (outcome.totalCents !== undefined) {\n details.push([\"Total if I win\", formatMoney(outcome.totalCents)]);\n }\n }\n return details;\n}\n\nfunction getResultDetails({\n outcome,\n auctionName,\n communityName,\n closesAtLabel,\n}: LockerverseAuctionResultProps) {\n const details: [string, string][] = [];\n if (outcome.kind === \"bid\") {\n details.push(...getBidDetails(outcome));\n } else {\n details.push(\n [\"Unit price\", formatMoney(outcome.unitAmountCents)],\n [\"Quantity\", String(outcome.quantity)],\n [\"Subtotal\", formatMoney(outcome.subtotalCents)]\n );\n if (outcome.additionalCharge) {\n details.push([\n outcome.additionalCharge.name,\n formatMoney(outcome.additionalChargeCents ?? 0),\n ]);\n }\n if (outcome.serviceFeeCents > 0) {\n details.push([\"Service fee\", formatMoney(outcome.serviceFeeCents)]);\n }\n details.push(\n [\n outcome.kind === \"purchase\" ? \"Total paid\" : \"Total\",\n formatMoney(outcome.totalCents),\n ],\n [\"Receipt\", outcome.purchaseId]\n );\n }\n if (auctionName) {\n details.push([\"Auction\", auctionName]);\n }\n if (communityName) {\n details.push([\"Community\", communityName]);\n }\n if (closesAtLabel) {\n details.push([\"Closes\", closesAtLabel]);\n }\n return details;\n}\n\n/** Shared result view. Hosts must provide a verified outcome or a neutral receipt. */\nexport function LockerverseAuctionResult(props: LockerverseAuctionResultProps) {\n const {\n outcome,\n itemName,\n imageUrl,\n communityName,\n primaryAction,\n secondaryAction,\n className,\n theme = \"dark\",\n style,\n } = props;\n const titleId = useId();\n const headingRef = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n if (props.focusHeading) {\n headingRef.current?.focus();\n }\n }, [props.focusHeading]);\n const copy = outcomeCopy[outcome.kind];\n const StatusIcon = outcome.kind === \"receipt\" ? FileText : BadgeCheck;\n const AssuranceIcon = outcome.kind === \"receipt\" ? FileText : ShieldCheck;\n const details = getResultDetails(props);\n return (\n <section\n aria-labelledby={titleId}\n className={[\"lockerverse-auctions lockerverse-auction-result\", className]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <div className=\"lockerverse-auction-result__layout\">\n <div className=\"lockerverse-auction-result__summary\">\n <span className=\"lockerverse-auction-result__badge\">\n <StatusIcon aria-hidden=\"true\" size={18} />\n {copy.badge}\n </span>\n {communityName ? (\n <p className=\"lockerverse-auction-result__community\">\n {communityName}\n </p>\n ) : null}\n <h2\n className=\"lockerverse-auction-result__title\"\n id={titleId}\n ref={headingRef}\n tabIndex={props.focusHeading ? -1 : undefined}\n >\n {copy.title} for {itemName}.\n </h2>\n <p className=\"lockerverse-auction-result__description\">\n {copy.description}\n </p>\n <div className=\"lockerverse-auction-result__assurance\">\n <AssuranceIcon aria-hidden=\"true\" size={22} />\n <div>\n <strong>{copy.assuranceTitle}</strong>\n <p>{copy.assurance}</p>\n </div>\n </div>\n <div className=\"lockerverse-auction-result__assurance\">\n <TimerReset aria-hidden=\"true\" size={22} />\n <div>\n <strong>{copy.nextTitle}</strong>\n <p>{copy.next}</p>\n </div>\n </div>\n {primaryAction || secondaryAction ? (\n <div className=\"lockerverse-auction-result__actions\">\n {primaryAction ? <ResultAction action={primaryAction} /> : null}\n {secondaryAction ? (\n <ResultAction action={secondaryAction} secondary />\n ) : null}\n </div>\n ) : null}\n </div>\n <aside\n aria-label={copy.receiptLabel}\n className=\"lockerverse-auction-result__receipt\"\n >\n {imageUrl ? (\n <AuctionImage\n alt={itemName}\n className=\"lockerverse-auction-result__image\"\n height={300}\n maxWidth={960}\n sizes=\"100vw\"\n src={imageUrl}\n width={420}\n />\n ) : null}\n <div className=\"lockerverse-auction-result__receipt-body\">\n <p className=\"lockerverse-auction-result__eyebrow\">\n {copy.receiptLabel}\n </p>\n <h3 className=\"lockerverse-auction-result__receipt-title\">\n {itemName}\n </h3>\n <dl className=\"lockerverse-auction-result__details\">\n {details.map(([label, value]) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n <h4>What happens next</h4>\n {/* biome-ignore lint/a11y/noRedundantRoles: Keep list semantics in Safari when visual markers replace list-style. */}\n <ol className=\"lockerverse-auction-result__steps\" role=\"list\">\n {copy.steps.map((step, index) => (\n <li key={step}>\n <span\n aria-hidden=\"true\"\n className=\"lockerverse-auction-result__step-number\"\n >\n {String(index + 1).padStart(2, \"0\")}\n </span>\n <span>{step}</span>\n </li>\n ))}\n </ol>\n </div>\n </aside>\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
package/dist/theme.d.ts CHANGED
@@ -12,6 +12,8 @@ type LockerverseStyle = CSSProperties & {
12
12
  "--lockerverse-font-family"?: string;
13
13
  "--lockerverse-font-size"?: string;
14
14
  "--lockerverse-auction-heading-size"?: string;
15
+ /** Catalog columns above 720px; mobile remains one column. */
16
+ "--lockerverse-auction-catalog-columns"?: string;
15
17
  "--lockerverse-auction-subheading-size"?: string;
16
18
  "--lockerverse-auction-title-size"?: string;
17
19
  "--lockerverse-auction-card-title-size"?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","names":[],"sources":["../src/theme.ts"],"mappings":";;KAEY;KAEA,mBAAmB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA"}
1
+ {"version":3,"file":"theme.d.ts","names":[],"sources":["../src/theme.ts"],"mappings":";;KAEY;KAEA,mBAAmB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA"}
@@ -1,6 +1,6 @@
1
1
  # Lockerverse auctions guide
2
2
 
3
- Package: @lockerverse/react@0.2.190-dev.1
3
+ Package: @lockerverse/react@0.2.191
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
@@ -109,6 +109,28 @@ import "@lockerverse/react/auction.css";
109
109
 
110
110
  `showFilters` and `showHeader` default to `true`. `showLineup` defaults to `false`, so the static introduction and separate count are hidden. These options also work on `LockerverseAuctions`. The auction header omits the auction date range; item dates remain on item cards. Hiding filters shows all items and clears the previous filter. Changing the auction resets its filter. Hiding headings never removes the section's accessible name. `onBack` is optional, so a dedicated auction page does not need a link to all auctions.
111
111
 
112
+ ### Additional charges and order limits
113
+
114
+ An auction or Buy Now item can have one optional `additionalCharge`: a customer-facing `name`,
115
+ `category` (`shipping`, `handling`, or `other`), `firstUnitAmountCents`, and
116
+ `additionalUnitAmountCents`. The charge is the first-unit amount plus the
117
+ additional-unit amount for each further unit. The built-in item selection,
118
+ checkout, and receipt display the configured name and charge. Checkout verifies
119
+ the server quote before payment and returns changed totals for review.
120
+
121
+ Bids use one unit. The first-unit charge is added to the winning bid at settlement;
122
+ bid minimums and increments exclude the charge. The charge is shown before
123
+ authorization and saved with the bid.
124
+
125
+ `maxQuantityPerOrder` limits each purchase. Null `inventoryQuantity` means
126
+ unlimited stock. The charge category does not control address collection; set
127
+ `collectShippingAddress` separately when an address is required. Existing items
128
+ without a charge keep their current behavior.
129
+
130
+ To keep a wide catalog at two columns, set
131
+ `style={{ "--lockerverse-auction-catalog-columns": "2" }}`. This override applies
132
+ at container widths of 720px or more; narrower catalogs retain one column.
133
+
112
134
  ### Direct loading and refresh
113
135
 
114
136
  ```tsx
package/guides/events.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lockerverse events guide
2
2
 
3
- Package: @lockerverse/react@0.2.190-dev.1
3
+ Package: @lockerverse/react@0.2.191
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Lockerverse integration guide
2
2
 
3
- Package: @lockerverse/react@0.2.190-dev.1
3
+ Package: @lockerverse/react@0.2.191
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Lockerverse payment-widgets guide
2
2
 
3
- Package: @lockerverse/react@0.2.190-dev.1
3
+ Package: @lockerverse/react@0.2.191
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
package/guides/signup.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lockerverse signup guide
2
2
 
3
- Package: @lockerverse/react@0.2.190-dev.1
3
+ Package: @lockerverse/react@0.2.191
4
4
 
5
5
  Generated from this release's maintained documentation. Do not edit this copy.
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/react",
3
- "version": "0.2.190-dev.1",
3
+ "version": "0.2.191",
4
4
  "description": "Tree-shakable React payment and signup UI for Lockerverse",
5
5
  "repository": {
6
6
  "type": "git",
@@ -136,7 +136,7 @@
136
136
  "embla-carousel-react": "8.6.0",
137
137
  "lucide-react": "0.536.0",
138
138
  "valibot": "1.4.2",
139
- "@lockerverse/sdk": "0.2.190-dev.1"
139
+ "@lockerverse/sdk": "0.2.191"
140
140
  },
141
141
  "devDependencies": {
142
142
  "@size-limit/file": "13.0.3",