import { CustomerPortalAffiliateSummaryWire, CustomerPortalAffiliateCreateLinkWire, CustomerPortalAffiliateStatsWire, CustomerPortalAvatarWire, CustomerPortalDashboardWire, CustomerPortalProfileUpdateWire, CustomerPortalEmailPreferencesWire, CustomerPortalEmailPreferencesUpdateWire, CustomerPortalNotificationPreferencesWire, CustomerPortalOrderReviewWire, CustomerReplacementEligibilityWire, CustomerReplacementRequestWire, CustomerPortalLicenseResetWire, CustomerPortalLicenseRenewalWire, CustomerPortalWalletTopupQuoteWire, CustomerPortalWalletTopupResultWire, CustomerPortalSubscriptionBillingHistoryWire, CustomerPortalSubscriptionCancelWire, CustomerPortalSubscriptionStatusWire, CustomerLoyaltyWire, CustomerLoyaltyRedeemWire, CustomerWarrantyListWire, CustomerWarrantyClaimWire, CustomerPortalFavoritesWire, CustomerPortalFavoriteMutationWire, CustomerPortalSupportCreateWire, CustomerPortalSupportTicketDetailWire, CustomerResellerSummaryWire, CustomerResellerEnrollmentWire, CustomerResellerCatalogWire, CustomerResellerQuoteWire, CustomerResellerOrdersWire, CustomerResellerOrderWire, CustomerResellerWalletWire, CustomerResellerTopupWire, CustomerResellerApiKeysWire } from '@shoppex/contracts/customer-portal-wire'; /** * Browser client for a customer account hosted outside Shoppex. * * The publishable key identifies the merchant and the dashboard origin * allowlist authorizes the browser origin. OTP verification returns a separate * short-lived `hcs_` token; the SDK never exposes Shoppex's BetterAuth token. */ interface HeadlessCustomerClientConfig { /** Shop slug or Shoppex storefront domain. */ shop: string; /** Existing Headless Checkout publishable key (`pk_live_` / `pk_test_`). */ publishableKey: string; /** API origin override. Defaults to https://api.shoppex.io. */ apiBaseUrl?: string; /** Optional fetch override for tests or compatible runtimes. */ fetchImpl?: typeof fetch; /** Optional session storage override. Defaults to browser sessionStorage. */ storage?: Pick; /** Optional persistent storage override. Defaults to browser localStorage. */ persistentStorage?: Pick; } interface HeadlessCustomerSession { accessToken: string; expiresAt: string; } interface HeadlessCustomerVerifyOptions { /** Persist the customer session across browser restarts for up to 30 days. */ rememberMe?: boolean; } interface HeadlessCustomerOrdersQuery { page?: number; limit?: number; status?: string; search?: string; } interface HeadlessCustomerDownload { blob: Blob; filename: string | null; contentType: string | null; } type HeadlessCustomerDashboardDeliverable = CustomerPortalDashboardWire['deliverables'][number] & { /** Pass this value with `invoice_uniqid` to `customer.download()`. */ downloadIndex?: number | null; }; type HeadlessCustomerDashboard = Omit & { deliverables: HeadlessCustomerDashboardDeliverable[]; }; type HeadlessCustomerProfileUpdate = CustomerPortalProfileUpdateWire; type HeadlessCustomerAvatar = CustomerPortalAvatarWire; type HeadlessCustomerEmailPreferences = CustomerPortalEmailPreferencesWire; type HeadlessCustomerEmailPreferencesUpdate = CustomerPortalEmailPreferencesUpdateWire; type HeadlessCustomerNotificationPreferences = CustomerPortalNotificationPreferencesWire; type HeadlessCustomerOrderReview = CustomerPortalOrderReviewWire; type HeadlessCustomerFavorites = CustomerPortalFavoritesWire; type HeadlessCustomerFavoriteMutation = CustomerPortalFavoriteMutationWire; type HeadlessCustomerAffiliate = CustomerPortalAffiliateSummaryWire; type HeadlessCustomerAffiliateStats = CustomerPortalAffiliateStatsWire; type HeadlessCustomerAffiliateLink = CustomerPortalAffiliateCreateLinkWire; type HeadlessCustomerTicket = CustomerPortalSupportTicketDetailWire; type HeadlessCustomerTicketCreateResult = CustomerPortalSupportCreateWire; type HeadlessCustomerLicenseReset = CustomerPortalLicenseResetWire; type HeadlessCustomerLicenseRenewal = CustomerPortalLicenseRenewalWire; type HeadlessCustomerWalletTopupQuote = CustomerPortalWalletTopupQuoteWire; type HeadlessCustomerWalletTopup = CustomerPortalWalletTopupResultWire; type HeadlessCustomerSubscriptionBillingHistory = CustomerPortalSubscriptionBillingHistoryWire; type HeadlessCustomerSubscriptionCancel = CustomerPortalSubscriptionCancelWire; type HeadlessCustomerSubscriptionStatus = CustomerPortalSubscriptionStatusWire; type HeadlessCustomerLoyalty = CustomerLoyaltyWire; type HeadlessCustomerLoyaltyRedeem = CustomerLoyaltyRedeemWire; type HeadlessCustomerWarranties = CustomerWarrantyListWire; type HeadlessCustomerWarrantyClaim = CustomerWarrantyClaimWire; type HeadlessCustomerReplacementEligibility = CustomerReplacementEligibilityWire; type HeadlessCustomerReplacementRequest = CustomerReplacementRequestWire; type HeadlessCustomerReseller = CustomerResellerSummaryWire; type HeadlessCustomerResellerEnrollment = CustomerResellerEnrollmentWire; type HeadlessCustomerResellerCatalog = CustomerResellerCatalogWire; type HeadlessCustomerResellerQuote = CustomerResellerQuoteWire; type HeadlessCustomerResellerOrders = CustomerResellerOrdersWire; type HeadlessCustomerResellerOrder = CustomerResellerOrderWire; type HeadlessCustomerResellerWallet = CustomerResellerWalletWire; type HeadlessCustomerResellerApiKeys = CustomerResellerApiKeysWire; type HeadlessCustomerResellerTopup = CustomerResellerTopupWire; interface HeadlessCustomerTicketInput { title?: string; message: string; invoiceId?: string; } interface HeadlessCustomerOrderReviewInput { score: 1 | 3 | 5; message: string; } interface HeadlessCustomerAffiliateLinkInput { code: string; label: string; requestedRevenuePercent?: number | null; requestedCustomerDiscountPercent?: number | null; } interface HeadlessCustomerSubscriptionCancelOptions { cancelAtPeriodEnd?: boolean; reason?: string | null; } interface HeadlessCustomerEmailPreferencesPatch { globalUnsubscribed?: boolean; listSubscriptions?: Array<{ listId: string; subscribed: boolean; }>; } interface HeadlessCustomerNotificationPreferencesPatch { orderCreatedEmails?: boolean; orderCompletedEmails?: boolean; paymentIssueEmails?: boolean; } interface HeadlessCustomerReplacementOptions { lineItemId: string; reason: string; idempotencyKey?: string; } interface HeadlessCustomerResellerCatalogQuery { search?: string; page?: number; perPage?: number; } interface HeadlessCustomerResellerOrdersQuery { page?: number; perPage?: number; } interface HeadlessCustomerResellerOrderItem { productId: string; variantId?: string; quantity: number; } /** Public DTOs mirror the producer-owned schemas imported above. Passing each * schema into `request` makes TypeScript reject drift in required fields. */ interface HeadlessCustomerMe { customer: { id: string | null; email: string; name: string; avatar_url: string | null; joined_at: string | null; }; shop: { id: string; slug: string; name: string; currency: string; branding: { logo_url: string | null; primary_color: string; secondary_color: string; accent_color: string; }; }; } interface HeadlessCustomerOrderSummary { uniqid: string; status: string; total: string; totalDisplay: string | null; currency: string; createdAt: string; lineItems: Array<{ productTitle: string | null; quantity: number; product: { attachment_imageId: { cloudflareImageId: string | null; } | null; } | null; }>; } interface HeadlessCustomerOrders { invoices: HeadlessCustomerOrderSummary[]; pagination: { page: number; limit: number; total: number; has_more: boolean; }; } interface HeadlessCustomerPayment { gateway: string; displayName: string | null; cryptoGateway?: string | null; blockchain: string | null; cryptoAddress: string | null; apmMethod: string | null; } interface HeadlessCustomerOrder { id: string; uniqid: string; status: string; statusDetails: string | null; total: string; totalDisplay: string | null; subtotal: string; discount: string; discountDisplay: string | null; tax: string; taxPercentage: string; currency: string; createdAt: string; updatedAt: string; gatewayUpdatedAt: string | null; customFields: Record | null; balancePaidAmount: string; currentPaymentAttemptId: string | null; lineItems: Array<{ id: string; productTitle: string; productType: string; variantTitle: string | null; unitPrice: string; quantity: number; total: string; deliveryText: string | null; deliverySummary: { codes: string[]; links: Array<{ label: string; value: string; /** External URL for non-Shoppex links. Portal-only download URLs are removed. */ href?: string | null; /** Pass this value to `customer.download(orderId, downloadIndex)`. */ downloadIndex?: number | null; }>; notes: string[]; serials: Array<{ value: string; is_replacement: boolean; is_replaced: boolean; }>; } | null; deliveredAt: string | null; deliveryStatus: 'PENDING' | 'AWAITING_FULFILLMENT' | 'DELIVERED' | 'FAILED'; customFields: Record | null; product: { uniqid: string; slug: string | null; serviceText: string | null; attachment_imageId: { cloudflareImageId: string | null; } | null; } | null; }>; currentPayment: HeadlessCustomerPayment | null; payments: HeadlessCustomerPayment[]; } declare class HeadlessCustomerError extends Error { readonly status: number; readonly code?: string | null | undefined; constructor(status: number, message: string, code?: string | null | undefined); } declare class HeadlessCustomerClient { private readonly base; private readonly shop; private readonly publishableKey; private readonly fetchImpl; private readonly storage; private readonly persistentStorage; private readonly storageKey; private memorySession; constructor(config: HeadlessCustomerClientConfig); getSession(): HeadlessCustomerSession | null; clearSession(): void; private saveSession; private url; private request; private requestFile; requestOtp(email: string): Promise<{ requested: boolean; }>; verifyOtp(email: string, otp: string, options?: HeadlessCustomerVerifyOptions): Promise; me(): Promise; dashboard(): Promise; updateProfile(input: { name: string; }): Promise; updateAvatar(file: File): Promise; removeAvatar(): Promise; emailPreferences(): Promise; updateEmailPreferences(patch: HeadlessCustomerEmailPreferencesPatch): Promise; notificationPreferences(): Promise; updateNotificationPreferences(patch: HeadlessCustomerNotificationPreferencesPatch): Promise; orders(options?: HeadlessCustomerOrdersQuery): Promise; order(id: string): Promise; orderReview(orderId: string): Promise; submitOrderReview(orderId: string, input: HeadlessCustomerOrderReviewInput): Promise; invoicePdf(orderId: string): Promise; replacementEligibility(orderId: string, lineItemId?: string): Promise; requestReplacement(orderId: string, options: HeadlessCustomerReplacementOptions): Promise; download(orderId: string, fileIndex: number): Promise; resetLicenseHwid(licenseId: string): Promise; renewLicense(licenseId: string): Promise; walletTopupQuote(): Promise; createWalletTopup(amount: string): Promise; subscriptionBillingHistory(subscriptionId: string): Promise; cancelSubscription(subscriptionId: string, options?: HeadlessCustomerSubscriptionCancelOptions): Promise; pauseSubscription(subscriptionId: string): Promise; resumeSubscription(subscriptionId: string): Promise; loyalty(): Promise; redeemLoyaltyPoints(input: { points: number; idempotencyKey: string; }): Promise; warranties(invoiceId?: string): Promise; claimWarranty(warrantyId: string, message?: string): Promise; favorites(): Promise; addFavorite(productId: string): Promise; removeFavorite(productId: string): Promise; affiliate(): Promise; affiliateStats(input?: { days?: number; }): Promise; createAffiliateLink(input: HeadlessCustomerAffiliateLinkInput): Promise; createTicket(input: HeadlessCustomerTicketInput): Promise; ticket(ticketId: string): Promise; replyToTicket(ticketId: string, message: string): Promise; reseller(): Promise; applyForReseller(note?: string): Promise; enrollAsReseller(): Promise; acceptResellerInvite(token: string): Promise; resellerCatalog(options?: HeadlessCustomerResellerCatalogQuery): Promise; quoteResellerOrder(items: HeadlessCustomerResellerOrderItem[]): Promise; resellerOrders(options?: HeadlessCustomerResellerOrdersQuery): Promise; resellerOrder(orderId: string): Promise; resellerWallet(): Promise; resellerTopupQuote(): Promise; createResellerTopup(amount: string): Promise; resellerApiKeys(): Promise; logout(): Promise; } declare function createCustomerClient(config: HeadlessCustomerClientConfig): HeadlessCustomerClient; export { type HeadlessCustomerAffiliate, type HeadlessCustomerAffiliateLink, type HeadlessCustomerAffiliateLinkInput, type HeadlessCustomerAffiliateStats, type HeadlessCustomerAvatar, HeadlessCustomerClient, type HeadlessCustomerClientConfig, type HeadlessCustomerDashboard, type HeadlessCustomerDownload, type HeadlessCustomerEmailPreferences, type HeadlessCustomerEmailPreferencesPatch, type HeadlessCustomerEmailPreferencesUpdate, HeadlessCustomerError, type HeadlessCustomerFavoriteMutation, type HeadlessCustomerFavorites, type HeadlessCustomerLicenseRenewal, type HeadlessCustomerLicenseReset, type HeadlessCustomerLoyalty, type HeadlessCustomerLoyaltyRedeem, type HeadlessCustomerMe, type HeadlessCustomerNotificationPreferences, type HeadlessCustomerNotificationPreferencesPatch, type HeadlessCustomerOrder, type HeadlessCustomerOrderReview, type HeadlessCustomerOrderReviewInput, type HeadlessCustomerOrderSummary, type HeadlessCustomerOrders, type HeadlessCustomerOrdersQuery, type HeadlessCustomerPayment, type HeadlessCustomerProfileUpdate, type HeadlessCustomerReplacementEligibility, type HeadlessCustomerReplacementOptions, type HeadlessCustomerReplacementRequest, type HeadlessCustomerReseller, type HeadlessCustomerResellerApiKeys, type HeadlessCustomerResellerCatalog, type HeadlessCustomerResellerCatalogQuery, type HeadlessCustomerResellerEnrollment, type HeadlessCustomerResellerOrder, type HeadlessCustomerResellerOrderItem, type HeadlessCustomerResellerOrders, type HeadlessCustomerResellerOrdersQuery, type HeadlessCustomerResellerQuote, type HeadlessCustomerResellerTopup, type HeadlessCustomerResellerWallet, type HeadlessCustomerSession, type HeadlessCustomerSubscriptionBillingHistory, type HeadlessCustomerSubscriptionCancel, type HeadlessCustomerSubscriptionCancelOptions, type HeadlessCustomerSubscriptionStatus, type HeadlessCustomerTicket, type HeadlessCustomerTicketCreateResult, type HeadlessCustomerTicketInput, type HeadlessCustomerVerifyOptions, type HeadlessCustomerWalletTopup, type HeadlessCustomerWalletTopupQuote, type HeadlessCustomerWarranties, type HeadlessCustomerWarrantyClaim, createCustomerClient };