@doujins/payments-ui 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +945 -594
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +821 -473
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -474
- package/package.json +21 -12
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/collect.ts","../src/services/apiClient.ts","../src/services/CardPaymentService.ts","../src/services/PaymentMethodService.ts","../src/services/SolanaPaymentService.ts","../src/services/TokenCatalog.ts","../src/services/WalletGateway.ts","../src/services/SubscriptionService.ts","../src/core/PaymentApp.ts","../src/state/paymentStore.ts","../src/context/PaymentContext.tsx","../src/data/countries.ts","../src/hooks/useCountryDropdown.ts","../src/components/CardDetailsForm.tsx","../src/hooks/usePaymentMethodService.ts","../src/hooks/usePaymentMethods.ts","../src/components/StoredPaymentMethods.tsx","../src/hooks/useSolanaService.ts","../src/utils/solana/tokenUtils.ts","../src/hooks/useSolanaDirectPayment.ts","../src/components/DirectPayment.tsx","../src/hooks/useSolanaQrPayment.ts","../src/components/QRCodePayment.tsx","../src/components/PaymentStatus.tsx","../src/hooks/useSupportedTokens.ts","../src/hooks/usePaymentStore.ts","../src/state/selectors.ts","../src/components/SolanaPaymentSelector.tsx","../src/components/PaymentExperience.tsx","../src/hooks/useTokenBalance.ts","../src/hooks/useDirectWalletPayment.ts","../src/hooks/usePaymentStatus.ts","../src/hooks/useSubscriptionActions.ts"],"names":["data","country","useEffect","useMemo","useState","jsx","jsxs","CreditCard","Loader2","clsx","Dialog","Connection","useRef","useCallback","tokens","error","useWallet","X","PublicKey","hasSufficientBalance","Buffer","Transaction","useConnection"],"mappings":"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","file":"index.js","sourcesContent":["const SCRIPT_SRC = 'https://secure.networkmerchants.com/token/Collect.js'\n\nexport const loadCollectJs = (tokenizationKey: string): void => {\n if (typeof document === 'undefined') return\n const trimmed = tokenizationKey?.trim()\n if (!trimmed || trimmed.length < 10) {\n console.warn('payments-ui: invalid Collect.js key, skipping load')\n return\n }\n\n const existing = document.querySelector(`script[src=\"${SCRIPT_SRC}\"]`)\n if (existing) return\n\n const script = document.createElement('script')\n script.src = SCRIPT_SRC\n script.setAttribute('data-tokenization-key', trimmed)\n script.setAttribute('data-field-ccnumber-placeholder', '0000 0000 0000 0000')\n script.setAttribute('data-field-ccexp-placeholder', '10 / 25')\n script.setAttribute('data-field-cvv-placeholder', '123')\n script.setAttribute('data-variant', 'inline')\n script.async = true\n document.head.appendChild(script)\n}\n","import type {\n PaymentFetcher,\n PaymentConfig,\n} from '../types/config'\n\nexport type RequestOptions = {\n params?: Record<string, string | number>\n query?: Record<string, string | number | undefined>\n body?: Record<string, unknown>\n headers?: Record<string, string>\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\nexport interface ApiClient {\n request: <T>(method: HttpMethod, path: string, options?: RequestOptions) => Promise<T>\n get: <T>(path: string, options?: Omit<RequestOptions, 'body'>) => Promise<T>\n post: <T>(path: string, options?: RequestOptions) => Promise<T>\n put: <T>(path: string, options?: RequestOptions) => Promise<T>\n patch: <T>(path: string, options?: RequestOptions) => Promise<T>\n delete: <T>(path: string, options?: RequestOptions) => Promise<T>\n}\n\nconst buildUrl = (\n baseUrl: string,\n path: string,\n { params, query }: Pick<RequestOptions, 'params' | 'query'>\n): string => {\n let resolved = `${baseUrl}${path}`\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n resolved = resolved.replace(`:${key}`, encodeURIComponent(String(value)))\n })\n }\n if (query) {\n const queryString = new URLSearchParams()\n Object.entries(query).forEach(([key, value]) => {\n if (value === undefined || value === null) return\n queryString.append(key, String(value))\n })\n if ([...queryString.keys()].length > 0) {\n resolved = `${resolved}?${queryString.toString()}`\n }\n }\n return resolved\n}\n\nexport const createApiClient = (\n paymentConfig: PaymentConfig,\n baseUrl: string,\n fetcher: PaymentFetcher,\n resolveAuthToken: () => Promise<string | null>\n): ApiClient => {\n const request = async <T>(\n method: HttpMethod,\n path: string,\n options?: RequestOptions\n ): Promise<T> => {\n const url = buildUrl(baseUrl, path, options ?? {})\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(paymentConfig.defaultHeaders ?? {}),\n ...(options?.headers ?? {}),\n }\n\n const token = await resolveAuthToken()\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const response = await fetcher(url, {\n method,\n headers,\n body: options?.body ? JSON.stringify(options.body) : undefined,\n })\n\n if (!response.ok) {\n const message = await response.text()\n throw new Error(message || `Request failed with status ${response.status}`)\n }\n\n if (response.status === 204) {\n return undefined as T\n }\n\n const data = (await response.json()) as T\n return data\n }\n\n return {\n request,\n get: (path, options) => request('GET', path, options),\n post: (path, options) => request('POST', path, options),\n put: (path, options) => request('PUT', path, options),\n patch: (path, options) => request('PATCH', path, options),\n delete: (path, options) => request('DELETE', path, options),\n }\n}\n","import type { BillingDetails, CreatePaymentMethodPayload, PaymentConfig } from '../types'\nimport { loadCollectJs } from '../utils/collect'\n\nexport interface CardTokenizeResult {\n token: string\n billing: BillingDetails\n}\n\nexport class CardPaymentService {\n private collectLoaded = false\n\n constructor(private config: PaymentConfig) {}\n\n async ensureCollectLoaded(): Promise<void> {\n if (this.collectLoaded) return\n if (!this.config.collectJsKey) {\n throw new Error('payments-ui: collect.js key missing')\n }\n\n loadCollectJs(this.config.collectJsKey)\n this.collectLoaded = true\n }\n\n buildCreatePayload(result: CardTokenizeResult): CreatePaymentMethodPayload {\n return {\n payment_token: result.token,\n first_name: result.billing.firstName,\n last_name: result.billing.lastName,\n address1: result.billing.address1,\n address2: result.billing.address2,\n city: result.billing.city,\n state: result.billing.stateRegion,\n zip: result.billing.postalCode,\n country: result.billing.country,\n email: result.billing.email,\n provider: result.billing.provider,\n }\n }\n}\n","import type {\n PaginatedPaymentMethods,\n CreatePaymentMethodPayload,\n PaymentMethod,\n} from '../types'\nimport type { ApiClient } from './apiClient'\n\nexport interface ListParams {\n page?: number\n pageSize?: number\n}\n\nexport class PaymentMethodService {\n constructor(private api: ApiClient) { }\n\n async list(params?: ListParams): Promise<PaginatedPaymentMethods> {\n return this.api.get('/payment-methods', {\n query: {\n page: params?.page ?? 1,\n page_size: params?.pageSize ?? 50,\n },\n })\n }\n\n async create(payload: CreatePaymentMethodPayload): Promise<PaymentMethod> {\n return this.api.post('/payment-methods', {\n body: { ...payload } as Record<string, unknown>,\n })\n }\n\n async remove(id: string): Promise<void> {\n await this.api.delete(`/payment-methods/${id}`)\n }\n\n async activate(id: string): Promise<void> {\n await this.api.put(`/payment-methods/${id}/activate`)\n }\n}\n","import type {\n GeneratePaymentResponse,\n SubmitPaymentResponse,\n TokenInfo,\n SolanaPayQRCodeIntent,\n SolanaPayStatusResponse,\n} from '../types'\nimport type { ApiClient } from './apiClient'\n\nexport class SolanaPaymentService {\n constructor(private api: ApiClient) { }\n\n async generatePayment(\n priceId: string,\n token: string,\n userWallet: string\n ): Promise<GeneratePaymentResponse> {\n return this.api.post('/solana/generate', {\n body: { price_id: priceId, token, user_wallet: userWallet },\n })\n }\n\n async submitPayment(\n signedTransaction: string,\n priceId: string,\n intentId: string,\n memo?: string\n ): Promise<SubmitPaymentResponse> {\n return this.api.post('/solana/submit', {\n body: {\n signed_transaction: signedTransaction,\n price_id: priceId,\n intent_id: intentId,\n ...(memo ? { memo } : {}),\n },\n })\n }\n\n async fetchSupportedTokens(): Promise<TokenInfo[]> {\n const response = await this.api.get<{ tokens: TokenInfo[] }>(\n '/solana/tokens'\n )\n return response.tokens\n }\n\n async getSupportedTokens(): Promise<TokenInfo[]> {\n return this.fetchSupportedTokens()\n }\n\n async generateQrCode(\n priceId: string,\n token: string,\n userWallet?: string\n ): Promise<SolanaPayQRCodeIntent> {\n return this.api.post('/solana/qr', {\n body: {\n price_id: priceId,\n token,\n ...(userWallet ? { user_wallet: userWallet } : {}),\n },\n })\n }\n\n async generateQRCode(\n priceId: string,\n token: string,\n userWallet?: string\n ): Promise<SolanaPayQRCodeIntent> {\n return this.generateQrCode(priceId, token, userWallet)\n }\n\n async checkPaymentStatus(\n reference: string,\n memo?: string\n ): Promise<SolanaPayStatusResponse> {\n return this.api.get('/solana/check', {\n query: {\n reference,\n ...(memo ? { memo } : {}),\n },\n })\n }\n}\n","import type { TokenInfo } from '../types'\nimport type { SolanaPaymentService } from './SolanaPaymentService'\n\nexport interface TokenCatalogOptions {\n ttlMs?: number\n}\n\nexport class TokenCatalog {\n private cache: TokenInfo[] = []\n private lastFetched = 0\n\n constructor(\n private solanaService: SolanaPaymentService,\n private options: TokenCatalogOptions = {}\n ) { }\n\n private get ttl(): number {\n return this.options.ttlMs ?? 5 * 60 * 1000\n }\n\n async getTokens(force = false): Promise<TokenInfo[]> {\n const isStale = Date.now() - this.lastFetched > this.ttl\n if (!force && this.cache.length > 0 && !isStale) {\n return this.cache\n }\n\n const tokens = await this.solanaService.fetchSupportedTokens()\n this.cache = tokens\n this.lastFetched = Date.now()\n return tokens\n }\n\n getCached(): TokenInfo[] {\n return this.cache\n }\n}\n","export interface WalletAccount {\n publicKey: string\n}\n\nexport interface WalletAdapterLike {\n publicKey?: { toBase58(): string }\n signTransaction?: (tx: unknown) => Promise<unknown>\n signVersionedTransaction?: (tx: unknown) => Promise<unknown>\n}\n\nexport class WalletGateway {\n private adapter: WalletAdapterLike | null = null\n\n setAdapter(adapter: WalletAdapterLike | null): void {\n this.adapter = adapter\n }\n\n getPublicKey(): string | null {\n if (!this.adapter?.publicKey) return null\n try {\n return this.adapter.publicKey.toBase58()\n } catch {\n return null\n }\n }\n\n async sign(transaction: unknown): Promise<unknown> {\n if (!this.adapter) {\n throw new Error('payments-ui: wallet adapter not set')\n }\n\n if (typeof this.adapter.signVersionedTransaction === 'function') {\n return this.adapter.signVersionedTransaction(transaction)\n }\n\n if (typeof this.adapter.signTransaction === 'function') {\n return this.adapter.signTransaction(transaction)\n }\n\n throw new Error('payments-ui: wallet adapter cannot sign transactions')\n }\n}\n","import type { ApiClient } from './apiClient'\nimport type {\n CCBillSubscribePayload,\n FlexFormResponse,\n GenerateFlexFormURLBodyParams,\n NmiSubscribePayload,\n PaymentPlatform,\n SubscriptionResponse,\n} from '../types/subscription'\n\nexport class SubscriptionService {\n constructor(private readonly api: ApiClient) {}\n\n async subscribe(\n platform: PaymentPlatform,\n payload: NmiSubscribePayload | CCBillSubscribePayload\n ): Promise<SubscriptionResponse> {\n const body = this.serializePayload(platform, payload)\n return this.api.post<SubscriptionResponse>(\n `/subscriptions/process/${platform}`,\n {\n body,\n }\n )\n }\n\n async generateFlexFormUrl(\n payload: GenerateFlexFormURLBodyParams\n ): Promise<FlexFormResponse> {\n return this.api.post('/subscriptions/flexform', {\n body: { ...payload } as Record<string, unknown>,\n })\n }\n\n private serializePayload(\n platform: PaymentPlatform,\n payload: NmiSubscribePayload | CCBillSubscribePayload\n ): Record<string, unknown> {\n if (platform === 'nmi') {\n const data = payload as NmiSubscribePayload\n if (!data.priceId) {\n throw new Error('payments-ui: priceId is required for NMI subscriptions')\n }\n\n if (!data.paymentToken && !data.paymentMethodId) {\n throw new Error(\n 'payments-ui: paymentToken or paymentMethodId is required for NMI subscriptions'\n )\n }\n\n const body: Record<string, unknown> = {\n price_id: data.priceId,\n processor: data.processor ?? 'nmi',\n provider: data.provider,\n }\n\n if (data.email) body.email = data.email\n if (data.firstName) body.first_name = data.firstName\n if (data.lastName) body.last_name = data.lastName\n if (data.address1) body.address1 = data.address1\n if (data.city) body.city = data.city\n if (data.state) body.state = data.state\n if (data.zipCode) body.zip = data.zipCode\n if (data.country) body.country = data.country\n if (data.paymentToken) body.payment_token = data.paymentToken\n if (data.paymentMethodId) body.payment_method_id = data.paymentMethodId\n\n return body\n }\n\n const data = payload as CCBillSubscribePayload\n if (!data.priceId) {\n throw new Error('payments-ui: priceId is required for CCBill subscriptions')\n }\n\n return {\n price_id: data.priceId,\n processor: data.processor ?? 'ccbill',\n email: data.email,\n first_name: data.firstName,\n last_name: data.lastName,\n zip: data.zipCode,\n country: data.country,\n }\n }\n}\n","import type { PaymentConfig, PaymentFetcher } from '../types'\nimport { createApiClient, type ApiClient } from '../services/apiClient'\nimport { CardPaymentService } from '../services/CardPaymentService'\nimport { PaymentMethodService } from '../services/PaymentMethodService'\nimport { SolanaPaymentService } from '../services/SolanaPaymentService'\nimport { TokenCatalog } from '../services/TokenCatalog'\nimport { WalletGateway } from '../services/WalletGateway'\nimport { SubscriptionService } from '../services/SubscriptionService'\n\nexport interface PaymentServices {\n cardPayments: CardPaymentService\n paymentMethods: PaymentMethodService\n solanaPayments: SolanaPaymentService\n tokenCatalog: TokenCatalog\n walletGateway: WalletGateway\n subscriptions: SubscriptionService\n billingApi: ApiClient\n accountApi: ApiClient\n}\n\nexport interface PaymentAppOptions {\n config: PaymentConfig\n fetcher?: PaymentFetcher\n}\n\nexport class PaymentApp {\n private readonly config: PaymentConfig\n private readonly fetcher: PaymentFetcher\n private readonly services: PaymentServices\n\n constructor(options: PaymentAppOptions) {\n this.config = options.config\n this.fetcher =\n options.fetcher ??\n options.config.fetcher ??\n (globalThis.fetch?.bind(globalThis) as PaymentFetcher)\n\n if (!this.fetcher) {\n throw new Error('payments-ui: fetch implementation is required')\n }\n\n this.services = this.createServices()\n }\n\n getConfig(): PaymentConfig {\n return this.config\n }\n\n getFetcher(): PaymentFetcher {\n return this.fetcher\n }\n\n getServices(): PaymentServices {\n return this.services\n }\n\n private createServices(): PaymentServices {\n const billingApi = createApiClient(\n this.config,\n this.config.endpoints.billingBaseUrl,\n this.fetcher,\n this.resolveAuthToken\n )\n\n const accountBaseUrl =\n this.config.endpoints.accountBaseUrl ?? this.config.endpoints.billingBaseUrl\n const accountApi = createApiClient(\n this.config,\n accountBaseUrl,\n this.fetcher,\n this.resolveAuthToken\n )\n\n const solanaPayments = new SolanaPaymentService(billingApi)\n const paymentMethods = new PaymentMethodService(accountApi)\n const cardPayments = new CardPaymentService(this.config)\n const walletGateway = new WalletGateway()\n const tokenCatalog = new TokenCatalog(solanaPayments)\n const subscriptions = new SubscriptionService(billingApi)\n\n return {\n cardPayments,\n paymentMethods,\n solanaPayments,\n tokenCatalog,\n walletGateway,\n subscriptions,\n billingApi,\n accountApi,\n }\n }\n\n resolveAuthToken = async (): Promise<string | null> => {\n if (!this.config.getAuthToken) {\n return null\n }\n\n try {\n const result = this.config.getAuthToken()\n if (result instanceof Promise) {\n return (await result) ?? null\n }\n return result ?? null\n } catch (error) {\n console.warn('payments-ui: failed to resolve auth token', error)\n return null\n }\n }\n}\n","import { createStore } from 'zustand/vanilla'\nimport type {\n PaymentCallbacks,\n PaymentStatusPayload,\n PaymentSuccessPayload,\n} from '../types'\n\nexport type AsyncStatus = 'idle' | 'processing' | 'success' | 'error'\nexport type SolanaFlowState =\n | 'selecting'\n | 'processing'\n | 'confirming'\n | 'success'\n | 'error'\n\nexport interface PaymentStoreState {\n selectedMethodId: string | null\n solanaModalOpen: boolean\n savedPaymentStatus: AsyncStatus\n savedPaymentError: string | null\n newCardStatus: AsyncStatus\n newCardError: string | null\n solanaTab: 'wallet' | 'qr'\n solanaStatus: SolanaFlowState\n solanaError: string | null\n solanaTransactionId: string | null\n solanaSelectedToken: string | null\n solanaTokenAmount: number\n setSelectedMethod: (methodId: string | null) => void\n setSolanaModalOpen: (open: boolean) => void\n setSolanaTab: (tab: 'wallet' | 'qr') => void\n setSolanaSelectedToken: (symbol: string) => void\n setSolanaTokenAmount: (amount: number) => void\n setSolanaTransactionId: (txId: string | null) => void\n startSavedPayment: () => void\n completeSavedPayment: () => void\n failSavedPayment: (error: string) => void\n resetSavedPayment: () => void\n startNewCardPayment: () => void\n completeNewCardPayment: () => void\n failNewCardPayment: (error: string) => void\n resetNewCardPayment: () => void\n startSolanaPayment: () => void\n confirmSolanaPayment: () => void\n completeSolanaPayment: (payload?: PaymentSuccessPayload) => void\n failSolanaPayment: (error: string) => void\n resetSolanaPayment: () => void\n resetAll: () => void\n}\n\nconst initialState = {\n selectedMethodId: null,\n solanaModalOpen: false,\n savedPaymentStatus: 'idle' as AsyncStatus,\n savedPaymentError: null,\n newCardStatus: 'idle' as AsyncStatus,\n newCardError: null,\n solanaTab: 'wallet' as const,\n solanaStatus: 'selecting' as SolanaFlowState,\n solanaError: null,\n solanaTransactionId: null,\n solanaSelectedToken: null,\n solanaTokenAmount: 0,\n}\n\nexport interface PaymentStoreOptions {\n callbacks?: PaymentCallbacks\n}\n\nexport const createPaymentStore = (options?: PaymentStoreOptions) =>\n createStore<PaymentStoreState>((set, get) => {\n const notifyStatus = (\n status: PaymentStatusPayload['status'],\n context?: Record<string, unknown>\n ) => {\n options?.callbacks?.onStatusChange?.({ status, context })\n }\n\n const notifySuccess = (payload?: PaymentSuccessPayload) => {\n if (!options?.callbacks?.onSuccess) return\n options.callbacks.onSuccess(payload ?? {})\n }\n\n const notifyError = (error: string) => {\n options?.callbacks?.onError?.(new Error(error))\n }\n\n return {\n ...initialState,\n setSelectedMethod: (methodId) =>\n set({ selectedMethodId: methodId }),\n setSolanaModalOpen: (open) =>\n set({ solanaModalOpen: open }),\n setSolanaTab: (tab) => set({ solanaTab: tab }),\n setSolanaSelectedToken: (symbol) =>\n set({ solanaSelectedToken: symbol }),\n setSolanaTokenAmount: (amount) => set({ solanaTokenAmount: amount }),\n setSolanaTransactionId: (txId) => set({ solanaTransactionId: txId }),\n startSavedPayment: () => {\n notifyStatus('processing', { source: 'saved-payment' })\n set({ savedPaymentStatus: 'processing', savedPaymentError: null })\n },\n completeSavedPayment: () => {\n notifyStatus('success', { source: 'saved-payment' })\n set({ savedPaymentStatus: 'success', savedPaymentError: null })\n },\n failSavedPayment: (error) => {\n notifyStatus('error', { source: 'saved-payment' })\n notifyError(error)\n set({ savedPaymentStatus: 'error', savedPaymentError: error })\n },\n resetSavedPayment: () =>\n set({ savedPaymentStatus: 'idle', savedPaymentError: null }),\n startNewCardPayment: () => {\n notifyStatus('processing', { source: 'new-card' })\n set({ newCardStatus: 'processing', newCardError: null })\n },\n completeNewCardPayment: () => {\n notifyStatus('success', { source: 'new-card' })\n set({ newCardStatus: 'success', newCardError: null })\n },\n failNewCardPayment: (error) => {\n notifyStatus('error', { source: 'new-card' })\n notifyError(error)\n set({ newCardStatus: 'error', newCardError: error })\n },\n resetNewCardPayment: () =>\n set({ newCardStatus: 'idle', newCardError: null }),\n startSolanaPayment: () => {\n notifyStatus('processing', { source: 'solana' })\n set({ solanaStatus: 'processing', solanaError: null })\n },\n confirmSolanaPayment: () =>\n set({ solanaStatus: 'confirming' }),\n completeSolanaPayment: (payload) => {\n notifyStatus('success', { source: 'solana' })\n notifySuccess(payload)\n set({ solanaStatus: 'success', solanaError: null })\n },\n failSolanaPayment: (error) => {\n notifyStatus('error', { source: 'solana' })\n notifyError(error)\n set({ solanaStatus: 'error', solanaError: error })\n },\n resetSolanaPayment: () =>\n set({\n solanaStatus: 'selecting',\n solanaError: null,\n solanaTransactionId: null,\n }),\n resetAll: () => set(initialState),\n }\n })\n","import React, { createContext, useContext, useEffect, useMemo } from 'react'\nimport type { StoreApi } from 'zustand'\nimport type { PaymentConfig, PaymentFetcher } from '../types/config'\nimport { loadCollectJs } from '../utils/collect'\nimport { PaymentApp, type PaymentServices } from '../core'\nimport {\n createPaymentStore,\n type PaymentStoreState,\n} from '../state/paymentStore'\n\nexport interface PaymentContextValue {\n config: PaymentConfig\n fetcher: PaymentFetcher\n resolveAuthToken: () => Promise<string | null>\n app: PaymentApp\n services: PaymentServices\n store: StoreApi<PaymentStoreState>\n}\n\nconst PaymentContext = createContext<PaymentContextValue | undefined>(undefined)\n\nexport interface PaymentProviderProps {\n config: PaymentConfig\n children: React.ReactNode\n}\n\nexport const PaymentProvider: React.FC<PaymentProviderProps> = ({\n config,\n children,\n}) => {\n const app = useMemo(() => new PaymentApp({ config }), [config])\n const store = useMemo(\n () => createPaymentStore({ callbacks: config.callbacks }),\n [config.callbacks]\n )\n\n const value = useMemo<PaymentContextValue>(() => {\n return {\n config: app.getConfig(),\n fetcher: app.getFetcher(),\n resolveAuthToken: app.resolveAuthToken,\n app,\n services: app.getServices(),\n store,\n }\n }, [app, store])\n\n useEffect(() => {\n if (!value.config.collectJsKey) return\n loadCollectJs(value.config.collectJsKey)\n }, [value.config.collectJsKey])\n\n return <PaymentContext.Provider value={value}>{children}</PaymentContext.Provider>\n}\n\nexport const usePaymentContext = (): PaymentContextValue => {\n const context = useContext(PaymentContext)\n if (!context) {\n throw new Error('usePaymentContext must be used within a PaymentProvider')\n }\n return context\n}\n","// Use country-list package for standard country data\nimport countryList from 'country-list'\n\n// Define our interfaces for TypeScript support\nexport interface Country {\n code: string\n name: string\n}\n\n// Some countries that need customization or that might be missing from the base package\nconst customCountries: Country[] = [\n { code: 'TW', name: 'Taiwan, Province of China' },\n { code: 'KR', name: 'Korea' },\n { code: 'KP', name: 'North Korea' },\n { code: 'PS', name: 'Palestine, State of' },\n { code: 'VA', name: 'Holy See (Vatican City State)' },\n { code: 'BQ', name: 'Bonaire, Sint Eustatius and Saba' },\n { code: 'SX', name: 'Sint Maarten (Dutch part)' },\n { code: 'MK', name: 'North Macedonia' },\n { code: 'SZ', name: 'Eswatini' },\n { code: 'FM', name: 'Micronesia, Federated States Of' },\n { code: 'TR', name: 'Türkiye' },\n]\n\n// Apply customizations to the country list\ncountryList.overwrite(customCountries)\n\n// Get the countries from the package and sort them alphabetically by name\nexport const countries: Country[] = countryList\n .getData()\n .sort((a: Country, b: Country) => a.name.localeCompare(b.name))\n","import { useEffect, useRef, useState } from 'react'\nimport { countries } from '../data/countries'\n\nexport function useCountryDropdown() {\n const [country, setCountry] = useState('')\n const [countryOpen, setCountryOpen] = useState(false)\n const [countrySearch, setCountrySearch] = useState('')\n const countryDropdownRef = useRef<HTMLDivElement | null>(null)\n\n const filteredCountries = countries.filter((country) =>\n country.name.toLowerCase().includes(countrySearch.toLowerCase())\n )\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n countryDropdownRef.current &&\n !countryDropdownRef.current.contains(event.target as Node)\n ) {\n setCountryOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [])\n\n return {\n country,\n setCountry,\n countryOpen,\n setCountryOpen,\n countrySearch,\n setCountrySearch,\n countryDropdownRef,\n filteredCountries,\n }\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { CreditCard, Loader2, MapPin, User, Search, ChevronDown } from 'lucide-react'\nimport { useCountryDropdown } from '../hooks/useCountryDropdown'\nimport type { BillingDetails } from '../types'\nimport type { CollectJSResponse } from '../types/collect'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport clsx from 'clsx'\n\nexport interface CardDetailsFormProps {\n visible: boolean\n onTokenize: (token: string, billing: BillingDetails) => void\n submitLabel: string\n submitting?: boolean\n defaultValues?: Partial<BillingDetails>\n externalError?: string | null\n collectPrefix?: string\n className?: string\n onBillingChange?: (billing: BillingDetails) => void\n submitDisabled?: boolean\n}\n\nconst defaultBilling: BillingDetails = {\n firstName: '',\n lastName: '',\n address1: '',\n address2: '',\n city: '',\n stateRegion: '',\n postalCode: '',\n country: 'US',\n email: '',\n provider: 'mobius',\n}\n\nconst buildSelector = (prefix: string, field: string) => `#${prefix}-${field}`\n\nexport const CardDetailsForm: React.FC<CardDetailsFormProps> = ({\n visible,\n onTokenize,\n submitLabel,\n submitting = false,\n defaultValues,\n externalError,\n collectPrefix = 'card-form',\n className,\n onBillingChange,\n submitDisabled = false,\n}) => {\n const { config } = usePaymentContext()\n const defaultValuesKey = useMemo(() => JSON.stringify(defaultValues ?? {}), [defaultValues])\n\n const mergedDefaults: BillingDetails = useMemo(\n () => ({\n ...defaultBilling,\n ...defaultValues,\n email: defaultValues?.email ?? config.defaultUser?.email ?? defaultBilling.email,\n }),\n [defaultValuesKey, config.defaultUser?.email]\n )\n\n const [firstName, setFirstName] = useState(mergedDefaults.firstName)\n const [lastName, setLastName] = useState(mergedDefaults.lastName)\n const [address1, setAddress1] = useState(mergedDefaults.address1)\n const [address2, setAddress2] = useState(mergedDefaults.address2 ?? '')\n const [city, setCity] = useState(mergedDefaults.city)\n const [stateRegion, setStateRegion] = useState(mergedDefaults.stateRegion ?? '')\n const [postalCode, setPostalCode] = useState(mergedDefaults.postalCode)\n const [country, setCountry] = useState(mergedDefaults.country)\n const [email, setEmail] = useState(mergedDefaults.email ?? '')\n const [localError, setLocalError] = useState<string | null>(null)\n const [isTokenizing, setIsTokenizing] = useState(false)\n\n const {\n countryDropdownRef,\n countryOpen,\n setCountryOpen,\n countrySearch,\n setCountrySearch,\n filteredCountries,\n } = useCountryDropdown()\n\n useEffect(() => {\n if (!visible) {\n setLocalError(null)\n setIsTokenizing(false)\n }\n }, [visible])\n\n useEffect(() => {\n if (!visible) return\n setFirstName(mergedDefaults.firstName)\n setLastName(mergedDefaults.lastName)\n setAddress1(mergedDefaults.address1)\n setAddress2(mergedDefaults.address2 ?? '')\n setCity(mergedDefaults.city)\n setStateRegion(mergedDefaults.stateRegion ?? '')\n setPostalCode(mergedDefaults.postalCode)\n setCountry(mergedDefaults.country)\n setEmail(mergedDefaults.email ?? '')\n }, [defaultValuesKey, mergedDefaults, visible])\n\n useEffect(() => {\n if (!onBillingChange) return\n onBillingChange({\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n provider: mergedDefaults.provider ?? 'mobius',\n })\n }, [\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n mergedDefaults.provider,\n onBillingChange,\n ])\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.CollectJS || !visible) {\n return\n }\n\n const handlers = (window.__doujinsCollectHandlers ||= {})\n handlers[collectPrefix] = (response: CollectJSResponse) => {\n setIsTokenizing(false)\n if (!response.token) {\n setLocalError('Payment tokenization failed. Please try again.')\n return\n }\n\n const billing: BillingDetails = {\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n provider: mergedDefaults.provider ?? 'mobius',\n }\n\n onTokenize(response.token, billing)\n }\n\n const configured = (window.__doujinsCollectConfigured ||= {})\n if (!configured[collectPrefix]) {\n window.CollectJS.configure({\n variant: 'inline',\n fields: {\n ccnumber: { selector: buildSelector(collectPrefix, 'ccnumber') },\n ccexp: { selector: buildSelector(collectPrefix, 'ccexp') },\n cvv: { selector: buildSelector(collectPrefix, 'cvv') },\n },\n callback: (response: CollectJSResponse) => {\n const fn = window.__doujinsCollectHandlers?.[collectPrefix]\n fn?.(response)\n },\n })\n configured[collectPrefix] = true\n }\n }, [\n collectPrefix,\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n mergedDefaults.provider,\n onTokenize,\n visible,\n ])\n\n const validate = (): boolean => {\n if (\n !firstName.trim() ||\n !lastName.trim() ||\n !address1.trim() ||\n !city.trim() ||\n !postalCode.trim() ||\n !country.trim() ||\n !email.trim()\n ) {\n setLocalError('Please complete all required billing fields.')\n return false\n }\n setLocalError(null)\n return true\n }\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault()\n if (!validate()) return\n if (!window.CollectJS) {\n setLocalError('Payment form is not ready. Please try again later.')\n return\n }\n setIsTokenizing(true)\n window.CollectJS.startPaymentRequest()\n }\n\n const errorMessage = localError ?? externalError\n\n return (\n <form\n className={clsx('payments-ui-card-form', className)}\n onSubmit={handleSubmit}\n noValidate\n >\n <div className=\"payments-ui-grid\">\n <label className=\"payments-ui-label\">\n <span>\n <User className=\"payments-ui-icon\" /> First name\n </span>\n <input\n className=\"payments-ui-input\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n required\n />\n </label>\n <label className=\"payments-ui-label\">\n <span>\n <User className=\"payments-ui-icon\" /> Last name\n </span>\n <input\n className=\"payments-ui-input\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n required\n />\n </label>\n </div>\n\n <label className=\"payments-ui-label\">\n <span>Email</span>\n <input\n type=\"email\"\n className=\"payments-ui-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n />\n </label>\n\n <label className=\"payments-ui-label\">\n <span>Address line 1</span>\n <input\n className=\"payments-ui-input\"\n value={address1}\n onChange={(e) => setAddress1(e.target.value)}\n required\n />\n </label>\n\n <label className=\"payments-ui-label\">\n <span>Address line 2 (optional)</span>\n <input\n className=\"payments-ui-input\"\n value={address2}\n onChange={(e) => setAddress2(e.target.value)}\n />\n </label>\n\n <div className=\"payments-ui-grid\">\n <label className=\"payments-ui-label\">\n <span>City</span>\n <input\n className=\"payments-ui-input\"\n value={city}\n onChange={(e) => setCity(e.target.value)}\n required\n />\n </label>\n <label className=\"payments-ui-label\">\n <span>State / Region</span>\n <input\n className=\"payments-ui-input\"\n value={stateRegion}\n onChange={(e) => setStateRegion(e.target.value)}\n />\n </label>\n </div>\n\n <div className=\"payments-ui-grid\">\n <label className=\"payments-ui-label\">\n <span>\n <MapPin className=\"payments-ui-icon\" /> Postal code\n </span>\n <input\n className=\"payments-ui-input\"\n value={postalCode}\n onChange={(e) => setPostalCode(e.target.value)}\n required\n />\n </label>\n <div className=\"payments-ui-label\">\n <span>Country</span>\n <div className=\"payments-ui-country\" ref={countryDropdownRef}>\n <button\n type=\"button\"\n className=\"payments-ui-country-toggle\"\n onClick={() => setCountryOpen((prev) => !prev)}\n >\n <span>{country}</span>\n <ChevronDown className=\"payments-ui-icon\" />\n </button>\n {countryOpen && (\n <div className=\"payments-ui-country-menu\">\n <div className=\"payments-ui-country-search\">\n <Search className=\"payments-ui-icon\" />\n <input\n placeholder=\"Search country\"\n value={countrySearch}\n onChange={(e) => setCountrySearch(e.target.value)}\n />\n </div>\n <ul>\n {filteredCountries.map((option) => (\n <li key={option.code}>\n <button\n type=\"button\"\n onClick={() => {\n setCountry(option.code)\n setCountryOpen(false)\n }}\n >\n {option.name}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"payments-ui-label\">\n <span>Card number</span>\n <div\n id={buildSelector(collectPrefix, 'ccnumber').slice(1)}\n className=\"payments-ui-collect-field\"\n />\n </div>\n\n <div className=\"payments-ui-grid\">\n <div className=\"payments-ui-label\">\n <span>Expiry</span>\n <div\n id={buildSelector(collectPrefix, 'ccexp').slice(1)}\n className=\"payments-ui-collect-field\"\n />\n </div>\n <div className=\"payments-ui-label\">\n <span>CVV</span>\n <div\n id={buildSelector(collectPrefix, 'cvv').slice(1)}\n className=\"payments-ui-collect-field\"\n />\n </div>\n </div>\n\n {errorMessage && <p className=\"payments-ui-error\">{errorMessage}</p>}\n\n <button\n type=\"submit\"\n className=\"payments-ui-button\"\n disabled={submitting || isTokenizing || submitDisabled}\n >\n {(submitting || isTokenizing) && (\n <Loader2 className=\"payments-ui-spinner\" />\n )}\n <CreditCard className=\"payments-ui-icon\" />\n {submitting || isTokenizing ? 'Processing...' : submitLabel}\n </button>\n </form>\n )\n}\n","import { useMemo } from 'react'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { PaymentMethodService } from '../services/PaymentMethodService'\n\nexport const usePaymentMethodService = (): PaymentMethodService => {\n const { services } = usePaymentContext()\n return useMemo(() => services.paymentMethods, [services])\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { usePaymentMethodService } from './usePaymentMethodService'\nimport type {\n BillingDetails,\n CreatePaymentMethodPayload,\n PaymentMethod,\n PaginatedPaymentMethods,\n} from '../types'\n\nconst PAYMENT_METHODS_KEY = ['payments-ui', 'payment-methods']\n\nexport const usePaymentMethods = () => {\n const service = usePaymentMethodService()\n const queryClient = useQueryClient()\n\n const listQuery = useQuery<PaginatedPaymentMethods>({\n queryKey: PAYMENT_METHODS_KEY,\n queryFn: () => service.list({ pageSize: 50 }),\n })\n\n const createMutation = useMutation<\n PaymentMethod,\n Error,\n { token: string; billing: BillingDetails }\n >({\n mutationFn: ({ token, billing }) => {\n const payload: CreatePaymentMethodPayload = {\n payment_token: token,\n first_name: billing.firstName,\n last_name: billing.lastName,\n address1: billing.address1,\n address2: billing.address2,\n city: billing.city,\n state: billing.stateRegion,\n zip: billing.postalCode,\n country: billing.country,\n email: billing.email,\n provider: billing.provider,\n }\n return service.create(payload)\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: PAYMENT_METHODS_KEY })\n },\n })\n\n const deleteMutation = useMutation<void, Error, { id: string }>({\n mutationFn: ({ id }) => service.remove(id),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: PAYMENT_METHODS_KEY })\n },\n })\n\n return {\n listQuery,\n createMutation,\n deleteMutation,\n }\n}\n","import React, { useMemo, useState } from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { CreditCard, Loader2, Trash2, WalletCards, X } from 'lucide-react'\nimport clsx from 'clsx'\nimport { CardDetailsForm } from './CardDetailsForm'\nimport { usePaymentMethods } from '../hooks/usePaymentMethods'\nimport type { BillingDetails, PaymentMethod } from '../types'\n\nconst formatCardLabel = (method: PaymentMethod): string => {\n const brand = method.card_type ? method.card_type.toUpperCase() : 'CARD'\n const lastFour = method.last_four ? `•••• ${method.last_four}` : ''\n return `${brand} ${lastFour}`.trim()\n}\n\nexport interface StoredPaymentMethodsProps {\n selectedMethodId?: string | null\n onMethodSelect?: (method: PaymentMethod) => void\n showAddButton?: boolean\n heading?: string\n description?: string\n}\n\nexport const StoredPaymentMethods: React.FC<StoredPaymentMethodsProps> = ({\n selectedMethodId,\n onMethodSelect,\n showAddButton = true,\n heading = 'Payment Methods',\n description = 'Manage your saved cards',\n}) => {\n const { listQuery, createMutation, deleteMutation } = usePaymentMethods()\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [deletingId, setDeletingId] = useState<string | null>(null)\n\n const payments = useMemo(() => listQuery.data?.data ?? [], [listQuery.data])\n\n const handleCardTokenize = (token: string, billing: BillingDetails) => {\n createMutation.mutate({ token, billing })\n }\n\n const handleDelete = (method: PaymentMethod) => {\n setDeletingId(method.id)\n deleteMutation.mutate(\n { id: method.id },\n {\n onSettled: () => setDeletingId(null),\n }\n )\n }\n\n return (\n <div className=\"payments-ui-panel\">\n <div className=\"payments-ui-panel-header\">\n <div>\n <p className=\"payments-ui-panel-title\">\n <WalletCards className=\"payments-ui-icon\" /> {heading}\n </p>\n <p className=\"payments-ui-panel-description\">{description}</p>\n </div>\n {showAddButton && (\n <button\n className=\"payments-ui-button\"\n type=\"button\"\n onClick={() => setIsModalOpen(true)}\n >\n <CreditCard className=\"payments-ui-icon\" /> Add card\n </button>\n )}\n </div>\n\n <div className=\"payments-ui-panel-body\">\n {listQuery.isLoading ? (\n <div className=\"payments-ui-empty\">\n <Loader2 className=\"payments-ui-spinner\" /> Loading cards...\n </div>\n ) : payments.length === 0 ? (\n <div className=\"payments-ui-empty\">No saved payment methods yet.</div>\n ) : (\n <div className=\"payments-ui-method-list\">\n {payments.map((method) => {\n const isSelected = selectedMethodId === method.id\n return (\n <div\n key={method.id}\n className={clsx('payments-ui-method-item', {\n 'is-selected': isSelected,\n })}\n >\n <div>\n <p className=\"payments-ui-method-label\">\n {formatCardLabel(method)}\n </p>\n <p className=\"payments-ui-method-meta\">\n Added on{' '}\n {method.created_at\n ? new Date(method.created_at).toLocaleDateString()\n : 'unknown'}\n </p>\n </div>\n <div className=\"payments-ui-method-actions\">\n {onMethodSelect && (\n <button\n type=\"button\"\n className=\"payments-ui-text-button\"\n onClick={() => onMethodSelect(method)}\n >\n {isSelected ? 'Selected' : 'Use card'}\n </button>\n )}\n <button\n type=\"button\"\n className=\"payments-ui-icon-button payments-ui-danger\"\n onClick={() => handleDelete(method)}\n disabled={deletingId === method.id && deleteMutation.isPending}\n >\n {deletingId === method.id && deleteMutation.isPending ? (\n <Loader2 className=\"payments-ui-spinner\" />\n ) : (\n <Trash2 className=\"payments-ui-icon\" />\n )}\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n <Dialog.Root open={isModalOpen} onOpenChange={setIsModalOpen}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"payments-ui-modal-overlay\" />\n <Dialog.Content className=\"payments-ui-modal\">\n <div className=\"payments-ui-modal-header\">\n <div>\n <h3>Add a new card</h3>\n <p>Your card details are tokenized securely via our payment provider.</p>\n </div>\n <Dialog.Close className=\"payments-ui-icon-button\">\n <X className=\"payments-ui-icon\" />\n </Dialog.Close>\n </div>\n <CardDetailsForm\n visible={isModalOpen}\n collectPrefix=\"payments-ui-card\"\n submitting={createMutation.isPending}\n submitLabel=\"Save card\"\n externalError={createMutation.error?.message ?? null}\n onTokenize={handleCardTokenize}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { SolanaPaymentService } from '../services/SolanaPaymentService'\n\nexport const useSolanaService = (): SolanaPaymentService => {\n const { services } = usePaymentContext()\n return useMemo(() => services.solanaPayments, [services])\n}\n","import {\n Connection,\n PublicKey,\n LAMPORTS_PER_SOL,\n ParsedAccountData,\n} from '@solana/web3.js'\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token'\nimport { TokenInfo } from '../../types'\n\nexport interface TokenBalance {\n mint: string\n symbol: string\n name: string\n balance: number\n uiBalance: string\n decimals: number\n isNative: boolean\n}\n\nexport interface ParsedTokenAccount {\n mint: string\n owner: string\n amount: string\n uiAmount: number\n decimals: number\n}\n\nexport const getSolBalance = async (\n connection: Connection,\n publicKey: PublicKey\n): Promise<number> => {\n try {\n const lamports = await connection.getBalance(publicKey)\n return lamports / LAMPORTS_PER_SOL\n } catch (error) {\n console.error('Failed to fetch SOL balance:', error)\n return 0\n }\n}\n\nexport const fetchAllTokenBalances = async (\n connection: Connection,\n publicKey: PublicKey\n): Promise<Map<string, number>> => {\n const balances = new Map<string, number>()\n\n try {\n const tokenAccounts = await connection.getParsedProgramAccounts(\n TOKEN_PROGRAM_ID,\n {\n filters: [\n {\n dataSize: 165, // Size of token account\n },\n {\n memcmp: {\n offset: 32, // Owner field offset\n bytes: publicKey.toString(),\n },\n },\n ],\n }\n )\n\n for (const account of tokenAccounts) {\n const data = account.account.data as ParsedAccountData\n interface TokenParsed { info?: { mint: string; tokenAmount?: { uiAmount?: number } } }\n const parsed = data.parsed as TokenParsed\n const info = parsed?.info\n if (info && info.tokenAmount) {\n const mintAddress = info.mint\n const uiAmount = info.tokenAmount.uiAmount || 0\n\n if (uiAmount > 0) {\n balances.set(mintAddress, uiAmount)\n }\n }\n }\n } catch (error) {\n console.error('Failed to fetch token balances:', error)\n }\n\n return balances\n}\n\nexport const getTokenBalance = async (\n connection: Connection,\n publicKey: PublicKey,\n mintAddress: string\n): Promise<number> => {\n try {\n const tokenAccounts = await connection.getTokenAccountsByOwner(publicKey, {\n mint: new PublicKey(mintAddress),\n })\n\n if (tokenAccounts.value.length === 0) {\n return 0\n }\n\n const tokenAccount = tokenAccounts.value[0]\n const accountInfo = await connection.getParsedAccountInfo(\n tokenAccount.pubkey\n )\n\n const valueData = accountInfo.value?.data as ParsedAccountData | null | undefined\n if (valueData && valueData.parsed) {\n interface TokenParsed { info?: { tokenAmount?: { uiAmount?: number } } }\n const parsed = valueData.parsed as TokenParsed\n if (parsed.info?.tokenAmount) {\n return parsed.info.tokenAmount.uiAmount || 0\n }\n }\n\n return 0\n } catch (error) {\n console.error(`Failed to fetch balance for token ${mintAddress}:`, error)\n return 0\n }\n}\n\nexport const fetchSupportedTokenBalances = async (\n connection: Connection,\n publicKey: PublicKey,\n supportedTokens: TokenInfo[]\n): Promise<TokenBalance[]> => {\n const results: TokenBalance[] = []\n\n const solBalance = await getSolBalance(connection, publicKey)\n const solTokenMeta =\n supportedTokens.find((token) => token.is_native || token.symbol === 'SOL') ||\n {\n symbol: 'SOL',\n name: 'Solana',\n mint: 'So11111111111111111111111111111111111111112',\n decimals: 9,\n price: 0,\n is_native: true,\n }\n\n results.push({\n mint: solTokenMeta.mint,\n symbol: solTokenMeta.symbol,\n name: solTokenMeta.name,\n balance: solBalance,\n uiBalance: solBalance.toFixed(solTokenMeta.decimals <= 4 ? solTokenMeta.decimals : 4),\n decimals: solTokenMeta.decimals,\n isNative: true,\n })\n\n const tokenBalances = await fetchAllTokenBalances(connection, publicKey)\n\n const tokenMetaByMint = new Map(\n supportedTokens\n .filter((token) => !(token.is_native || token.symbol === 'SOL'))\n .map((token) => [token.mint, token])\n )\n\n for (const [mint, tokenMeta] of tokenMetaByMint.entries()) {\n const balance = tokenBalances.get(mint) || 0\n\n results.push({\n mint,\n symbol: tokenMeta.symbol,\n name: tokenMeta.name,\n balance,\n uiBalance: balance.toFixed(tokenMeta.decimals <= 6 ? tokenMeta.decimals : 6),\n decimals: tokenMeta.decimals,\n isNative: false,\n })\n }\n\n return results\n}\n\n/**\n * Parse token account data from RPC response\n * @param accountData - Raw account data from RPC\n * @returns Parsed token account info\n */\nexport const parseTokenAccountData = (\n accountData: any\n): ParsedTokenAccount | null => {\n try {\n const parsedInfo = accountData.parsed?.info\n if (!parsedInfo) return null\n\n return {\n mint: parsedInfo.mint,\n owner: parsedInfo.owner,\n amount: parsedInfo.tokenAmount.amount,\n uiAmount: parsedInfo.tokenAmount.uiAmount || 0,\n decimals: parsedInfo.tokenAmount.decimals,\n }\n } catch (error) {\n console.error('Failed to parse token account data:', error)\n return null\n }\n}\n\nexport const convertToUIAmount = (\n rawAmount: string,\n decimals: number\n): number => {\n try {\n const amount = parseInt(rawAmount, 10)\n return amount / Math.pow(10, decimals)\n } catch (error) {\n console.error('Failed to convert to UI amount:', error)\n return 0\n }\n}\n\nexport const convertToRawAmount = (\n uiAmount: number,\n decimals: number\n): string => {\n try {\n const rawAmount = Math.floor(uiAmount * Math.pow(10, decimals))\n return rawAmount.toString()\n } catch (error) {\n console.error('Failed to convert to raw amount:', error)\n return '0'\n }\n}\n\nexport const hasSufficientBalance = (\n balance: number,\n requiredAmount: number,\n buffer: number = 0.05\n): boolean => {\n const requiredWithBuffer = requiredAmount * (1 + buffer)\n return balance >= requiredWithBuffer\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useWallet } from '@solana/wallet-adapter-react'\nimport { Buffer } from 'buffer'\nimport {\n Connection,\n Transaction,\n VersionedTransaction,\n} from '@solana/web3.js'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport { useSolanaService } from './useSolanaService'\nimport {\n fetchSupportedTokenBalances,\n hasSufficientBalance,\n} from '../utils/solana'\n\ninterface UseSolanaDirectPaymentOptions {\n priceId: string\n tokenAmount: number\n selectedToken: TokenInfo | null\n supportedTokens: TokenInfo[]\n onStart: () => void\n onConfirming: () => void\n onSuccess: (result: SubmitPaymentResponse, txId: string) => void\n onError: (error: string) => void\n}\n\ninterface SolanaDirectPaymentState {\n isBalanceLoading: boolean\n isProcessing: boolean\n balanceLabel: string\n canPay: boolean\n pay: () => Promise<void>\n}\n\ninterface TokenBalanceState {\n balance: number\n hasBalance: boolean\n}\n\nexport const useSolanaDirectPayment = (\n options: UseSolanaDirectPaymentOptions\n): SolanaDirectPaymentState => {\n const { priceId, tokenAmount, selectedToken, supportedTokens, onStart, onConfirming, onSuccess, onError } = options\n const { connected, publicKey, wallet, signTransaction } = useWallet()\n const { config } = usePaymentContext()\n const solanaService = useSolanaService()\n\n const [tokenBalance, setTokenBalance] = useState<TokenBalanceState | null>(null)\n const [isBalanceLoading, setIsBalanceLoading] = useState(false)\n const [isProcessing, setIsProcessing] = useState(false)\n\n const connection = useMemo(() => {\n const rpc = config.solanaRpcUrl ?? 'https://api.mainnet-beta.solana.com'\n return new Connection(rpc)\n }, [config.solanaRpcUrl])\n\n const fetchTokenBalance = useCallback(async () => {\n if (!connected || !publicKey || !selectedToken) {\n setTokenBalance({ balance: 0, hasBalance: false })\n return\n }\n\n try {\n setIsBalanceLoading(true)\n const balances = await fetchSupportedTokenBalances(\n connection,\n publicKey,\n supportedTokens\n )\n const balanceInfo = balances.find(\n (tb) => tb.symbol === selectedToken.symbol || tb.mint === selectedToken.mint\n )\n\n const balance = balanceInfo?.balance || 0\n const hasBalanceFlag = hasSufficientBalance(balance, tokenAmount)\n\n setTokenBalance({ balance, hasBalance: hasBalanceFlag })\n } catch (error) {\n console.error('Failed to fetch token balance:', error)\n setTokenBalance({ balance: 0, hasBalance: false })\n } finally {\n setIsBalanceLoading(false)\n }\n }, [connected, publicKey, connection, selectedToken, tokenAmount, supportedTokens])\n\n useEffect(() => {\n if (connected && publicKey && selectedToken) {\n void fetchTokenBalance()\n }\n }, [connected, publicKey, selectedToken, tokenAmount, fetchTokenBalance])\n\n const decodeTransaction = useCallback((serialized: string) => {\n const buffer = Buffer.from(serialized, 'base64')\n try {\n return VersionedTransaction.deserialize(buffer)\n } catch (err) {\n try {\n return Transaction.from(buffer)\n } catch (legacyErr) {\n console.error('Failed to deserialize transaction', legacyErr)\n throw new Error('Invalid transaction payload received from server')\n }\n }\n }, [])\n\n const isVersionedTransaction = (tx: unknown): tx is VersionedTransaction => {\n return !!tx && typeof tx === 'object' && 'version' in tx\n }\n\n const signWithWallet = useCallback(\n async (tx: Transaction | VersionedTransaction) => {\n if (!wallet) {\n throw new Error('Wallet adapter is not available')\n }\n\n const adapter = wallet.adapter as unknown as {\n signTransaction?: (transaction: Transaction) => Promise<Transaction>\n signVersionedTransaction?: (\n transaction: VersionedTransaction\n ) => Promise<VersionedTransaction>\n supportedTransactionVersions?: Set<number | 'legacy'> | null\n }\n\n if (isVersionedTransaction(tx)) {\n if (adapter.supportedTransactionVersions) {\n const supported = adapter.supportedTransactionVersions\n if (!supported.has(tx.version)) {\n throw new Error('Connected wallet does not support this transaction version')\n }\n }\n\n if (adapter.signVersionedTransaction) {\n return adapter.signVersionedTransaction(tx)\n }\n }\n\n if (adapter.signTransaction) {\n return adapter.signTransaction(tx as Transaction)\n }\n\n if (signTransaction) {\n return signTransaction(tx as Transaction)\n }\n\n throw new Error('Connected wallet cannot sign transactions')\n },\n [wallet, signTransaction]\n )\n\n const pay = useCallback(async () => {\n if (!connected || !publicKey) {\n onError('Wallet not connected')\n return\n }\n\n if (!selectedToken) {\n onError('No payment token selected')\n return\n }\n\n if (!tokenBalance?.hasBalance) {\n onError('Insufficient balance for this token')\n return\n }\n\n try {\n setIsProcessing(true)\n onStart()\n\n const paymentData = await solanaService.generatePayment(\n priceId,\n selectedToken.symbol,\n publicKey.toBase58()\n )\n\n const transactionToSign = decodeTransaction(paymentData.transaction)\n const signedTx = await signWithWallet(transactionToSign)\n const signedSerialized = Buffer.from(signedTx.serialize()).toString('base64')\n\n onConfirming()\n\n const result = await solanaService.submitPayment(\n signedSerialized,\n priceId,\n paymentData.intent_id,\n `Payment for subscription - ${selectedToken.symbol}`\n )\n\n onSuccess(result, result.transaction_id)\n } catch (err) {\n console.error('Payment failed:', err)\n\n let errorMessage = 'Payment failed. Please try again.'\n const message =\n err instanceof Error ? err.message : typeof err === 'string' ? err : ''\n\n if (message.includes('User rejected')) {\n errorMessage = 'Payment cancelled by user'\n } else if (/insufficient\\s+funds/i.test(message)) {\n errorMessage = 'Insufficient balance for this token'\n } else if (message) {\n errorMessage = message\n }\n\n onError(errorMessage)\n } finally {\n setIsProcessing(false)\n }\n }, [\n connected,\n publicKey,\n selectedToken,\n tokenBalance?.hasBalance,\n onError,\n onStart,\n solanaService,\n priceId,\n decodeTransaction,\n signWithWallet,\n onConfirming,\n onSuccess,\n ])\n\n const balanceLabel = tokenBalance\n ? `${tokenBalance.balance.toFixed(4)} ${selectedToken?.symbol ?? ''}`\n : '--'\n\n return {\n isBalanceLoading,\n isProcessing,\n balanceLabel,\n canPay: Boolean(\n connected && tokenBalance?.hasBalance && !isProcessing\n ),\n pay,\n }\n}\n","import React from 'react'\nimport { Loader2, Wallet } from 'lucide-react'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { useSolanaDirectPayment } from '../hooks/useSolanaDirectPayment'\n\ninterface DirectPaymentProps {\n priceId: string\n tokenAmount: number\n selectedToken: TokenInfo | null\n supportedTokens: TokenInfo[]\n onPaymentStart: () => void\n onPaymentConfirming: () => void\n onPaymentSuccess: (result: SubmitPaymentResponse, txId: string) => void\n onPaymentError: (error: string) => void\n}\n\nexport const DirectPayment: React.FC<DirectPaymentProps> = ({\n priceId,\n tokenAmount,\n selectedToken,\n supportedTokens,\n onPaymentStart,\n onPaymentConfirming,\n onPaymentSuccess,\n onPaymentError,\n}) => {\n const { isBalanceLoading, balanceLabel, canPay, isProcessing, pay } =\n useSolanaDirectPayment({\n priceId,\n tokenAmount,\n selectedToken,\n supportedTokens,\n onStart: onPaymentStart,\n onConfirming: onPaymentConfirming,\n onSuccess: onPaymentSuccess,\n onError: onPaymentError,\n })\n\n return (\n <div className=\"payments-ui-panel\">\n <div className=\"payments-ui-panel-header\">\n <div>\n <p className=\"payments-ui-panel-title\">\n <Wallet className=\"payments-ui-icon\" /> Pay with connected wallet\n </p>\n <p className=\"payments-ui-panel-description\">\n Sign the transaction directly in your Solana wallet.\n </p>\n </div>\n </div>\n\n <div className=\"payments-ui-panel-body\">\n <div className=\"payments-ui-balance-row\">\n <span>Available balance</span>\n {isBalanceLoading ? (\n <Loader2 className=\"payments-ui-spinner\" />\n ) : (\n <strong>{balanceLabel}</strong>\n )}\n </div>\n\n <button\n type=\"button\"\n className=\"payments-ui-button\"\n disabled={!canPay}\n onClick={pay}\n >\n {isProcessing ? (\n <Loader2 className=\"payments-ui-spinner\" />\n ) : (\n <Wallet className=\"payments-ui-icon\" />\n )}\n {isProcessing ? 'Processing...' : 'Pay with wallet'}\n </button>\n </div>\n </div>\n )\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport QRCode from 'qrcode'\nimport type { TokenInfo, SubmitPaymentResponse } from '../types'\nimport type {\n SolanaPayQRCodeIntent,\n SolanaPayStatusResponse,\n} from '../types/solana-pay'\nimport { useSolanaService } from './useSolanaService'\n\ninterface UseSolanaQrPaymentOptions {\n priceId: string\n selectedToken: TokenInfo | null\n onSuccess: (result: SubmitPaymentResponse | string, txId: string) => void\n onError: (error: string) => void\n}\n\ninterface UseSolanaQrPaymentState {\n intent: SolanaPayQRCodeIntent | null\n qrDataUri: string | null\n isLoading: boolean\n error: string | null\n timeRemaining: number\n refresh: () => void\n}\n\nexport const useSolanaQrPayment = (\n options: UseSolanaQrPaymentOptions\n): UseSolanaQrPaymentState => {\n const { priceId, selectedToken, onSuccess, onError } = options\n const solanaService = useSolanaService()\n\n const [intent, setIntent] = useState<SolanaPayQRCodeIntent | null>(null)\n const [qrDataUri, setQrDataUri] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [timeRemaining, setTimeRemaining] = useState(0)\n\n const pollRef = useRef<NodeJS.Timeout | null>(null)\n const countdownRef = useRef<NodeJS.Timeout | null>(null)\n\n const clearTimers = useCallback(() => {\n if (pollRef.current) {\n clearInterval(pollRef.current)\n pollRef.current = null\n }\n if (countdownRef.current) {\n clearInterval(countdownRef.current)\n countdownRef.current = null\n }\n }, [])\n\n useEffect(() => {\n return () => {\n clearTimers()\n }\n }, [clearTimers])\n\n const handleError = useCallback(\n (message: string, notifyParent = false) => {\n clearTimers()\n setError(message)\n setIntent(null)\n setQrDataUri(null)\n setTimeRemaining(0)\n if (notifyParent) {\n onError(message)\n }\n },\n [clearTimers, onError]\n )\n\n const handleSuccess = useCallback(\n (status: SolanaPayStatusResponse) => {\n clearTimers()\n setTimeRemaining(0)\n setIntent(null)\n onSuccess(status.payment_id, status.transaction || '')\n },\n [clearTimers, onSuccess]\n )\n\n const pollStatus = useCallback(\n async (reference: string) => {\n try {\n const status = await solanaService.checkPaymentStatus(reference)\n\n if (status.status === 'confirmed') {\n handleSuccess(status)\n }\n\n if (status.status === 'failed') {\n handleError(\n status.error_message || 'Payment failed. Please try again.',\n true\n )\n }\n } catch (err) {\n console.error('Failed to poll Solana Pay status:', err)\n }\n },\n [handleError, handleSuccess, solanaService]\n )\n\n const startCountdown = useCallback(\n (expiresAt: number, reference: string) => {\n const updateTime = () => {\n const remaining = Math.max(0, Math.floor(expiresAt - Date.now() / 1000))\n setTimeRemaining(remaining)\n\n if (remaining === 0) {\n handleError('Payment intent expired. Please generate a new QR code.')\n }\n }\n\n updateTime()\n\n countdownRef.current = setInterval(updateTime, 1000)\n pollRef.current = setInterval(() => void pollStatus(reference), 4000)\n },\n [handleError, pollStatus]\n )\n\n const renderQr = useCallback(async (qrIntent: SolanaPayQRCodeIntent) => {\n try {\n const dataUri = await QRCode.toDataURL(qrIntent.url, {\n width: 320,\n margin: 1,\n color: {\n dark: '#0f1116',\n light: '#ffffff',\n },\n })\n setQrDataUri(dataUri)\n } catch (err) {\n console.error('Failed to render QR code:', err)\n handleError('Unable to render QR code')\n }\n }, [handleError])\n\n const fetchIntent = useCallback(async () => {\n if (!selectedToken) {\n setIntent(null)\n setQrDataUri(null)\n setError(null)\n clearTimers()\n setTimeRemaining(0)\n return\n }\n\n try {\n setIsLoading(true)\n setError(null)\n clearTimers()\n\n const nextIntent = await solanaService.generateQRCode(\n priceId,\n selectedToken.symbol\n )\n setIntent(nextIntent)\n setTimeRemaining(\n Math.max(0, Math.floor(nextIntent.expires_at - Date.now() / 1000))\n )\n await renderQr(nextIntent)\n startCountdown(nextIntent.expires_at, nextIntent.reference)\n pollStatus(nextIntent.reference)\n } catch (err) {\n console.error('Failed to generate Solana Pay QR intent:', err)\n const message =\n err instanceof Error\n ? err.message\n : 'Unable to create Solana Pay QR code'\n handleError(message)\n } finally {\n setIsLoading(false)\n }\n }, [\n clearTimers,\n handleError,\n pollStatus,\n priceId,\n selectedToken,\n solanaService,\n startCountdown,\n renderQr,\n ])\n\n useEffect(() => {\n void fetchIntent()\n }, [fetchIntent])\n\n return {\n intent,\n qrDataUri,\n isLoading,\n error,\n timeRemaining,\n refresh: fetchIntent,\n }\n}\n","import React from 'react'\nimport { Loader2, RefreshCw } from 'lucide-react'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { useSolanaQrPayment } from '../hooks/useSolanaQrPayment'\n\ninterface QRCodePaymentProps {\n priceId: string\n selectedToken: TokenInfo | null\n onPaymentError: (error: string) => void\n onPaymentSuccess: (result: SubmitPaymentResponse | string, txId: string) => void\n}\n\nexport const QRCodePayment: React.FC<QRCodePaymentProps> = ({\n priceId,\n selectedToken,\n onPaymentError,\n onPaymentSuccess,\n}) => {\n const { intent, qrDataUri, isLoading, error, timeRemaining, refresh } =\n useSolanaQrPayment({\n priceId,\n selectedToken,\n onError: onPaymentError,\n onSuccess: onPaymentSuccess,\n })\n\n if (!selectedToken) {\n return <div className=\"payments-ui-empty\">Select a token to continue.</div>\n }\n\n return (\n <div className=\"payments-ui-panel\">\n <div className=\"payments-ui-panel-header\">\n <div>\n <p className=\"payments-ui-panel-title\">Scan with Solana Pay</p>\n <p className=\"payments-ui-panel-description\">\n Use any Solana Pay compatible wallet to scan and confirm.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"payments-ui-icon-button\"\n onClick={() => refresh()}\n disabled={isLoading}\n >\n {isLoading ? (\n <Loader2 className=\"payments-ui-spinner\" />\n ) : (\n <RefreshCw className=\"payments-ui-icon\" />\n )}\n </button>\n </div>\n\n {error && <div className=\"payments-ui-error\">{error}</div>}\n\n <div className=\"payments-ui-qr-wrapper\">\n {qrDataUri ? (\n <img src={qrDataUri} alt=\"Solana Pay QR\" />\n ) : (\n <div className=\"payments-ui-empty\">\n {isLoading ? (\n <>\n <Loader2 className=\"payments-ui-spinner\" />\n Generating QR code...\n </>\n ) : (\n 'QR code unavailable'\n )}\n </div>\n )}\n </div>\n\n {intent && (\n <div className=\"payments-ui-countdown\">\n Expires in {timeRemaining}s · {intent.token_amount}{' '}\n {intent.token_symbol}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { CheckCircle, Loader2, XCircle, RotateCcw } from 'lucide-react'\n\ninterface PaymentStatusProps {\n state: 'selecting' | 'processing' | 'confirming' | 'success' | 'error'\n usdAmount: number\n solAmount: number\n errorMessage?: string | null\n transactionId?: string | null\n onRetry: () => void\n onClose: () => void\n}\n\nexport const PaymentStatus: React.FC<PaymentStatusProps> = ({\n state,\n usdAmount,\n solAmount,\n errorMessage,\n transactionId,\n onRetry,\n onClose,\n}) => {\n if (state === 'success') {\n return (\n <div className=\"payments-ui-status success\">\n <CheckCircle className=\"payments-ui-status-icon\" />\n <h3>Payment confirmed</h3>\n <p>\n {usdAmount.toFixed(2)} USD (~{solAmount.toFixed(4)} SOL).\n </p>\n {transactionId && (\n <p className=\"payments-ui-status-meta\">Txn: {transactionId}</p>\n )}\n <button className=\"payments-ui-button\" type=\"button\" onClick={onClose}>\n Close\n </button>\n </div>\n )\n }\n\n if (state === 'error') {\n return (\n <div className=\"payments-ui-status error\">\n <XCircle className=\"payments-ui-status-icon\" />\n <h3>Payment failed</h3>\n <p>{errorMessage ?? 'Please try again.'}</p>\n <div className=\"payments-ui-status-actions\">\n <button className=\"payments-ui-button\" type=\"button\" onClick={onRetry}>\n <RotateCcw className=\"payments-ui-icon\" /> Retry\n </button>\n <button className=\"payments-ui-text-button\" type=\"button\" onClick={onClose}>\n Cancel\n </button>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"payments-ui-status pending\">\n <Loader2 className=\"payments-ui-spinner\" />\n <h3>\n {state === 'confirming'\n ? 'Waiting for confirmations'\n : 'Processing payment'}\n </h3>\n <p>\n Paying {usdAmount.toFixed(2)} USD (~{solAmount.toFixed(4)} SOL).\n </p>\n <p className=\"payments-ui-status-meta\">\n This can take up to 60 seconds on Solana mainnet.\n </p>\n </div>\n )\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport { TokenInfo } from '../types'\nimport { useSolanaService } from './useSolanaService'\n\nexport const useSupportedTokens = () => {\n const solanaService = useSolanaService()\n const [tokens, setTokens] = useState<TokenInfo[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [lastFetched, setLastFetched] = useState<number | null>(null)\n\n // Cache duration: 5 minutes\n const CACHE_DURATION = 5 * 60 * 1000\n\n // Use refs to avoid dependency issues\n const tokensRef = useRef(tokens)\n const lastFetchedRef = useRef(lastFetched)\n\n // Update refs when state changes\n tokensRef.current = tokens\n lastFetchedRef.current = lastFetched\n\n // Fetch supported tokens from backend\n const fetchSupportedTokens = useCallback(async () => {\n // Check if we have fresh cached data\n if (\n tokensRef.current.length > 0 &&\n lastFetchedRef.current &&\n Date.now() - lastFetchedRef.current < CACHE_DURATION\n ) {\n return tokensRef.current\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const tokens = await solanaService.getSupportedTokens()\n\n // Sort tokens by symbol for consistent ordering\n const sortedTokens = [...tokens].sort((a, b) =>\n a.symbol.localeCompare(b.symbol)\n )\n\n setTokens(sortedTokens)\n setLastFetched(Date.now())\n return sortedTokens\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch supported tokens'\n setError(errorMessage)\n console.error('Failed to fetch supported tokens:', error)\n\n // Return empty array on error\n return []\n } finally {\n setIsLoading(false)\n }\n }, [solanaService])\n\n // Auto-fetch on mount\n useEffect(() => {\n if (tokens.length === 0) {\n fetchSupportedTokens()\n }\n }, [tokens.length, fetchSupportedTokens])\n\n // Get token by symbol\n const getTokenBySymbol = useCallback(\n (symbol: string): TokenInfo | undefined => {\n return tokens.find((token) => token.symbol === symbol)\n },\n [tokens]\n )\n\n // Get token by mint address\n const getTokenByMint = useCallback(\n (mintAddress: string): TokenInfo | undefined => {\n return tokens.find((token) => token.mint === mintAddress)\n },\n [tokens]\n )\n\n // Check if a token is supported\n const isTokenSupported = useCallback(\n (symbol: string): boolean => {\n return tokens.some((token) => token.symbol === symbol)\n },\n [tokens]\n )\n\n // Get USDC token (primary stablecoin)\n const getUSDCToken = useCallback((): TokenInfo | undefined => {\n return getTokenBySymbol('USDC')\n }, [getTokenBySymbol])\n\n // Get PYUSD token (secondary stablecoin)\n const getPYUSDToken = useCallback((): TokenInfo | undefined => {\n return getTokenBySymbol('PYUSD')\n }, [getTokenBySymbol])\n\n // Get SOL token (native token)\n const getSOLToken = useCallback((): TokenInfo | undefined => {\n return getTokenBySymbol('SOL')\n }, [getTokenBySymbol])\n\n // Get all stablecoins\n const getStablecoins = useCallback((): TokenInfo[] => {\n return tokens.filter((token) => ['USDC', 'PYUSD'].includes(token.symbol))\n }, [tokens])\n\n // Refresh tokens (bypass cache)\n const refreshTokens = useCallback(async () => {\n setLastFetched(null) // Clear cache\n return await fetchSupportedTokens()\n }, [fetchSupportedTokens])\n\n // Check if cache is stale\n const isCacheStale = useCallback((): boolean => {\n if (!lastFetched) return true\n return Date.now() - lastFetched > CACHE_DURATION\n }, [lastFetched])\n\n // Get token with formatted info for display\n const getTokenDisplayInfo = useCallback((token: TokenInfo) => {\n return {\n ...token,\n displayName: `${token.name} (${token.symbol})`,\n shortAddress: `${token.mint.slice(0, 4)}...${token.mint.slice(-4)}`,\n decimalPlaces: token.decimals,\n }\n }, [])\n\n const getTokenPrice = useCallback(\n (symbol: string): number => {\n const token = getTokenBySymbol(symbol)\n if (!token) return 0\n const price =\n token.price ?? 0\n return typeof price === 'number' ? price : Number(price)\n },\n [getTokenBySymbol]\n )\n\n // Calculate token amount from USD amount\n const calculateTokenAmount = useCallback(\n (usdAmount: number, tokenSymbol: string): string => {\n const token = getTokenBySymbol(tokenSymbol)\n const price = getTokenPrice(tokenSymbol)\n\n if (!token || price === 0) return '0'\n\n const tokenAmount = usdAmount / price\n const tokenAmountInSmallestUnit =\n tokenAmount * Math.pow(10, token.decimals)\n\n return Math.floor(tokenAmountInSmallestUnit).toString()\n },\n [getTokenBySymbol, getTokenPrice]\n )\n\n // Format token amount for display\n const formatTokenAmount = useCallback(\n (amount: string, tokenSymbol: string): string => {\n const token = getTokenBySymbol(tokenSymbol)\n if (!token) return '0'\n\n const numericAmount = parseFloat(amount)\n const displayAmount = numericAmount / Math.pow(10, token.decimals)\n\n return displayAmount.toFixed(token.decimals <= 6 ? token.decimals : 6)\n },\n [getTokenBySymbol]\n )\n\n return {\n tokens,\n isLoading,\n error,\n lastFetched,\n fetchSupportedTokens,\n refreshTokens,\n getTokenBySymbol,\n getTokenByMint,\n isTokenSupported,\n getUSDCToken,\n getPYUSDToken,\n getSOLToken,\n getStablecoins,\n getTokenDisplayInfo,\n getTokenPrice,\n calculateTokenAmount,\n formatTokenAmount,\n isCacheStale,\n hasTokens: tokens.length > 0,\n tokenCount: tokens.length,\n }\n}\n","import { useStore } from 'zustand'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { PaymentStoreState } from '../state/paymentStore'\n\nexport const usePaymentStore = <T>(\n selector: (state: PaymentStoreState) => T\n): T => {\n const { store } = usePaymentContext()\n return useStore(store, selector)\n}\n","import type { PaymentStoreState } from './paymentStore'\n\nexport const selectCheckoutFlow = (state: PaymentStoreState) => ({\n selectedMethodId: state.selectedMethodId,\n savedStatus: state.savedPaymentStatus,\n savedError: state.savedPaymentError,\n newCardStatus: state.newCardStatus,\n newCardError: state.newCardError,\n solanaModalOpen: state.solanaModalOpen,\n setSelectedMethod: state.setSelectedMethod,\n setSolanaModalOpen: state.setSolanaModalOpen,\n startSavedPayment: state.startSavedPayment,\n completeSavedPayment: state.completeSavedPayment,\n failSavedPayment: state.failSavedPayment,\n startNewCardPayment: state.startNewCardPayment,\n completeNewCardPayment: state.completeNewCardPayment,\n failNewCardPayment: state.failNewCardPayment,\n resetSavedPayment: state.resetSavedPayment,\n})\n\nexport const selectSolanaFlow = (state: PaymentStoreState) => ({\n tab: state.solanaTab,\n status: state.solanaStatus,\n error: state.solanaError,\n transactionId: state.solanaTransactionId,\n tokenAmount: state.solanaTokenAmount,\n selectedTokenSymbol: state.solanaSelectedToken,\n setTab: state.setSolanaTab,\n setTokenAmount: state.setSolanaTokenAmount,\n setTransactionId: state.setSolanaTransactionId,\n setSelectedTokenSymbol: state.setSolanaSelectedToken,\n startSolanaPayment: state.startSolanaPayment,\n confirmSolanaPayment: state.confirmSolanaPayment,\n completeSolanaPayment: state.completeSolanaPayment,\n failSolanaPayment: state.failSolanaPayment,\n resetSolanaPayment: state.resetSolanaPayment,\n})\n","import React, { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useWallet } from '@solana/wallet-adapter-react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { CreditCard, Loader2, X } from 'lucide-react'\nimport { DirectPayment } from './DirectPayment'\nimport { QRCodePayment } from './QRCodePayment'\nimport { PaymentStatus } from './PaymentStatus'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { useSupportedTokens } from '../hooks/useSupportedTokens'\nimport { usePaymentStore } from '../hooks/usePaymentStore'\nimport { selectSolanaFlow } from '../state/selectors'\n\ninterface SolanaPaymentSelectorProps {\n isOpen: boolean\n priceId: string\n usdAmount: number\n onClose: () => void\n onError?: (error: string) => void\n onSuccess: (result: SubmitPaymentResponse | string) => void\n}\n\nexport const SolanaPaymentSelector: React.FC<SolanaPaymentSelectorProps> = ({\n isOpen,\n onClose,\n priceId,\n usdAmount,\n onSuccess,\n onError,\n}) => {\n const { connected } = useWallet()\n const {\n tab: activeTab,\n status: paymentState,\n error: errorMessage,\n transactionId,\n tokenAmount,\n selectedTokenSymbol,\n setTab,\n setTokenAmount,\n setTransactionId,\n setSelectedTokenSymbol,\n startSolanaPayment,\n confirmSolanaPayment,\n completeSolanaPayment,\n failSolanaPayment,\n resetSolanaPayment,\n } = usePaymentStore(selectSolanaFlow)\n\n const {\n tokens,\n isLoading: tokensLoading,\n error: tokensError,\n } = useSupportedTokens()\n\n const selectedToken = useMemo<TokenInfo | null>(() => {\n if (!tokens.length) return null\n const explicit = tokens.find((token) => token.symbol === selectedTokenSymbol)\n return explicit || tokens[0]\n }, [tokens, selectedTokenSymbol])\n\n useEffect(() => {\n if (!selectedTokenSymbol && tokens.length) {\n const defaultToken =\n tokens.find((token) => token.symbol === 'SOL') || tokens[0]\n setSelectedTokenSymbol(defaultToken.symbol)\n }\n }, [tokens, selectedTokenSymbol, setSelectedTokenSymbol])\n\n const handlePaymentStart = useCallback(() => {\n startSolanaPayment()\n }, [startSolanaPayment])\n\n const handlePaymentConfirming = useCallback(() => {\n confirmSolanaPayment()\n }, [confirmSolanaPayment])\n\n const handlePaymentSuccess = useCallback(\n (result: SubmitPaymentResponse | string, txId?: string) => {\n const resolvedTx = txId ||\n (typeof result === 'string' ? result : result.transaction_id)\n setTransactionId(resolvedTx)\n completeSolanaPayment(\n typeof result === 'string'\n ? {\n transactionId: resolvedTx,\n processor: 'solana',\n metadata: { source: 'solana-pay' },\n }\n : {\n transactionId: result.transaction_id,\n intentId: result.intent_id,\n processor: 'solana',\n metadata: {\n purchaseId: result.purchase_id,\n amount: result.amount,\n currency: result.currency,\n },\n }\n )\n\n setTimeout(() => {\n onSuccess(result)\n }, 1500)\n },\n [completeSolanaPayment, onSuccess, setTransactionId]\n )\n\n const handlePaymentError = useCallback(\n (error: string) => {\n failSolanaPayment(error)\n onError?.(error)\n },\n [failSolanaPayment, onError]\n )\n\n const handleRetry = useCallback(() => {\n resetSolanaPayment()\n setTransactionId(null)\n }, [resetSolanaPayment, setTransactionId])\n\n const handleClose = useCallback(() => {\n if (paymentState === 'processing' || paymentState === 'confirming') {\n return\n }\n\n resetSolanaPayment()\n setTransactionId(null)\n onClose()\n }, [paymentState, resetSolanaPayment, setTransactionId, onClose])\n\n useEffect(() => {\n if (!isOpen || !selectedToken || usdAmount === 0) {\n setTokenAmount(0)\n return\n }\n\n const price = selectedToken.price ?? 0\n if (!price || price <= 0) {\n setTokenAmount(0)\n return\n }\n\n setTokenAmount(usdAmount / price)\n }, [isOpen, usdAmount, selectedToken, setTokenAmount])\n\n const handleTokenChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n setSelectedTokenSymbol(event.target.value)\n },\n [setSelectedTokenSymbol]\n )\n\n const wasConnectedRef = useRef(connected)\n\n useEffect(() => {\n if (connected && !wasConnectedRef.current) {\n setTab('wallet')\n }\n\n if (!connected && wasConnectedRef.current) {\n setTab('qr')\n }\n\n wasConnectedRef.current = connected\n }, [connected, setTab])\n\n const renderSelector = () => {\n if (tokensLoading) {\n return (\n <div className=\"payments-ui-empty\">\n <Loader2 className=\"payments-ui-spinner\" /> Loading tokens…\n </div>\n )\n }\n\n if (tokensError) {\n return <div className=\"payments-ui-error\">{tokensError}</div>\n }\n\n if (!tokens.length) {\n return <div className=\"payments-ui-empty\">No payment tokens available.</div>\n }\n\n return (\n <div className=\"payments-ui-token-select\">\n <label>\n Payment token\n <select value={selectedTokenSymbol ?? ''} onChange={handleTokenChange}>\n {tokens.map((token) => (\n <option key={token.symbol} value={token.symbol}>\n {token.name} ({token.symbol})\n </option>\n ))}\n </select>\n </label>\n <p className=\"payments-ui-token-meta\">\n ≈ {tokenAmount.toFixed(4)} {selectedToken?.symbol}\n </p>\n </div>\n )\n }\n\n if (paymentState !== 'selecting') {\n return (\n <Dialog.Root open={isOpen} onOpenChange={handleClose}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"payments-ui-modal-overlay\" />\n <Dialog.Content className=\"payments-ui-modal\">\n <div className=\"payments-ui-modal-header\">\n <div>\n <h3>Complete your payment</h3>\n <p>Follow the prompts below to finish.</p>\n </div>\n <Dialog.Close\n className=\"payments-ui-icon-button\"\n disabled={paymentState === 'processing' || paymentState === 'confirming'}\n >\n <X className=\"payments-ui-icon\" />\n </Dialog.Close>\n </div>\n <PaymentStatus\n state={paymentState}\n usdAmount={usdAmount}\n solAmount={tokenAmount}\n onRetry={handleRetry}\n onClose={handleClose}\n errorMessage={errorMessage}\n transactionId={transactionId}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n }\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={handleClose}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"payments-ui-modal-overlay\" />\n <Dialog.Content className=\"payments-ui-modal\">\n <div className=\"payments-ui-modal-header\">\n <div>\n <h3>Complete your payment</h3>\n <p>Select a token and preferred method.</p>\n </div>\n <Dialog.Close className=\"payments-ui-icon-button\">\n <X className=\"payments-ui-icon\" />\n </Dialog.Close>\n </div>\n\n <div className=\"payments-ui-tab-header\">\n <button\n type=\"button\"\n className={activeTab === 'wallet' ? 'active' : ''}\n onClick={() => setTab('wallet')}\n disabled={!connected}\n >\n Pay with wallet\n </button>\n <button\n type=\"button\"\n className={activeTab === 'qr' ? 'active' : ''}\n onClick={() => setTab('qr')}\n >\n Scan QR\n </button>\n </div>\n\n {renderSelector()}\n\n {activeTab === 'wallet' ? (\n <DirectPayment\n priceId={priceId}\n tokenAmount={tokenAmount}\n selectedToken={selectedToken}\n supportedTokens={tokens}\n onPaymentStart={handlePaymentStart}\n onPaymentConfirming={handlePaymentConfirming}\n onPaymentSuccess={handlePaymentSuccess}\n onPaymentError={handlePaymentError}\n />\n ) : (\n <QRCodePayment\n priceId={priceId}\n selectedToken={selectedToken}\n onPaymentError={handlePaymentError}\n onPaymentSuccess={handlePaymentSuccess}\n />\n )}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import React from 'react'\nimport { CreditCard, Sparkles } from 'lucide-react'\nimport type { BillingDetails, PaymentMethod, SubmitPaymentResponse } from '../types'\nimport { CardDetailsForm } from './CardDetailsForm'\nimport { StoredPaymentMethods } from './StoredPaymentMethods'\nimport { SolanaPaymentSelector } from './SolanaPaymentSelector'\nimport { usePaymentStore } from '../hooks/usePaymentStore'\nimport { selectCheckoutFlow } from '../state/selectors'\n\nexport interface PaymentExperienceProps {\n priceId: string\n usdAmount: number\n onNewCardPayment?: (payload: {\n token: string\n billing: BillingDetails\n }) => Promise<void> | void\n onSavedMethodPayment?: (payload: {\n paymentMethodId: string\n amount: number\n }) => Promise<void> | void\n enableNewCard?: boolean\n enableStoredMethods?: boolean\n enableSolanaPay?: boolean\n checkoutSummary?: React.ReactNode\n onSolanaSuccess?: (result: SubmitPaymentResponse | string) => void\n onSolanaError?: (error: string) => void\n}\n\nexport const PaymentExperience: React.FC<PaymentExperienceProps> = ({\n priceId,\n usdAmount,\n onNewCardPayment,\n onSavedMethodPayment,\n enableNewCard = true,\n enableStoredMethods = true,\n enableSolanaPay = true,\n checkoutSummary,\n onSolanaSuccess,\n onSolanaError,\n}) => {\n const showNewCard = enableNewCard && Boolean(onNewCardPayment)\n const showStored = enableStoredMethods\n\n const {\n selectedMethodId,\n savedStatus,\n savedError,\n newCardStatus,\n newCardError,\n solanaModalOpen,\n setSelectedMethod,\n setSolanaModalOpen,\n startSavedPayment,\n completeSavedPayment,\n failSavedPayment,\n startNewCardPayment,\n completeNewCardPayment,\n failNewCardPayment,\n resetSavedPayment,\n } = usePaymentStore(selectCheckoutFlow)\n\n const handleMethodSelect = (method: PaymentMethod) => {\n setSelectedMethod(method.id)\n resetSavedPayment()\n }\n\n const handleNewCardTokenize = async (token: string, billing: BillingDetails) => {\n if (!onNewCardPayment) return\n try {\n startNewCardPayment()\n await onNewCardPayment({ token, billing })\n completeNewCardPayment()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unable to complete payment'\n failNewCardPayment(message)\n }\n }\n\n const handleSavedPayment = async () => {\n if (!onSavedMethodPayment || !selectedMethodId) return\n try {\n startSavedPayment()\n await onSavedMethodPayment({\n paymentMethodId: selectedMethodId,\n amount: usdAmount,\n })\n completeSavedPayment()\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : 'Unable to complete payment with saved card'\n failSavedPayment(message)\n }\n }\n\n return (\n <div className=\"payments-ui-experience\">\n <header className=\"payments-ui-experience-header\">\n <div>\n <h2>\n <CreditCard className=\"payments-ui-icon\" /> Secure checkout\n </h2>\n <p>Amount due: ${usdAmount.toFixed(2)}</p>\n </div>\n {checkoutSummary && <div className=\"payments-ui-summary\">{checkoutSummary}</div>}\n </header>\n\n <div className=\"payments-ui-experience-grid\">\n {showStored && (\n <div className=\"payments-ui-column\">\n <StoredPaymentMethods\n selectedMethodId={selectedMethodId}\n onMethodSelect={handleMethodSelect}\n heading=\"Saved cards\"\n description=\"Use or manage your saved payment methods.\"\n />\n {onSavedMethodPayment && (\n <button\n type=\"button\"\n className=\"payments-ui-button\"\n disabled={!selectedMethodId || savedStatus === 'processing'}\n onClick={handleSavedPayment}\n >\n {savedStatus === 'processing' ? 'Processing…' : 'Pay with selected card'}\n </button>\n )}\n {savedError && <p className=\"payments-ui-error\">{savedError}</p>}\n </div>\n )}\n\n {showNewCard && (\n <div className=\"payments-ui-column\">\n <div className=\"payments-ui-panel\">\n <div className=\"payments-ui-panel-header\">\n <div>\n <p className=\"payments-ui-panel-title\">\n <CreditCard className=\"payments-ui-icon\" /> Pay with a new card\n </p>\n <p className=\"payments-ui-panel-description\">\n Card details are tokenized via Collect.js and never hit your server.\n </p>\n </div>\n </div>\n <CardDetailsForm\n visible\n submitLabel=\"Pay now\"\n submitting={newCardStatus === 'processing'}\n externalError={newCardError}\n onTokenize={handleNewCardTokenize}\n />\n </div>\n </div>\n )}\n </div>\n\n {enableSolanaPay && (\n <div className=\"payments-ui-solana-banner\">\n <div>\n <h3>\n <Sparkles className=\"payments-ui-icon\" /> Prefer Solana Pay?\n </h3>\n <p>Use a Solana wallet or QR code for instant settlement.</p>\n </div>\n <button\n type=\"button\"\n className=\"payments-ui-button\"\n onClick={() => setSolanaModalOpen(true)}\n >\n Open Solana Pay\n </button>\n </div>\n )}\n\n {enableSolanaPay && (\n <SolanaPaymentSelector\n isOpen={solanaModalOpen}\n onClose={() => setSolanaModalOpen(false)}\n priceId={priceId}\n usdAmount={usdAmount}\n onSuccess={(result) => {\n setSolanaModalOpen(false)\n onSolanaSuccess?.(result)\n }}\n onError={onSolanaError}\n />\n )}\n </div>\n )\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react'\nimport { useWallet, useConnection } from '@solana/wallet-adapter-react'\nimport { PublicKey } from '@solana/web3.js'\nimport { getAssociatedTokenAddress, getAccount } from '@solana/spl-token'\nimport { TokenBalance, TokenInfo } from '../types'\n\nexport const useTokenBalance = (tokens: TokenInfo[]) => {\n const { publicKey } = useWallet()\n const { connection } = useConnection()\n\n const [balances, setBalances] = useState<TokenBalance[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Fetch balance for a specific token\n const fetchTokenBalance = useCallback(\n async (\n token: TokenInfo,\n walletAddress: PublicKey\n ): Promise<TokenBalance> => {\n try {\n const mintPublicKey = new PublicKey(token.mint)\n\n // Get the associated token account address\n const associatedTokenAddress = await getAssociatedTokenAddress(\n mintPublicKey,\n walletAddress\n )\n\n try {\n // Get the token account info\n const tokenAccount = await getAccount(\n connection,\n associatedTokenAddress\n )\n\n const balance = Number(tokenAccount.amount)\n const uiAmount = balance / Math.pow(10, token.decimals)\n\n return {\n token,\n balance,\n uiAmount,\n hasBalance: balance > 0,\n }\n } catch (accountError) {\n // Account doesn't exist, balance is 0\n return {\n token,\n balance: 0,\n uiAmount: 0,\n hasBalance: false,\n }\n }\n } catch (error) {\n console.error(`Failed to fetch balance for ${token.symbol}:`, error)\n return {\n token,\n balance: 0,\n uiAmount: 0,\n hasBalance: false,\n }\n }\n },\n [connection]\n )\n\n // Memoize token serialization to prevent unnecessary refetches\n const tokensKey = useMemo(() => tokens.map((t) => t.mint).join(','), [tokens])\n\n // Auto-fetch balances when wallet or tokens change\n useEffect(() => {\n if (!publicKey || tokens.length === 0) {\n setBalances([])\n return\n }\n\n setIsLoading(true)\n setError(null)\n\n const fetchAllBalances = async () => {\n try {\n const balancePromises = tokens.map((token) =>\n fetchTokenBalance(token, publicKey)\n )\n const tokenBalances = await Promise.all(balancePromises)\n\n setBalances(tokenBalances)\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch token balances'\n setError(errorMessage)\n console.error('Failed to fetch token balances:', error)\n } finally {\n setIsLoading(false)\n }\n }\n\n fetchAllBalances()\n }, [publicKey, tokensKey, fetchTokenBalance]) // Use stable dependencies\n\n // Get balance for a specific token\n const getTokenBalance = useCallback(\n (tokenSymbol: string): TokenBalance | undefined => {\n return balances.find((balance) => balance.token.symbol === tokenSymbol)\n },\n [balances]\n )\n\n // Check if user has sufficient balance for a payment\n const hasSufficientBalance = useCallback(\n (tokenSymbol: string, requiredAmount: number): boolean => {\n const balance = getTokenBalance(tokenSymbol)\n return balance ? balance.uiAmount >= requiredAmount : false\n },\n [getTokenBalance]\n )\n\n // Get formatted balance string\n const getFormattedBalance = useCallback(\n (tokenSymbol: string): string => {\n const balance = getTokenBalance(tokenSymbol)\n if (!balance) return '0.00'\n\n // Format with appropriate decimal places\n if (balance.uiAmount < 0.01) {\n return balance.uiAmount.toFixed(6)\n } else if (balance.uiAmount < 1) {\n return balance.uiAmount.toFixed(4)\n } else {\n return balance.uiAmount.toFixed(2)\n }\n },\n [getTokenBalance]\n )\n\n // Refresh balances manually\n const refreshBalances = useCallback(async () => {\n if (!publicKey || tokens.length === 0) {\n setBalances([])\n return\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const balancePromises = tokens.map((token) =>\n fetchTokenBalance(token, publicKey)\n )\n const tokenBalances = await Promise.all(balancePromises)\n\n setBalances(tokenBalances)\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch token balances'\n setError(errorMessage)\n console.error('Failed to fetch token balances:', error)\n } finally {\n setIsLoading(false)\n }\n }, [publicKey, tokens, fetchTokenBalance])\n\n // Get total USD value of balances (would need price data)\n const getTotalValue = useCallback(\n (priceData?: Record<string, number>): number => {\n if (!priceData) return 0\n\n return balances.reduce((total, balance) => {\n const price = priceData[balance.token.symbol] || 0\n return total + balance.uiAmount * price\n }, 0)\n },\n [balances]\n )\n\n // Sort balances by amount (highest first)\n const sortedBalances = [...balances].sort((a, b) => b.uiAmount - a.uiAmount)\n\n // Get balances with positive amounts only\n const positiveBalances = balances.filter((balance) => balance.hasBalance)\n\n return {\n balances: sortedBalances,\n positiveBalances,\n isLoading,\n error,\n refreshBalances,\n getTokenBalance,\n hasSufficientBalance,\n getFormattedBalance,\n getTotalValue,\n hasAnyBalance: positiveBalances.length > 0,\n isConnected: !!publicKey,\n }\n}\n","import { useState, useCallback } from 'react'\nimport { useWallet } from '@solana/wallet-adapter-react'\nimport { Transaction } from '@solana/web3.js'\nimport { Buffer } from 'buffer'\nimport { TokenInfo, SubmitPaymentResponse } from '../types'\nimport { useSolanaService } from './useSolanaService'\n\ninterface DirectPaymentState {\n loading: boolean\n error: string | null\n success: boolean\n transactionId: string | null\n}\n\ninterface UseDirectWalletPaymentReturn {\n paymentState: DirectPaymentState\n payWithWallet: (token: TokenInfo, priceId: string) => Promise<void>\n resetPayment: () => void\n}\n\nexport const useDirectWalletPayment = (): UseDirectWalletPaymentReturn => {\n const { publicKey, signTransaction, connected } = useWallet()\n const solanaService = useSolanaService()\n\n const [paymentState, setPaymentState] = useState<DirectPaymentState>({\n loading: false,\n error: null,\n success: false,\n transactionId: null,\n })\n\n const resetPayment = useCallback(() => {\n setPaymentState({\n loading: false,\n error: null,\n success: false,\n transactionId: null,\n })\n }, [])\n\n const payWithWallet = useCallback(\n async (token: TokenInfo, priceId: string) => {\n if (!connected || !publicKey || !signTransaction) {\n setPaymentState((prev) => ({\n ...prev,\n error: 'Wallet not connected. Please connect your wallet first.',\n }))\n return\n }\n\n setPaymentState({\n loading: true,\n error: null,\n success: false,\n transactionId: null,\n })\n\n try {\n console.log('Generating payment transaction...', {\n token: token.symbol,\n priceId,\n })\n const paymentData = await solanaService.generatePayment(\n priceId,\n token.symbol,\n publicKey.toBase58()\n )\n\n const transactionBuffer = Buffer.from(paymentData.transaction, 'base64')\n const transaction = Transaction.from(transactionBuffer)\n\n console.log('Requesting wallet signature...')\n const signedTransaction = await signTransaction(transaction)\n\n const signedTransactionBase64 = signedTransaction\n .serialize()\n .toString('base64')\n\n console.log('Submitting signed transaction...')\n const submitResult: SubmitPaymentResponse = await solanaService.submitPayment(\n signedTransactionBase64,\n priceId,\n paymentData.intent_id\n )\n\n setPaymentState({\n loading: false,\n error: null,\n success: true,\n transactionId: submitResult.transaction_id,\n })\n\n console.log('Payment successful!', submitResult)\n } catch (err: unknown) {\n console.error('Payment failed:', err)\n\n let errorMessage = 'Payment failed. Please try again.'\n const message =\n err instanceof Error ? err.message : typeof err === 'string' ? err : ''\n\n if (message.includes('User rejected')) {\n errorMessage = 'Payment cancelled by user.'\n } else if (/insufficient\\s+funds/i.test(message)) {\n errorMessage = `Insufficient ${token.symbol} balance.`\n } else if (/network/i.test(message)) {\n errorMessage = 'Network error. Please check your connection.'\n } else if (message) {\n errorMessage = message\n }\n\n setPaymentState({\n loading: false,\n error: errorMessage,\n success: false,\n transactionId: null,\n })\n }\n },\n [connected, publicKey, signTransaction, solanaService]\n )\n\n return {\n paymentState,\n payWithWallet,\n resetPayment,\n }\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport { useConnection } from '@solana/wallet-adapter-react'\nimport { TransactionStatus, PaymentStatusResponse } from '../types'\nimport { usePaymentContext } from '../context/PaymentContext'\n\ninterface PaymentStatusHookOptions {\n transactionId?: string\n purchaseId?: string\n onConfirmed?: () => void\n onFailed?: (error: string) => void\n maxRetries?: number\n retryInterval?: number // milliseconds\n}\n\nexport const usePaymentStatus = (options: PaymentStatusHookOptions = {}) => {\n const { connection } = useConnection()\n const { services } = usePaymentContext()\n const billingApi = services.billingApi\n const {\n transactionId,\n purchaseId,\n onConfirmed,\n onFailed,\n maxRetries = 30, // 5 minutes with 10s intervals\n retryInterval = 10000, // 10 seconds\n } = options\n\n const [status, setStatus] = useState<TransactionStatus | null>(null)\n const [paymentStatus, setPaymentStatus] =\n useState<PaymentStatusResponse | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [retryCount, setRetryCount] = useState(0)\n\n const intervalRef = useRef<NodeJS.Timeout | null>(null)\n const isMonitoringRef = useRef(false)\n\n // Clear interval on unmount\n useEffect(() => {\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, [])\n\n // Check transaction status on Solana blockchain\n const checkTransactionStatus = useCallback(\n async (signature: string): Promise<TransactionStatus> => {\n try {\n const statusResponse = await connection.getSignatureStatus(signature, {\n searchTransactionHistory: true,\n })\n\n if (statusResponse.value === null) {\n return {\n signature,\n confirmationStatus: 'processed',\n confirmations: 0,\n error: 'Transaction not found',\n }\n }\n\n const { confirmationStatus, confirmations, slot, err } =\n statusResponse.value\n\n // Get block time if we have a slot\n let blockTime: number | undefined\n if (slot) {\n try {\n blockTime = (await connection.getBlockTime(slot)) || undefined\n } catch (error) {\n // Block time not available\n }\n }\n\n return {\n signature,\n confirmationStatus: err\n ? 'failed'\n : confirmationStatus || 'processed',\n confirmations: confirmations || 0,\n slot,\n blockTime,\n error: err ? `Transaction failed: ${err}` : undefined,\n }\n } catch (error) {\n console.error('Failed to check transaction status:', error)\n return {\n signature,\n confirmationStatus: 'failed',\n confirmations: 0,\n error:\n error instanceof Error\n ? error.message\n : 'Failed to check transaction status',\n }\n }\n },\n [connection]\n )\n\n // Check payment status from backend\n const checkPaymentStatus = useCallback(\n async (id: string): Promise<PaymentStatusResponse | null> => {\n try {\n const data = await billingApi.get<PaymentStatusResponse>(\n `/payment/status/${id}`\n )\n return data\n } catch (error: any) {\n if (error?.status === 404) {\n return null // Payment not found\n }\n console.error('Failed to check payment status:', error)\n return null\n }\n },\n [billingApi]\n )\n\n // Monitor transaction until confirmed or failed\n const startMonitoring = useCallback(async () => {\n if (isMonitoringRef.current || (!transactionId && !purchaseId)) {\n return\n }\n\n isMonitoringRef.current = true\n setIsLoading(true)\n setError(null)\n setRetryCount(0)\n\n const monitor = async () => {\n try {\n let currentStatus: TransactionStatus | null = null\n let currentPaymentStatus: PaymentStatusResponse | null = null\n\n // Check blockchain status if we have a transaction ID\n if (transactionId) {\n currentStatus = await checkTransactionStatus(transactionId)\n setStatus(currentStatus)\n }\n\n // Check backend payment status if we have a purchase ID\n if (purchaseId) {\n currentPaymentStatus = await checkPaymentStatus(purchaseId)\n setPaymentStatus(currentPaymentStatus)\n }\n\n // Determine if we should stop monitoring\n const isBlockchainConfirmed =\n currentStatus?.confirmationStatus === 'finalized' ||\n currentStatus?.confirmationStatus === 'confirmed'\n const isBackendConfirmed = currentPaymentStatus?.status === 'confirmed'\n const isBlockchainFailed =\n currentStatus?.confirmationStatus === 'failed' || currentStatus?.error\n const isBackendFailed = currentPaymentStatus?.status === 'failed'\n\n if (isBlockchainConfirmed || isBackendConfirmed) {\n // Payment confirmed\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n onConfirmed?.()\n return\n }\n\n if (isBlockchainFailed || isBackendFailed) {\n // Payment failed\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n const errorMessage = currentStatus?.error || 'Payment failed'\n setError(errorMessage)\n onFailed?.(errorMessage)\n return\n }\n\n // Continue monitoring\n setRetryCount((prev) => prev + 1)\n\n if (retryCount >= maxRetries) {\n // Max retries reached\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n const timeoutError =\n 'Payment confirmation timeout - please check your transaction manually'\n setError(timeoutError)\n onFailed?.(timeoutError)\n return\n }\n } catch (error) {\n console.error('Error monitoring payment:', error)\n setRetryCount((prev) => prev + 1)\n\n if (retryCount >= maxRetries) {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n const monitorError = 'Failed to monitor payment status'\n setError(monitorError)\n onFailed?.(monitorError)\n }\n }\n }\n\n // Start monitoring immediately\n await monitor()\n\n // Continue monitoring at intervals\n intervalRef.current = setInterval(monitor, retryInterval)\n }, [\n transactionId,\n purchaseId,\n checkTransactionStatus,\n checkPaymentStatus,\n onConfirmed,\n onFailed,\n maxRetries,\n retryInterval,\n retryCount,\n ])\n\n // Stop monitoring\n const stopMonitoring = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n }, [])\n\n // Manual status check\n const checkStatus = useCallback(async () => {\n if (!transactionId && !purchaseId) return\n\n setIsLoading(true)\n setError(null)\n\n try {\n if (transactionId) {\n const txStatus = await checkTransactionStatus(transactionId)\n setStatus(txStatus)\n }\n\n if (purchaseId) {\n const payStatus = await checkPaymentStatus(purchaseId)\n setPaymentStatus(payStatus)\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to check status'\n setError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }, [transactionId, purchaseId, checkTransactionStatus, checkPaymentStatus])\n\n // Auto-start monitoring when transaction/purchase ID is provided\n useEffect(() => {\n if ((transactionId || purchaseId) && !isMonitoringRef.current) {\n startMonitoring()\n }\n\n return () => {\n stopMonitoring()\n }\n }, [transactionId, purchaseId, startMonitoring, stopMonitoring])\n\n // Get current confirmation status\n const getConfirmationStatus = useCallback(() => {\n if (paymentStatus?.status === 'confirmed') return 'confirmed'\n if (paymentStatus?.status === 'failed') return 'failed'\n if (status?.confirmationStatus === 'finalized') return 'confirmed'\n if (status?.confirmationStatus === 'confirmed') return 'confirmed'\n if (status?.confirmationStatus === 'failed' || status?.error)\n return 'failed'\n return 'pending'\n }, [status, paymentStatus])\n\n // Get Solscan URL for transaction\n const getSolscanUrl = useCallback(\n (signature?: string) => {\n const txId = signature || transactionId\n if (!txId) return null\n return `https://solscan.io/tx/${txId}`\n },\n [transactionId]\n )\n\n return {\n status,\n paymentStatus,\n isLoading,\n error,\n retryCount,\n maxRetries,\n isMonitoring: isMonitoringRef.current,\n confirmationStatus: getConfirmationStatus(),\n startMonitoring,\n stopMonitoring,\n checkStatus,\n getSolscanUrl,\n isConfirmed: getConfirmationStatus() === 'confirmed',\n isFailed: getConfirmationStatus() === 'failed',\n isPending: getConfirmationStatus() === 'pending',\n }\n}\n","import { useCallback } from 'react'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { BillingDetails } from '../types/billing'\nimport type {\n CCBillSubscribePayload,\n FlexFormResponse,\n GenerateFlexFormURLBodyParams,\n NmiSubscribePayload,\n SubscriptionResponse,\n} from '../types/subscription'\n\nexport interface SubscribeWithCardParams {\n priceId?: string | null\n processor?: string\n provider?: string\n paymentToken: string\n billing: BillingDetails\n}\n\nexport interface SubscribeWithSavedMethodParams {\n priceId?: string | null\n processor?: string\n provider?: string\n paymentMethodId: string\n email?: string\n}\n\nexport interface SubscribeWithCCBillParams {\n priceId?: string | null\n email: string\n firstName: string\n lastName: string\n zipCode: string\n country: string\n processor?: string\n}\n\nexport interface GenerateFlexFormParams {\n priceId?: string | null\n firstName: string\n lastName: string\n address1: string\n city: string\n state: string\n zipCode: string\n country: string\n}\n\nexport const useSubscriptionActions = () => {\n const { services } = usePaymentContext()\n\n const ensurePrice = (priceId?: string | null) => {\n if (!priceId) {\n throw new Error('payments-ui: priceId is required for subscription actions')\n }\n return priceId\n }\n\n const subscribeWithCard = useCallback(\n async ({\n priceId,\n processor = 'nmi',\n provider,\n paymentToken,\n billing,\n }: SubscribeWithCardParams): Promise<SubscriptionResponse> => {\n const payload: NmiSubscribePayload = {\n priceId: ensurePrice(priceId),\n paymentToken,\n processor,\n provider,\n email: billing.email,\n firstName: billing.firstName,\n lastName: billing.lastName,\n address1: billing.address1,\n city: billing.city,\n state: billing.stateRegion,\n zipCode: billing.postalCode,\n country: billing.country,\n }\n return services.subscriptions.subscribe('nmi', payload)\n },\n [services]\n )\n\n const subscribeWithSavedMethod = useCallback(\n async ({\n priceId,\n processor = 'nmi',\n provider,\n paymentMethodId,\n email,\n }: SubscribeWithSavedMethodParams): Promise<SubscriptionResponse> => {\n const payload: NmiSubscribePayload = {\n priceId: ensurePrice(priceId),\n paymentMethodId,\n processor,\n provider,\n email,\n }\n return services.subscriptions.subscribe('nmi', payload)\n },\n [services]\n )\n\n const subscribeWithCCBill = useCallback(\n async ({\n priceId,\n email,\n firstName,\n lastName,\n zipCode,\n country,\n processor = 'ccbill',\n }: SubscribeWithCCBillParams): Promise<SubscriptionResponse> => {\n const payload: CCBillSubscribePayload = {\n priceId: ensurePrice(priceId),\n email,\n firstName,\n lastName,\n zipCode,\n country,\n processor,\n }\n return services.subscriptions.subscribe('ccbill', payload)\n },\n [services]\n )\n\n const generateFlexFormUrl = useCallback(\n async ({\n priceId,\n firstName,\n lastName,\n address1,\n city,\n state,\n zipCode,\n country,\n }: GenerateFlexFormParams): Promise<FlexFormResponse> => {\n const payload: GenerateFlexFormURLBodyParams = {\n price_id: ensurePrice(priceId),\n first_name: firstName,\n last_name: lastName,\n address1,\n city,\n state,\n zip_code: zipCode,\n country,\n }\n return services.subscriptions.generateFlexFormUrl(payload)\n },\n [services]\n )\n\n return {\n subscribeWithCard,\n subscribeWithSavedMethod,\n subscribeWithCCBill,\n generateFlexFormUrl,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/collect.ts","../src/services/apiClient.ts","../src/services/CardPaymentService.ts","../src/services/PaymentMethodService.ts","../src/services/SolanaPaymentService.ts","../src/services/TokenCatalog.ts","../src/services/WalletGateway.ts","../src/services/SubscriptionService.ts","../src/core/PaymentApp.ts","../src/state/paymentStore.ts","../src/context/PaymentContext.tsx","../src/data/countries.ts","../node_modules/@radix-ui/react-compose-refs/src/compose-refs.tsx","../node_modules/@radix-ui/react-slot/src/slot.tsx","../src/lib/utils.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/select.tsx","../src/components/CardDetailsForm.tsx","../src/hooks/usePaymentMethodService.ts","../src/hooks/usePaymentMethods.ts","../src/ui/dialog.tsx","../src/ui/badge.tsx","../src/ui/scroll-area.tsx","../src/ui/card.tsx","../src/components/StoredPaymentMethods.tsx","../src/hooks/useSolanaService.ts","../src/utils/solana/tokenUtils.ts","../src/hooks/useSolanaDirectPayment.ts","../src/components/DirectPayment.tsx","../src/hooks/useSolanaQrPayment.ts","../src/components/QRCodePayment.tsx","../src/components/PaymentStatus.tsx","../src/hooks/useSupportedTokens.ts","../src/hooks/usePaymentStore.ts","../src/state/selectors.ts","../src/ui/tabs.tsx","../src/components/SolanaPaymentSelector.tsx","../src/components/PaymentExperience.tsx","../src/hooks/useTokenBalance.ts","../src/hooks/useDirectWalletPayment.ts","../src/hooks/usePaymentStatus.ts","../src/hooks/useSubscriptionActions.ts"],"names":["data","Slot","jsx","props","React4","React5","React6","React7","useMemo","useEffect","jsxs","Fragment","React9","cva","React10","React11","useState","CreditCard","Loader2","Connection","useCallback","useRef","tokens","error","React13","useWallet","Wallet","PublicKey","hasSufficientBalance","Buffer","Transaction","useConnection"],"mappings":"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","file":"index.js","sourcesContent":["const SCRIPT_SRC = 'https://secure.networkmerchants.com/token/Collect.js'\n\nexport const loadCollectJs = (tokenizationKey: string): void => {\n if (typeof document === 'undefined') return\n const trimmed = tokenizationKey?.trim()\n if (!trimmed || trimmed.length < 10) {\n console.warn('payments-ui: invalid Collect.js key, skipping load')\n return\n }\n\n const existing = document.querySelector(`script[src=\"${SCRIPT_SRC}\"]`)\n if (existing) return\n\n const script = document.createElement('script')\n script.src = SCRIPT_SRC\n script.setAttribute('data-tokenization-key', \"8u8B78-23Z347-c2svF3-pbEb7G\")\n script.setAttribute('data-field-ccnumber-placeholder', '0000 0000 0000 0000')\n script.setAttribute('data-field-ccexp-placeholder', '10 / 25')\n script.setAttribute('data-field-cvv-placeholder', '123')\n script.setAttribute('data-variant', 'inline')\n script.async = true\n document.head.appendChild(script)\n}\n","import type {\n PaymentFetcher,\n PaymentConfig,\n} from '../types/config'\n\nexport type RequestOptions = {\n params?: Record<string, string | number>\n query?: Record<string, string | number | undefined>\n body?: Record<string, unknown>\n headers?: Record<string, string>\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\nexport interface ApiClient {\n request: <T>(method: HttpMethod, path: string, options?: RequestOptions) => Promise<T>\n get: <T>(path: string, options?: Omit<RequestOptions, 'body'>) => Promise<T>\n post: <T>(path: string, options?: RequestOptions) => Promise<T>\n put: <T>(path: string, options?: RequestOptions) => Promise<T>\n patch: <T>(path: string, options?: RequestOptions) => Promise<T>\n delete: <T>(path: string, options?: RequestOptions) => Promise<T>\n}\n\nconst buildUrl = (\n baseUrl: string,\n path: string,\n { params, query }: Pick<RequestOptions, 'params' | 'query'>\n): string => {\n let resolved = `${baseUrl}${path}`\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n resolved = resolved.replace(`:${key}`, encodeURIComponent(String(value)))\n })\n }\n if (query) {\n const queryString = new URLSearchParams()\n Object.entries(query).forEach(([key, value]) => {\n if (value === undefined || value === null) return\n queryString.append(key, String(value))\n })\n if ([...queryString.keys()].length > 0) {\n resolved = `${resolved}?${queryString.toString()}`\n }\n }\n return resolved\n}\n\nexport const createApiClient = (\n paymentConfig: PaymentConfig,\n baseUrl: string,\n fetcher: PaymentFetcher,\n resolveAuthToken: () => Promise<string | null>\n): ApiClient => {\n const request = async <T>(\n method: HttpMethod,\n path: string,\n options?: RequestOptions\n ): Promise<T> => {\n const url = buildUrl(baseUrl, path, options ?? {})\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(paymentConfig.defaultHeaders ?? {}),\n ...(options?.headers ?? {}),\n }\n\n const token = await resolveAuthToken()\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n\n const response = await fetcher(url, {\n method,\n headers,\n body: options?.body ? JSON.stringify(options.body) : undefined,\n })\n\n if (!response.ok) {\n const message = await response.text()\n throw new Error(message || `Request failed with status ${response.status}`)\n }\n\n if (response.status === 204) {\n return undefined as T\n }\n\n const data = (await response.json()) as T\n return data\n }\n\n return {\n request,\n get: (path, options) => request('GET', path, options),\n post: (path, options) => request('POST', path, options),\n put: (path, options) => request('PUT', path, options),\n patch: (path, options) => request('PATCH', path, options),\n delete: (path, options) => request('DELETE', path, options),\n }\n}\n","import type { BillingDetails, CreatePaymentMethodPayload, PaymentConfig } from '../types'\nimport { loadCollectJs } from '../utils/collect'\n\nexport interface CardTokenizeResult {\n token: string\n billing: BillingDetails\n}\n\nexport class CardPaymentService {\n private collectLoaded = false\n\n constructor(private config: PaymentConfig) {}\n\n async ensureCollectLoaded(): Promise<void> {\n if (this.collectLoaded) return\n if (!this.config.collectJsKey) {\n throw new Error('payments-ui: collect.js key missing')\n }\n\n loadCollectJs(this.config.collectJsKey)\n this.collectLoaded = true\n }\n\n buildCreatePayload(result: CardTokenizeResult): CreatePaymentMethodPayload {\n return {\n payment_token: result.token,\n first_name: result.billing.firstName,\n last_name: result.billing.lastName,\n address1: result.billing.address1,\n address2: result.billing.address2,\n city: result.billing.city,\n state: result.billing.stateRegion,\n zip: result.billing.postalCode,\n country: result.billing.country,\n email: result.billing.email,\n provider: result.billing.provider,\n }\n }\n}\n","import type {\n PaginatedPaymentMethods,\n CreatePaymentMethodPayload,\n PaymentMethod,\n} from '../types'\nimport type { ApiClient } from './apiClient'\n\nexport interface ListParams {\n page?: number\n pageSize?: number\n}\n\nexport class PaymentMethodService {\n constructor(private api: ApiClient) { }\n\n async list(params?: ListParams): Promise<PaginatedPaymentMethods> {\n return this.api.get('/payment-methods', {\n query: {\n page: params?.page ?? 1,\n page_size: params?.pageSize ?? 50,\n },\n })\n }\n\n async create(payload: CreatePaymentMethodPayload): Promise<PaymentMethod> {\n return this.api.post('/payment-methods', {\n body: { ...payload } as Record<string, unknown>,\n })\n }\n\n async remove(id: string): Promise<void> {\n await this.api.delete(`/payment-methods/${id}`)\n }\n\n async activate(id: string): Promise<void> {\n await this.api.put(`/payment-methods/${id}/activate`)\n }\n}\n","import type {\n GeneratePaymentResponse,\n SubmitPaymentResponse,\n TokenInfo,\n SolanaPayQRCodeIntent,\n SolanaPayStatusResponse,\n} from '../types'\nimport type { ApiClient } from './apiClient'\n\nexport class SolanaPaymentService {\n constructor(private api: ApiClient) { }\n\n async generatePayment(\n priceId: string,\n token: string,\n userWallet: string\n ): Promise<GeneratePaymentResponse> {\n return this.api.post('/solana/generate', {\n body: { price_id: priceId, token, user_wallet: userWallet },\n })\n }\n\n async submitPayment(\n signedTransaction: string,\n priceId: string,\n intentId: string,\n memo?: string\n ): Promise<SubmitPaymentResponse> {\n return this.api.post('/solana/submit', {\n body: {\n signed_transaction: signedTransaction,\n price_id: priceId,\n intent_id: intentId,\n ...(memo ? { memo } : {}),\n },\n })\n }\n\n async fetchSupportedTokens(): Promise<TokenInfo[]> {\n const response = await this.api.get<{ tokens: TokenInfo[] }>(\n '/solana/tokens'\n )\n return response.tokens\n }\n\n async getSupportedTokens(): Promise<TokenInfo[]> {\n return this.fetchSupportedTokens()\n }\n\n async generateQrCode(\n priceId: string,\n token: string,\n userWallet?: string\n ): Promise<SolanaPayQRCodeIntent> {\n return this.api.post('/solana/qr', {\n body: {\n price_id: priceId,\n token,\n ...(userWallet ? { user_wallet: userWallet } : {}),\n },\n })\n }\n\n async generateQRCode(\n priceId: string,\n token: string,\n userWallet?: string\n ): Promise<SolanaPayQRCodeIntent> {\n return this.generateQrCode(priceId, token, userWallet)\n }\n\n async checkPaymentStatus(\n reference: string,\n memo?: string\n ): Promise<SolanaPayStatusResponse> {\n return this.api.get('/solana/check', {\n query: {\n reference,\n ...(memo ? { memo } : {}),\n },\n })\n }\n}\n","import type { TokenInfo } from '../types'\nimport type { SolanaPaymentService } from './SolanaPaymentService'\n\nexport interface TokenCatalogOptions {\n ttlMs?: number\n}\n\nexport class TokenCatalog {\n private cache: TokenInfo[] = []\n private lastFetched = 0\n\n constructor(\n private solanaService: SolanaPaymentService,\n private options: TokenCatalogOptions = {}\n ) { }\n\n private get ttl(): number {\n return this.options.ttlMs ?? 5 * 60 * 1000\n }\n\n async getTokens(force = false): Promise<TokenInfo[]> {\n const isStale = Date.now() - this.lastFetched > this.ttl\n if (!force && this.cache.length > 0 && !isStale) {\n return this.cache\n }\n\n const tokens = await this.solanaService.fetchSupportedTokens()\n this.cache = tokens\n this.lastFetched = Date.now()\n return tokens\n }\n\n getCached(): TokenInfo[] {\n return this.cache\n }\n}\n","export interface WalletAccount {\n publicKey: string\n}\n\nexport interface WalletAdapterLike {\n publicKey?: { toBase58(): string }\n signTransaction?: (tx: unknown) => Promise<unknown>\n signVersionedTransaction?: (tx: unknown) => Promise<unknown>\n}\n\nexport class WalletGateway {\n private adapter: WalletAdapterLike | null = null\n\n setAdapter(adapter: WalletAdapterLike | null): void {\n this.adapter = adapter\n }\n\n getPublicKey(): string | null {\n if (!this.adapter?.publicKey) return null\n try {\n return this.adapter.publicKey.toBase58()\n } catch {\n return null\n }\n }\n\n async sign(transaction: unknown): Promise<unknown> {\n if (!this.adapter) {\n throw new Error('payments-ui: wallet adapter not set')\n }\n\n if (typeof this.adapter.signVersionedTransaction === 'function') {\n return this.adapter.signVersionedTransaction(transaction)\n }\n\n if (typeof this.adapter.signTransaction === 'function') {\n return this.adapter.signTransaction(transaction)\n }\n\n throw new Error('payments-ui: wallet adapter cannot sign transactions')\n }\n}\n","import type { ApiClient } from './apiClient'\nimport type {\n CCBillSubscribePayload,\n FlexFormResponse,\n GenerateFlexFormURLBodyParams,\n NmiSubscribePayload,\n PaymentPlatform,\n SubscriptionResponse,\n} from '../types/subscription'\n\nexport class SubscriptionService {\n constructor(private readonly api: ApiClient) {}\n\n async subscribe(\n platform: PaymentPlatform,\n payload: NmiSubscribePayload | CCBillSubscribePayload\n ): Promise<SubscriptionResponse> {\n const body = this.serializePayload(platform, payload)\n return this.api.post<SubscriptionResponse>(\n `/subscriptions/process/${platform}`,\n {\n body,\n }\n )\n }\n\n async generateFlexFormUrl(\n payload: GenerateFlexFormURLBodyParams\n ): Promise<FlexFormResponse> {\n return this.api.post('/subscriptions/flexform', {\n body: { ...payload } as Record<string, unknown>,\n })\n }\n\n private serializePayload(\n platform: PaymentPlatform,\n payload: NmiSubscribePayload | CCBillSubscribePayload\n ): Record<string, unknown> {\n if (platform === 'nmi') {\n const data = payload as NmiSubscribePayload\n if (!data.priceId) {\n throw new Error('payments-ui: priceId is required for NMI subscriptions')\n }\n\n if (!data.paymentToken && !data.paymentMethodId) {\n throw new Error(\n 'payments-ui: paymentToken or paymentMethodId is required for NMI subscriptions'\n )\n }\n\n const body: Record<string, unknown> = {\n price_id: data.priceId,\n processor: data.processor ?? 'nmi',\n provider: data.provider,\n }\n\n if (data.email) body.email = data.email\n if (data.firstName) body.first_name = data.firstName\n if (data.lastName) body.last_name = data.lastName\n if (data.address1) body.address1 = data.address1\n if (data.city) body.city = data.city\n if (data.state) body.state = data.state\n if (data.zipCode) body.zip = data.zipCode\n if (data.country) body.country = data.country\n if (data.paymentToken) body.payment_token = data.paymentToken\n if (data.paymentMethodId) body.payment_method_id = data.paymentMethodId\n\n return body\n }\n\n const data = payload as CCBillSubscribePayload\n if (!data.priceId) {\n throw new Error('payments-ui: priceId is required for CCBill subscriptions')\n }\n\n return {\n price_id: data.priceId,\n processor: data.processor ?? 'ccbill',\n email: data.email,\n first_name: data.firstName,\n last_name: data.lastName,\n zip: data.zipCode,\n country: data.country,\n }\n }\n}\n","import type { PaymentConfig, PaymentFetcher } from '../types'\nimport { createApiClient, type ApiClient } from '../services/apiClient'\nimport { CardPaymentService } from '../services/CardPaymentService'\nimport { PaymentMethodService } from '../services/PaymentMethodService'\nimport { SolanaPaymentService } from '../services/SolanaPaymentService'\nimport { TokenCatalog } from '../services/TokenCatalog'\nimport { WalletGateway } from '../services/WalletGateway'\nimport { SubscriptionService } from '../services/SubscriptionService'\n\nexport interface PaymentServices {\n cardPayments: CardPaymentService\n paymentMethods: PaymentMethodService\n solanaPayments: SolanaPaymentService\n tokenCatalog: TokenCatalog\n walletGateway: WalletGateway\n subscriptions: SubscriptionService\n billingApi: ApiClient\n accountApi: ApiClient\n}\n\nexport interface PaymentAppOptions {\n config: PaymentConfig\n fetcher?: PaymentFetcher\n}\n\nexport class PaymentApp {\n private readonly config: PaymentConfig\n private readonly fetcher: PaymentFetcher\n private readonly services: PaymentServices\n\n constructor(options: PaymentAppOptions) {\n this.config = options.config\n this.fetcher =\n options.fetcher ??\n options.config.fetcher ??\n (globalThis.fetch?.bind(globalThis) as PaymentFetcher)\n\n if (!this.fetcher) {\n throw new Error('payments-ui: fetch implementation is required')\n }\n\n this.services = this.createServices()\n }\n\n getConfig(): PaymentConfig {\n return this.config\n }\n\n getFetcher(): PaymentFetcher {\n return this.fetcher\n }\n\n getServices(): PaymentServices {\n return this.services\n }\n\n private createServices(): PaymentServices {\n const billingApi = createApiClient(\n this.config,\n this.config.endpoints.billingBaseUrl,\n this.fetcher,\n this.resolveAuthToken\n )\n\n const accountBaseUrl =\n this.config.endpoints.accountBaseUrl ?? this.config.endpoints.billingBaseUrl\n const accountApi = createApiClient(\n this.config,\n accountBaseUrl,\n this.fetcher,\n this.resolveAuthToken\n )\n\n const solanaPayments = new SolanaPaymentService(billingApi)\n const paymentMethods = new PaymentMethodService(accountApi)\n const cardPayments = new CardPaymentService(this.config)\n const walletGateway = new WalletGateway()\n const tokenCatalog = new TokenCatalog(solanaPayments)\n const subscriptions = new SubscriptionService(billingApi)\n\n return {\n cardPayments,\n paymentMethods,\n solanaPayments,\n tokenCatalog,\n walletGateway,\n subscriptions,\n billingApi,\n accountApi,\n }\n }\n\n resolveAuthToken = async (): Promise<string | null> => {\n if (!this.config.getAuthToken) {\n return null\n }\n\n try {\n const result = this.config.getAuthToken()\n if (result instanceof Promise) {\n return (await result) ?? null\n }\n return result ?? null\n } catch (error) {\n console.warn('payments-ui: failed to resolve auth token', error)\n return null\n }\n }\n}\n","import { createStore } from 'zustand/vanilla'\nimport type {\n PaymentCallbacks,\n PaymentStatusPayload,\n PaymentSuccessPayload,\n} from '../types'\n\nexport type AsyncStatus = 'idle' | 'processing' | 'success' | 'error'\nexport type SolanaFlowState =\n | 'selecting'\n | 'processing'\n | 'confirming'\n | 'success'\n | 'error'\n\nexport interface PaymentStoreState {\n selectedMethodId: string | null\n solanaModalOpen: boolean\n savedPaymentStatus: AsyncStatus\n savedPaymentError: string | null\n newCardStatus: AsyncStatus\n newCardError: string | null\n solanaTab: 'wallet' | 'qr'\n solanaStatus: SolanaFlowState\n solanaError: string | null\n solanaTransactionId: string | null\n solanaSelectedToken: string | null\n solanaTokenAmount: number\n setSelectedMethod: (methodId: string | null) => void\n setSolanaModalOpen: (open: boolean) => void\n setSolanaTab: (tab: 'wallet' | 'qr') => void\n setSolanaSelectedToken: (symbol: string) => void\n setSolanaTokenAmount: (amount: number) => void\n setSolanaTransactionId: (txId: string | null) => void\n startSavedPayment: () => void\n completeSavedPayment: () => void\n failSavedPayment: (error: string) => void\n resetSavedPayment: () => void\n startNewCardPayment: () => void\n completeNewCardPayment: () => void\n failNewCardPayment: (error: string) => void\n resetNewCardPayment: () => void\n startSolanaPayment: () => void\n confirmSolanaPayment: () => void\n completeSolanaPayment: (payload?: PaymentSuccessPayload) => void\n failSolanaPayment: (error: string) => void\n resetSolanaPayment: () => void\n resetAll: () => void\n}\n\nconst initialState = {\n selectedMethodId: null,\n solanaModalOpen: false,\n savedPaymentStatus: 'idle' as AsyncStatus,\n savedPaymentError: null,\n newCardStatus: 'idle' as AsyncStatus,\n newCardError: null,\n solanaTab: 'wallet' as const,\n solanaStatus: 'selecting' as SolanaFlowState,\n solanaError: null,\n solanaTransactionId: null,\n solanaSelectedToken: null,\n solanaTokenAmount: 0,\n}\n\nexport interface PaymentStoreOptions {\n callbacks?: PaymentCallbacks\n}\n\nexport const createPaymentStore = (options?: PaymentStoreOptions) =>\n createStore<PaymentStoreState>((set, get) => {\n const notifyStatus = (\n status: PaymentStatusPayload['status'],\n context?: Record<string, unknown>\n ) => {\n options?.callbacks?.onStatusChange?.({ status, context })\n }\n\n const notifySuccess = (payload?: PaymentSuccessPayload) => {\n if (!options?.callbacks?.onSuccess) return\n options.callbacks.onSuccess(payload ?? {})\n }\n\n const notifyError = (error: string) => {\n options?.callbacks?.onError?.(new Error(error))\n }\n\n return {\n ...initialState,\n setSelectedMethod: (methodId) => {\n if (get().selectedMethodId === methodId) return\n set({ selectedMethodId: methodId })\n },\n setSolanaModalOpen: (open) => {\n if (get().solanaModalOpen === open) return\n set({ solanaModalOpen: open })\n },\n setSolanaTab: (tab) => {\n if (get().solanaTab === tab) return\n set({ solanaTab: tab })\n },\n setSolanaSelectedToken: (symbol) => {\n if (get().solanaSelectedToken === symbol) return\n set({ solanaSelectedToken: symbol })\n },\n setSolanaTokenAmount: (amount) => {\n if (get().solanaTokenAmount === amount) return\n set({ solanaTokenAmount: amount })\n },\n setSolanaTransactionId: (txId) => {\n if (get().solanaTransactionId === txId) return\n set({ solanaTransactionId: txId })\n },\n startSavedPayment: () => {\n notifyStatus('processing', { source: 'saved-payment' })\n set({ savedPaymentStatus: 'processing', savedPaymentError: null })\n },\n completeSavedPayment: () => {\n notifyStatus('success', { source: 'saved-payment' })\n set({ savedPaymentStatus: 'success', savedPaymentError: null })\n },\n failSavedPayment: (error) => {\n notifyStatus('error', { source: 'saved-payment' })\n notifyError(error)\n set({ savedPaymentStatus: 'error', savedPaymentError: error })\n },\n resetSavedPayment: () =>\n set({ savedPaymentStatus: 'idle', savedPaymentError: null }),\n startNewCardPayment: () => {\n notifyStatus('processing', { source: 'new-card' })\n set({ newCardStatus: 'processing', newCardError: null })\n },\n completeNewCardPayment: () => {\n notifyStatus('success', { source: 'new-card' })\n set({ newCardStatus: 'success', newCardError: null })\n },\n failNewCardPayment: (error) => {\n notifyStatus('error', { source: 'new-card' })\n notifyError(error)\n set({ newCardStatus: 'error', newCardError: error })\n },\n resetNewCardPayment: () =>\n set({ newCardStatus: 'idle', newCardError: null }),\n startSolanaPayment: () => {\n notifyStatus('processing', { source: 'solana' })\n set({ solanaStatus: 'processing', solanaError: null })\n },\n confirmSolanaPayment: () =>\n set({ solanaStatus: 'confirming' }),\n completeSolanaPayment: (payload) => {\n notifyStatus('success', { source: 'solana' })\n notifySuccess(payload)\n set({ solanaStatus: 'success', solanaError: null })\n },\n failSolanaPayment: (error) => {\n notifyStatus('error', { source: 'solana' })\n notifyError(error)\n set({ solanaStatus: 'error', solanaError: error })\n },\n resetSolanaPayment: () =>\n set({\n solanaStatus: 'selecting',\n solanaError: null,\n solanaTransactionId: null,\n }),\n resetAll: () => set(initialState),\n }\n })\n","import React, { createContext, useContext, useEffect, useMemo } from 'react'\nimport type { StoreApi } from 'zustand'\nimport type { PaymentConfig, PaymentFetcher } from '../types/config'\nimport { loadCollectJs } from '../utils/collect'\nimport { PaymentApp, type PaymentServices } from '../core'\nimport {\n createPaymentStore,\n type PaymentStoreState,\n} from '../state/paymentStore'\n\nexport interface PaymentContextValue {\n config: PaymentConfig\n fetcher: PaymentFetcher\n resolveAuthToken: () => Promise<string | null>\n app: PaymentApp\n services: PaymentServices\n store: StoreApi<PaymentStoreState>\n}\n\nconst PaymentContext = createContext<PaymentContextValue | undefined>(undefined)\n\nexport interface PaymentProviderProps {\n config: PaymentConfig\n children: React.ReactNode\n}\n\nexport const PaymentProvider: React.FC<PaymentProviderProps> = ({\n config,\n children,\n}) => {\n const app = useMemo(() => new PaymentApp({ config }), [config])\n const store = useMemo(\n () => createPaymentStore({ callbacks: config.callbacks }),\n [config.callbacks]\n )\n\n const value = useMemo<PaymentContextValue>(() => {\n return {\n config: app.getConfig(),\n fetcher: app.getFetcher(),\n resolveAuthToken: app.resolveAuthToken,\n app,\n services: app.getServices(),\n store,\n }\n }, [app, store])\n\n useEffect(() => {\n if (!value.config.collectJsKey) return\n loadCollectJs(value.config.collectJsKey)\n }, [value.config.collectJsKey])\n\n return <PaymentContext.Provider value={value}>{children}</PaymentContext.Provider>\n}\n\nexport const usePaymentContext = (): PaymentContextValue => {\n const context = useContext(PaymentContext)\n if (!context) {\n throw new Error('usePaymentContext must be used within a PaymentProvider')\n }\n return context\n}\n","// Use country-list package for standard country data\nimport countryList from 'country-list'\n\n// Define our interfaces for TypeScript support\nexport interface Country {\n code: string\n name: string\n}\n\n// Some countries that need customization or that might be missing from the base package\nconst customCountries: Country[] = [\n { code: 'TW', name: 'Taiwan, Province of China' },\n { code: 'KR', name: 'Korea' },\n { code: 'KP', name: 'North Korea' },\n { code: 'PS', name: 'Palestine, State of' },\n { code: 'VA', name: 'Holy See (Vatican City State)' },\n { code: 'BQ', name: 'Bonaire, Sint Eustatius and Saba' },\n { code: 'SX', name: 'Sint Maarten (Dutch part)' },\n { code: 'MK', name: 'North Macedonia' },\n { code: 'SZ', name: 'Eswatini' },\n { code: 'FM', name: 'Micronesia, Federated States Of' },\n { code: 'TR', name: 'Türkiye' },\n]\n\n// Apply customizations to the country list\ncountryList.overwrite(customCountries)\n\n// Get the countries from the package and sort them alphabetically by name\nexport const countries: Country[] = countryList\n .getData()\n .sort((a: Country, b: Country) => a.name.localeCompare(b.name))\n","import * as React from 'react';\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === 'function') {\n return ref(value);\n } else if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == 'function') {\n hasCleanup = true;\n }\n return cleanup;\n });\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == 'function') {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n","import * as React from 'react';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\n\n/* -------------------------------------------------------------------------------------------------\n * Slot\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ export function createSlot(ownerName: string) {\n const SlotClone = createSlotClone(ownerName);\n const Slot = React.forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n\n if (slottable) {\n // the new element to render is the one passed as a child of `Slottable`\n const newElement = slottable.props.children;\n\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n // because the new element will be the one rendered, we are only interested\n // in grabbing its children (`newElement.props.children`)\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement)\n ? (newElement.props as { children: React.ReactNode }).children\n : null;\n } else {\n return child;\n }\n });\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {React.isValidElement(newElement)\n ? React.cloneElement(newElement, undefined, newChildren)\n : null}\n </SlotClone>\n );\n }\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {children}\n </SlotClone>\n );\n });\n\n Slot.displayName = `${ownerName}.Slot`;\n return Slot;\n}\n\nconst Slot = createSlot('Slot');\n\n/* -------------------------------------------------------------------------------------------------\n * SlotClone\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SlotCloneProps {\n children: React.ReactNode;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ function createSlotClone(ownerName: string) {\n const SlotClone = React.forwardRef<any, SlotCloneProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props = mergeProps(slotProps, children.props as AnyProps);\n // do not pass ref to React.Fragment for React 19 compatibility\n if (children.type !== React.Fragment) {\n props.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props);\n }\n\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Slottable\n * -----------------------------------------------------------------------------------------------*/\n\nconst SLOTTABLE_IDENTIFIER = Symbol('radix.slottable');\n\ninterface SlottableProps {\n children: React.ReactNode;\n}\n\ninterface SlottableComponent extends React.FC<SlottableProps> {\n __radixId: symbol;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ export function createSlottable(ownerName: string) {\n const Slottable: SlottableComponent = ({ children }) => {\n return <>{children}</>;\n };\n Slottable.displayName = `${ownerName}.Slottable`;\n Slottable.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable;\n}\n\nconst Slottable = createSlottable('Slottable');\n\n/* ---------------------------------------------------------------------------------------------- */\n\ntype AnyProps = Record<string, any>;\n\nfunction isSlottable(\n child: React.ReactNode\n): child is React.ReactElement<SlottableProps, typeof Slottable> {\n return (\n React.isValidElement(child) &&\n typeof child.type === 'function' &&\n '__radixId' in child.type &&\n child.type.__radixId === SLOTTABLE_IDENTIFIER\n );\n}\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps) {\n // all child props should override\n const overrideProps = { ...childProps };\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n // if the handler exists on both, we compose them\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args: unknown[]) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n }\n // but if it exists only on the slot, we use only this one\n else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n }\n // if it's `style`, we merge them\n else if (propName === 'style') {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === 'className') {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' ');\n }\n }\n\n return { ...slotProps, ...overrideProps };\n}\n\n// Before React 19 accessing `element.props.ref` will throw a warning and suggest using `element.ref`\n// After React 19 accessing `element.ref` does the opposite.\n// https://github.com/facebook/react/pull/28348\n//\n// Access the ref using the method that doesn't yield a warning.\nfunction getElementRef(element: React.ReactElement) {\n // React <=18 in DEV\n let getter = Object.getOwnPropertyDescriptor(element.props, 'ref')?.get;\n let mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return (element as any).ref;\n }\n\n // React 19 in DEV\n getter = Object.getOwnPropertyDescriptor(element, 'ref')?.get;\n mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return (element.props as { ref?: React.Ref<unknown> }).ref;\n }\n\n // Not DEV\n return (element.props as { ref?: React.Ref<unknown> }).ref || (element as any).ref;\n}\n\nexport {\n Slot,\n Slottable,\n //\n Slot as Root,\n};\nexport type { SlotProps };\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cn } from '../lib/utils'\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../lib/utils'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n position={position}\n {...props}\n >\n <SelectPrimitive.ScrollUpButton className=\"flex cursor-default items-center justify-center py-1\">\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n <SelectPrimitive.Viewport className=\"p-1\">\n {children}\n </SelectPrimitive.Viewport>\n <SelectPrimitive.ScrollDownButton className=\"flex cursor-default items-center justify-center py-1\">\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold text-muted-foreground', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { CreditCard, Loader2, MapPin, User } from 'lucide-react'\nimport type { BillingDetails } from '../types'\nimport type { CollectJSResponse } from '../types/collect'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport { countries } from '../data/countries'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { cn } from '../lib/utils'\n\nexport interface CardDetailsFormProps {\n visible: boolean\n onTokenize: (token: string, billing: BillingDetails) => void\n submitLabel: string\n submitting?: boolean\n defaultValues?: Partial<BillingDetails>\n externalError?: string | null\n collectPrefix?: string\n className?: string\n onBillingChange?: (billing: BillingDetails) => void\n submitDisabled?: boolean\n}\n\nconst defaultBilling: BillingDetails = {\n firstName: '',\n lastName: '',\n address1: '',\n address2: '',\n city: '',\n stateRegion: '',\n postalCode: '',\n country: 'US',\n email: '',\n provider: 'mobius',\n}\n\nconst buildSelector = (prefix: string, field: string) => `#${prefix}-${field}`\n\nexport const CardDetailsForm: React.FC<CardDetailsFormProps> = ({\n visible,\n onTokenize,\n submitLabel,\n submitting = false,\n defaultValues,\n externalError,\n collectPrefix = 'card-form',\n className,\n onBillingChange,\n submitDisabled = false,\n}) => {\n const { config } = usePaymentContext()\n const defaultValuesKey = useMemo(() => JSON.stringify(defaultValues ?? {}), [defaultValues])\n\n const mergedDefaults: BillingDetails = useMemo(\n () => ({\n ...defaultBilling,\n ...defaultValues,\n email: defaultValues?.email ?? config.defaultUser?.email ?? defaultBilling.email,\n }),\n [defaultValuesKey, config.defaultUser?.email]\n )\n\n const [firstName, setFirstName] = useState(mergedDefaults.firstName)\n const [lastName, setLastName] = useState(mergedDefaults.lastName)\n const [address1, setAddress1] = useState(mergedDefaults.address1)\n const [address2, setAddress2] = useState(mergedDefaults.address2 ?? '')\n const [city, setCity] = useState(mergedDefaults.city)\n const [stateRegion, setStateRegion] = useState(mergedDefaults.stateRegion ?? '')\n const [postalCode, setPostalCode] = useState(mergedDefaults.postalCode)\n const [country, setCountry] = useState(mergedDefaults.country)\n const [email, setEmail] = useState(mergedDefaults.email ?? '')\n const [localError, setLocalError] = useState<string | null>(null)\n const [isTokenizing, setIsTokenizing] = useState(false)\n\n useEffect(() => {\n if (!visible) {\n setLocalError(null)\n setIsTokenizing(false)\n }\n }, [visible])\n\n useEffect(() => {\n if (!visible) return\n setFirstName(mergedDefaults.firstName)\n setLastName(mergedDefaults.lastName)\n setAddress1(mergedDefaults.address1)\n setAddress2(mergedDefaults.address2 ?? '')\n setCity(mergedDefaults.city)\n setStateRegion(mergedDefaults.stateRegion ?? '')\n setPostalCode(mergedDefaults.postalCode)\n setCountry(mergedDefaults.country)\n setEmail(mergedDefaults.email ?? '')\n }, [defaultValuesKey, mergedDefaults, visible])\n\n useEffect(() => {\n if (!onBillingChange) return\n onBillingChange({\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n provider: mergedDefaults.provider ?? 'mobius',\n })\n }, [\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n mergedDefaults.provider,\n onBillingChange,\n ])\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.CollectJS || !visible) {\n return\n }\n\n const handlers = (window.__doujinsCollectHandlers ||= {})\n handlers[collectPrefix] = (response: CollectJSResponse) => {\n setIsTokenizing(false)\n if (!response.token) {\n setLocalError('Payment tokenization failed. Please try again.')\n return\n }\n\n const billing: BillingDetails = {\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n provider: mergedDefaults.provider ?? 'mobius',\n }\n\n onTokenize(response.token, billing)\n }\n\n const configured = (window.__doujinsCollectConfigured ||= {})\n if (!configured[collectPrefix]) {\n window.CollectJS.configure({\n variant: 'inline',\n fields: {\n ccnumber: { selector: buildSelector(collectPrefix, 'ccnumber') },\n ccexp: { selector: buildSelector(collectPrefix, 'ccexp') },\n cvv: { selector: buildSelector(collectPrefix, 'cvv') },\n },\n callback: (response: CollectJSResponse) => {\n const fn = window.__doujinsCollectHandlers?.[collectPrefix]\n fn?.(response)\n },\n })\n configured[collectPrefix] = true\n }\n }, [\n collectPrefix,\n firstName,\n lastName,\n address1,\n address2,\n city,\n stateRegion,\n postalCode,\n country,\n email,\n mergedDefaults.provider,\n onTokenize,\n visible,\n ])\n\n const validate = (): boolean => {\n if (\n !firstName.trim() ||\n !lastName.trim() ||\n !address1.trim() ||\n !city.trim() ||\n !postalCode.trim() ||\n !country.trim() ||\n !email.trim()\n ) {\n setLocalError('Please complete all required billing fields.')\n return false\n }\n setLocalError(null)\n return true\n }\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault()\n if (!validate()) return\n if (!window.CollectJS) {\n setLocalError('Payment form is not ready. Please try again later.')\n return\n }\n setIsTokenizing(true)\n window.CollectJS.startPaymentRequest()\n }\n\n const errorMessage = localError ?? externalError\n const collectFieldClass =\n 'flex h-11 w-full items-center rounded-md border border-dashed border-muted-foreground/40 bg-muted/20 px-3 text-sm text-muted-foreground'\n\n return (\n <form\n className={cn(\n 'space-y-6 rounded-2xl border border-border/60 bg-card/90 p-6 shadow-lg',\n className\n )}\n onSubmit={handleSubmit}\n noValidate\n >\n {errorMessage && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-4 py-2 text-sm text-destructive\">\n {errorMessage}\n </div>\n )}\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-first\" className=\"flex items-center gap-2 text-muted-foreground\">\n <User className=\"h-4 w-4\" /> First name\n </Label>\n <Input\n id=\"payments-first\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n required\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-last\" className=\"flex items-center gap-2 text-muted-foreground\">\n <User className=\"h-4 w-4\" /> Last name\n </Label>\n <Input\n id=\"payments-last\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n required\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-email\">Email</Label>\n <Input\n id=\"payments-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-address1\">Address line 1</Label>\n <Input\n id=\"payments-address1\"\n value={address1}\n onChange={(e) => setAddress1(e.target.value)}\n required\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-address2\">Address line 2 (optional)</Label>\n <Input\n id=\"payments-address2\"\n value={address2}\n onChange={(e) => setAddress2(e.target.value)}\n />\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-city\">City</Label>\n <Input\n id=\"payments-city\"\n value={city}\n onChange={(e) => setCity(e.target.value)}\n required\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-state\">State / Region</Label>\n <Input\n id=\"payments-state\"\n value={stateRegion}\n onChange={(e) => setStateRegion(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"payments-postal\" className=\"flex items-center gap-2 text-muted-foreground\">\n <MapPin className=\"h-4 w-4\" /> Postal code\n </Label>\n <Input\n id=\"payments-postal\"\n value={postalCode}\n onChange={(e) => setPostalCode(e.target.value)}\n required\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Country</Label>\n <Select value={country} onValueChange={setCountry}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select a country\" />\n </SelectTrigger>\n <SelectContent className=\"max-h-64\">\n {countries.map((option) => (\n <SelectItem key={option.code} value={option.code}>\n {option.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label>Card number</Label>\n <div id={buildSelector(collectPrefix, 'ccnumber').slice(1)} className={collectFieldClass} />\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Expiry</Label>\n <div id={buildSelector(collectPrefix, 'ccexp').slice(1)} className={collectFieldClass} />\n </div>\n <div className=\"space-y-2\">\n <Label>CVV</Label>\n <div id={buildSelector(collectPrefix, 'cvv').slice(1)} className={collectFieldClass} />\n </div>\n </div>\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={submitting || submitDisabled || isTokenizing}\n >\n {submitting || isTokenizing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> Processing…\n </>\n ) : (\n <>\n <CreditCard className=\"mr-2 h-4 w-4\" /> {submitLabel}\n </>\n )}\n </Button>\n\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <CreditCard className=\"h-4 w-4\" /> Your payment information is encrypted and processed securely.\n </p>\n </form>\n )\n}\n","import { useMemo } from 'react'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { PaymentMethodService } from '../services/PaymentMethodService'\n\nexport const usePaymentMethodService = (): PaymentMethodService => {\n const { services } = usePaymentContext()\n return useMemo(() => services.paymentMethods, [services])\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { usePaymentMethodService } from './usePaymentMethodService'\nimport type {\n BillingDetails,\n CreatePaymentMethodPayload,\n PaymentMethod,\n PaginatedPaymentMethods,\n} from '../types'\n\nconst PAYMENT_METHODS_KEY = ['payments-ui', 'payment-methods']\n\nexport const usePaymentMethods = () => {\n const service = usePaymentMethodService()\n const queryClient = useQueryClient()\n\n const listQuery = useQuery<PaginatedPaymentMethods>({\n queryKey: PAYMENT_METHODS_KEY,\n queryFn: () => service.list({ pageSize: 50 }),\n })\n\n const createMutation = useMutation<\n PaymentMethod,\n Error,\n { token: string; billing: BillingDetails }\n >({\n mutationFn: ({ token, billing }) => {\n const payload: CreatePaymentMethodPayload = {\n payment_token: token,\n first_name: billing.firstName,\n last_name: billing.lastName,\n address1: billing.address1,\n address2: billing.address2,\n city: billing.city,\n state: billing.stateRegion,\n zip: billing.postalCode,\n country: billing.country,\n email: billing.email,\n provider: billing.provider,\n }\n return service.create(payload)\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: PAYMENT_METHODS_KEY })\n },\n })\n\n const deleteMutation = useMutation<void, Error, { id: string }>({\n mutationFn: ({ id }) => service.remove(id),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: PAYMENT_METHODS_KEY })\n },\n })\n\n return {\n listQuery,\n createMutation,\n deleteMutation,\n }\n}\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = ({ className, ...props }: DialogPrimitive.DialogPortalProps) => (\n <DialogPrimitive.Portal className={cn(className)} {...props} />\n)\nDialogPortal.displayName = DialogPrimitive.Portal.displayName\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=open]:fade-in',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground',\n secondary: 'border-transparent bg-secondary text-secondary-foreground',\n outline: 'text-foreground',\n destructive: 'border-transparent bg-destructive text-destructive-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from 'react'\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\nimport { cn } from '../lib/utils'\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn('relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-colors',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-[1px]',\n orientation === 'horizontal' && 'h-2.5 border-t border-t-transparent p-[1px]',\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-xl border bg-card text-card-foreground shadow', className)}\n {...props}\n />\n )\n)\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn('text-2xl font-semibold leading-none tracking-tight', className)} {...props} />\n )\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter }\n","import React, { useMemo, useState } from 'react'\nimport { CreditCard, Loader2, Trash2, WalletCards } from 'lucide-react'\nimport { CardDetailsForm } from './CardDetailsForm'\nimport { usePaymentMethods } from '../hooks/usePaymentMethods'\nimport type { BillingDetails, PaymentMethod } from '../types'\nimport { Button } from '../ui/button'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\nimport { Badge } from '../ui/badge'\nimport { ScrollArea } from '../ui/scroll-area'\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../ui/card'\nimport { cn } from '../lib/utils'\n\nconst formatCardLabel = (method: PaymentMethod): string => {\n const brand = method.card_type ? method.card_type.toUpperCase() : 'CARD'\n const lastFour = method.last_four ? `•••• ${method.last_four}` : ''\n return `${brand} ${lastFour}`.trim()\n}\n\nexport interface StoredPaymentMethodsProps {\n selectedMethodId?: string | null\n onMethodSelect?: (method: PaymentMethod) => void\n showAddButton?: boolean\n heading?: string\n description?: string\n}\n\nexport const StoredPaymentMethods: React.FC<StoredPaymentMethodsProps> = ({\n selectedMethodId,\n onMethodSelect,\n showAddButton = true,\n heading = 'Payment Methods',\n description = 'Manage your saved cards',\n}) => {\n const { listQuery, createMutation, deleteMutation } = usePaymentMethods()\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [deletingId, setDeletingId] = useState<string | null>(null)\n\n const payments = useMemo(() => listQuery.data?.data ?? [], [listQuery.data])\n\n const handleCardTokenize = (token: string, billing: BillingDetails) => {\n createMutation.mutate({ token, billing })\n }\n\n const handleDelete = (method: PaymentMethod) => {\n setDeletingId(method.id)\n deleteMutation.mutate(\n { id: method.id },\n {\n onSettled: () => setDeletingId(null),\n }\n )\n }\n\n return (\n <Card className=\"border-border/60 bg-card/95\">\n <CardHeader className=\"flex flex-row items-start justify-between space-y-0\">\n <div className=\"space-y-1\">\n <CardTitle className=\"text-base font-semibold text-foreground\">\n <span className=\"flex items-center gap-2 text-sm font-medium text-muted-foreground\">\n <WalletCards className=\"h-4 w-4\" /> {heading}\n </span>\n </CardTitle>\n <CardDescription>{description}</CardDescription>\n </div>\n {showAddButton && (\n <Button size=\"sm\" onClick={() => setIsModalOpen(true)}>\n <CreditCard className=\"mr-2 h-4 w-4\" /> Add card\n </Button>\n )}\n </CardHeader>\n <CardContent>\n {listQuery.isLoading ? (\n <div className=\"flex items-center justify-center rounded-lg border border-dashed border-border/60 bg-muted/10 py-8 text-sm text-muted-foreground\">\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> Loading cards…\n </div>\n ) : payments.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-border/60 bg-muted/10 px-4 py-6 text-sm text-muted-foreground\">\n No saved payment methods yet.\n </div>\n ) : (\n <ScrollArea className=\"max-h-[320px] pr-2\">\n <div className=\"space-y-3\">\n {payments.map((method) => {\n const isSelected = selectedMethodId === method.id\n return (\n <div\n key={method.id}\n className={cn(\n 'flex flex-col gap-3 rounded-lg border px-4 py-3 transition-colors md:flex-row md:items-center md:justify-between',\n isSelected\n ? 'border-primary/60 bg-primary/5'\n : 'border-border/60 bg-background'\n )}\n >\n <div className=\"space-y-1\">\n <p className=\"text-sm font-semibold text-foreground\">\n {formatCardLabel(method)}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Added on{' '}\n {method.created_at\n ? new Date(method.created_at).toLocaleDateString()\n : 'unknown'}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge\n variant={method.is_active ? 'default' : 'secondary'}\n className={cn(\n method.is_active\n ? 'bg-primary/20 text-primary'\n : 'bg-muted text-muted-foreground'\n )}\n >\n {method.is_active ? 'Active' : 'Inactive'}\n </Badge>\n {method.failure_reason && (\n <Badge variant=\"destructive\">{method.failure_reason}</Badge>\n )}\n {onMethodSelect && (\n <Button\n size=\"sm\"\n variant={isSelected ? 'default' : 'outline'}\n onClick={() => onMethodSelect(method)}\n >\n {isSelected ? 'Selected' : 'Use card'}\n </Button>\n )}\n <Button\n size=\"icon\"\n variant=\"outline\"\n className=\"text-destructive\"\n onClick={() => handleDelete(method)}\n disabled={deletingId === method.id && deleteMutation.isPending}\n >\n {deletingId === method.id && deleteMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trash2 className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </div>\n )\n })}\n </div>\n </ScrollArea>\n )}\n </CardContent>\n\n <Dialog open={isModalOpen} onOpenChange={setIsModalOpen}>\n <DialogContent className=\"max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>Add a new card</DialogTitle>\n <DialogDescription>\n Your card details are tokenized securely via our payment provider.\n </DialogDescription>\n </DialogHeader>\n <CardDetailsForm\n visible={isModalOpen}\n collectPrefix=\"payments-ui-card\"\n submitting={createMutation.isPending}\n submitLabel=\"Save card\"\n externalError={createMutation.error?.message ?? null}\n onTokenize={handleCardTokenize}\n />\n </DialogContent>\n </Dialog>\n </Card>\n )\n}\n","import { useMemo } from 'react'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { SolanaPaymentService } from '../services/SolanaPaymentService'\n\nexport const useSolanaService = (): SolanaPaymentService => {\n const { services } = usePaymentContext()\n return useMemo(() => services.solanaPayments, [services])\n}\n","import {\n Connection,\n PublicKey,\n LAMPORTS_PER_SOL,\n ParsedAccountData,\n} from '@solana/web3.js'\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token'\nimport { TokenInfo } from '../../types'\n\nexport interface TokenBalance {\n mint: string\n symbol: string\n name: string\n balance: number\n uiBalance: string\n decimals: number\n isNative: boolean\n}\n\nexport interface ParsedTokenAccount {\n mint: string\n owner: string\n amount: string\n uiAmount: number\n decimals: number\n}\n\nexport const getSolBalance = async (\n connection: Connection,\n publicKey: PublicKey\n): Promise<number> => {\n try {\n const lamports = await connection.getBalance(publicKey)\n return lamports / LAMPORTS_PER_SOL\n } catch (error) {\n console.error('Failed to fetch SOL balance:', error)\n return 0\n }\n}\n\nexport const fetchAllTokenBalances = async (\n connection: Connection,\n publicKey: PublicKey\n): Promise<Map<string, number>> => {\n const balances = new Map<string, number>()\n\n try {\n const tokenAccounts = await connection.getParsedProgramAccounts(\n TOKEN_PROGRAM_ID,\n {\n filters: [\n {\n dataSize: 165, // Size of token account\n },\n {\n memcmp: {\n offset: 32, // Owner field offset\n bytes: publicKey.toString(),\n },\n },\n ],\n }\n )\n\n for (const account of tokenAccounts) {\n const data = account.account.data as ParsedAccountData\n interface TokenParsed { info?: { mint: string; tokenAmount?: { uiAmount?: number } } }\n const parsed = data.parsed as TokenParsed\n const info = parsed?.info\n if (info && info.tokenAmount) {\n const mintAddress = info.mint\n const uiAmount = info.tokenAmount.uiAmount || 0\n\n if (uiAmount > 0) {\n balances.set(mintAddress, uiAmount)\n }\n }\n }\n } catch (error) {\n console.error('Failed to fetch token balances:', error)\n }\n\n return balances\n}\n\nexport const getTokenBalance = async (\n connection: Connection,\n publicKey: PublicKey,\n mintAddress: string\n): Promise<number> => {\n try {\n const tokenAccounts = await connection.getTokenAccountsByOwner(publicKey, {\n mint: new PublicKey(mintAddress),\n })\n\n if (tokenAccounts.value.length === 0) {\n return 0\n }\n\n const tokenAccount = tokenAccounts.value[0]\n const accountInfo = await connection.getParsedAccountInfo(\n tokenAccount.pubkey\n )\n\n const valueData = accountInfo.value?.data as ParsedAccountData | null | undefined\n if (valueData && valueData.parsed) {\n interface TokenParsed { info?: { tokenAmount?: { uiAmount?: number } } }\n const parsed = valueData.parsed as TokenParsed\n if (parsed.info?.tokenAmount) {\n return parsed.info.tokenAmount.uiAmount || 0\n }\n }\n\n return 0\n } catch (error) {\n console.error(`Failed to fetch balance for token ${mintAddress}:`, error)\n return 0\n }\n}\n\nexport const fetchSupportedTokenBalances = async (\n connection: Connection,\n publicKey: PublicKey,\n supportedTokens: TokenInfo[]\n): Promise<TokenBalance[]> => {\n const results: TokenBalance[] = []\n\n const solBalance = await getSolBalance(connection, publicKey)\n const solTokenMeta =\n supportedTokens.find((token) => token.is_native || token.symbol === 'SOL') ||\n {\n symbol: 'SOL',\n name: 'Solana',\n mint: 'So11111111111111111111111111111111111111112',\n decimals: 9,\n price: 0,\n is_native: true,\n }\n\n results.push({\n mint: solTokenMeta.mint,\n symbol: solTokenMeta.symbol,\n name: solTokenMeta.name,\n balance: solBalance,\n uiBalance: solBalance.toFixed(solTokenMeta.decimals <= 4 ? solTokenMeta.decimals : 4),\n decimals: solTokenMeta.decimals,\n isNative: true,\n })\n\n const tokenBalances = await fetchAllTokenBalances(connection, publicKey)\n\n const tokenMetaByMint = new Map(\n supportedTokens\n .filter((token) => !(token.is_native || token.symbol === 'SOL'))\n .map((token) => [token.mint, token])\n )\n\n for (const [mint, tokenMeta] of tokenMetaByMint.entries()) {\n const balance = tokenBalances.get(mint) || 0\n\n results.push({\n mint,\n symbol: tokenMeta.symbol,\n name: tokenMeta.name,\n balance,\n uiBalance: balance.toFixed(tokenMeta.decimals <= 6 ? tokenMeta.decimals : 6),\n decimals: tokenMeta.decimals,\n isNative: false,\n })\n }\n\n return results\n}\n\n/**\n * Parse token account data from RPC response\n * @param accountData - Raw account data from RPC\n * @returns Parsed token account info\n */\nexport const parseTokenAccountData = (\n accountData: any\n): ParsedTokenAccount | null => {\n try {\n const parsedInfo = accountData.parsed?.info\n if (!parsedInfo) return null\n\n return {\n mint: parsedInfo.mint,\n owner: parsedInfo.owner,\n amount: parsedInfo.tokenAmount.amount,\n uiAmount: parsedInfo.tokenAmount.uiAmount || 0,\n decimals: parsedInfo.tokenAmount.decimals,\n }\n } catch (error) {\n console.error('Failed to parse token account data:', error)\n return null\n }\n}\n\nexport const convertToUIAmount = (\n rawAmount: string,\n decimals: number\n): number => {\n try {\n const amount = parseInt(rawAmount, 10)\n return amount / Math.pow(10, decimals)\n } catch (error) {\n console.error('Failed to convert to UI amount:', error)\n return 0\n }\n}\n\nexport const convertToRawAmount = (\n uiAmount: number,\n decimals: number\n): string => {\n try {\n const rawAmount = Math.floor(uiAmount * Math.pow(10, decimals))\n return rawAmount.toString()\n } catch (error) {\n console.error('Failed to convert to raw amount:', error)\n return '0'\n }\n}\n\nexport const hasSufficientBalance = (\n balance: number,\n requiredAmount: number,\n buffer: number = 0.05\n): boolean => {\n const requiredWithBuffer = requiredAmount * (1 + buffer)\n return balance >= requiredWithBuffer\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useWallet } from '@solana/wallet-adapter-react'\nimport { Buffer } from 'buffer'\nimport {\n Connection,\n Transaction,\n VersionedTransaction,\n} from '@solana/web3.js'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport { useSolanaService } from './useSolanaService'\nimport {\n fetchSupportedTokenBalances,\n hasSufficientBalance,\n} from '../utils/solana'\n\ninterface UseSolanaDirectPaymentOptions {\n priceId: string\n tokenAmount: number\n selectedToken: TokenInfo | null\n supportedTokens: TokenInfo[]\n onStart: () => void\n onConfirming: () => void\n onSuccess: (result: SubmitPaymentResponse, txId: string) => void\n onError: (error: string) => void\n}\n\ninterface SolanaDirectPaymentState {\n isBalanceLoading: boolean\n isProcessing: boolean\n balanceLabel: string\n canPay: boolean\n pay: () => Promise<void>\n}\n\ninterface TokenBalanceState {\n balance: number\n hasBalance: boolean\n}\n\nexport const useSolanaDirectPayment = (\n options: UseSolanaDirectPaymentOptions\n): SolanaDirectPaymentState => {\n const { priceId, tokenAmount, selectedToken, supportedTokens, onStart, onConfirming, onSuccess, onError } = options\n const { connected, publicKey, wallet, signTransaction } = useWallet()\n const { config } = usePaymentContext()\n const solanaService = useSolanaService()\n\n const [tokenBalance, setTokenBalance] = useState<TokenBalanceState | null>(null)\n const [isBalanceLoading, setIsBalanceLoading] = useState(false)\n const [isProcessing, setIsProcessing] = useState(false)\n\n const connection = useMemo(() => {\n const rpc = config.solanaRpcUrl ?? 'https://api.mainnet-beta.solana.com'\n return new Connection(rpc)\n }, [config.solanaRpcUrl])\n\n const fetchTokenBalance = useCallback(async () => {\n if (!connected || !publicKey || !selectedToken) {\n setTokenBalance({ balance: 0, hasBalance: false })\n return\n }\n\n try {\n setIsBalanceLoading(true)\n const balances = await fetchSupportedTokenBalances(\n connection,\n publicKey,\n supportedTokens\n )\n const balanceInfo = balances.find(\n (tb) => tb.symbol === selectedToken.symbol || tb.mint === selectedToken.mint\n )\n\n const balance = balanceInfo?.balance || 0\n const hasBalanceFlag = hasSufficientBalance(balance, tokenAmount)\n\n setTokenBalance({ balance, hasBalance: hasBalanceFlag })\n } catch (error) {\n console.error('Failed to fetch token balance:', error)\n setTokenBalance({ balance: 0, hasBalance: false })\n } finally {\n setIsBalanceLoading(false)\n }\n }, [connected, publicKey, connection, selectedToken, tokenAmount, supportedTokens])\n\n useEffect(() => {\n if (connected && publicKey && selectedToken) {\n void fetchTokenBalance()\n }\n }, [connected, publicKey, selectedToken, tokenAmount, fetchTokenBalance])\n\n const decodeTransaction = useCallback((serialized: string) => {\n const buffer = Buffer.from(serialized, 'base64')\n try {\n return VersionedTransaction.deserialize(buffer)\n } catch (err) {\n try {\n return Transaction.from(buffer)\n } catch (legacyErr) {\n console.error('Failed to deserialize transaction', legacyErr)\n throw new Error('Invalid transaction payload received from server')\n }\n }\n }, [])\n\n const isVersionedTransaction = (tx: unknown): tx is VersionedTransaction => {\n return !!tx && typeof tx === 'object' && 'version' in tx\n }\n\n const signWithWallet = useCallback(\n async (tx: Transaction | VersionedTransaction) => {\n if (!wallet) {\n throw new Error('Wallet adapter is not available')\n }\n\n const adapter = wallet.adapter as unknown as {\n signTransaction?: (transaction: Transaction) => Promise<Transaction>\n signVersionedTransaction?: (\n transaction: VersionedTransaction\n ) => Promise<VersionedTransaction>\n supportedTransactionVersions?: Set<number | 'legacy'> | null\n }\n\n if (isVersionedTransaction(tx)) {\n if (adapter.supportedTransactionVersions) {\n const supported = adapter.supportedTransactionVersions\n if (!supported.has(tx.version)) {\n throw new Error('Connected wallet does not support this transaction version')\n }\n }\n\n if (adapter.signVersionedTransaction) {\n return adapter.signVersionedTransaction(tx)\n }\n }\n\n if (adapter.signTransaction) {\n return adapter.signTransaction(tx as Transaction)\n }\n\n if (signTransaction) {\n return signTransaction(tx as Transaction)\n }\n\n throw new Error('Connected wallet cannot sign transactions')\n },\n [wallet, signTransaction]\n )\n\n const pay = useCallback(async () => {\n if (!connected || !publicKey) {\n onError('Wallet not connected')\n return\n }\n\n if (!selectedToken) {\n onError('No payment token selected')\n return\n }\n\n if (!tokenBalance?.hasBalance) {\n onError('Insufficient balance for this token')\n return\n }\n\n try {\n setIsProcessing(true)\n onStart()\n\n const paymentData = await solanaService.generatePayment(\n priceId,\n selectedToken.symbol,\n publicKey.toBase58()\n )\n\n const transactionToSign = decodeTransaction(paymentData.transaction)\n const signedTx = await signWithWallet(transactionToSign)\n const signedSerialized = Buffer.from(signedTx.serialize()).toString('base64')\n\n onConfirming()\n\n const result = await solanaService.submitPayment(\n signedSerialized,\n priceId,\n paymentData.intent_id,\n `Payment for subscription - ${selectedToken.symbol}`\n )\n\n onSuccess(result, result.transaction_id)\n } catch (err) {\n console.error('Payment failed:', err)\n\n let errorMessage = 'Payment failed. Please try again.'\n const message =\n err instanceof Error ? err.message : typeof err === 'string' ? err : ''\n\n if (message.includes('User rejected')) {\n errorMessage = 'Payment cancelled by user'\n } else if (/insufficient\\s+funds/i.test(message)) {\n errorMessage = 'Insufficient balance for this token'\n } else if (message) {\n errorMessage = message\n }\n\n onError(errorMessage)\n } finally {\n setIsProcessing(false)\n }\n }, [\n connected,\n publicKey,\n selectedToken,\n tokenBalance?.hasBalance,\n onError,\n onStart,\n solanaService,\n priceId,\n decodeTransaction,\n signWithWallet,\n onConfirming,\n onSuccess,\n ])\n\n const balanceLabel = tokenBalance\n ? `${tokenBalance.balance.toFixed(4)} ${selectedToken?.symbol ?? ''}`\n : '--'\n\n return {\n isBalanceLoading,\n isProcessing,\n balanceLabel,\n canPay: Boolean(\n connected && tokenBalance?.hasBalance && !isProcessing\n ),\n pay,\n }\n}\n","import React from 'react'\nimport { Loader2, Wallet } from 'lucide-react'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { useSolanaDirectPayment } from '../hooks/useSolanaDirectPayment'\nimport { Button } from '../ui/button'\nimport { Card } from '../ui/card'\n\ninterface DirectPaymentProps {\n priceId: string\n tokenAmount: number\n selectedToken: TokenInfo | null\n supportedTokens: TokenInfo[]\n onPaymentStart: () => void\n onPaymentConfirming: () => void\n onPaymentSuccess: (result: SubmitPaymentResponse, txId: string) => void\n onPaymentError: (error: string) => void\n}\n\nexport const DirectPayment: React.FC<DirectPaymentProps> = ({\n priceId,\n tokenAmount,\n selectedToken,\n supportedTokens,\n onPaymentStart,\n onPaymentConfirming,\n onPaymentSuccess,\n onPaymentError,\n}) => {\n const { isBalanceLoading, balanceLabel, canPay, isProcessing, pay } =\n useSolanaDirectPayment({\n priceId,\n tokenAmount,\n selectedToken,\n supportedTokens,\n onStart: onPaymentStart,\n onConfirming: onPaymentConfirming,\n onSuccess: onPaymentSuccess,\n onError: onPaymentError,\n })\n\n return (\n <Card className=\"space-y-4 border border-border/60 bg-background/80 p-6\">\n <div className=\"space-y-1\">\n <p className=\"flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">\n <Wallet className=\"h-4 w-4\" /> Pay with connected wallet\n </p>\n <p className=\"text-sm text-muted-foreground\">\n Sign the transaction directly in your Solana wallet.\n </p>\n </div>\n\n <div className=\"flex items-center justify-between rounded-lg border border-border/50 bg-muted/10 px-4 py-3 text-sm\">\n <span className=\"text-muted-foreground\">Available balance</span>\n {isBalanceLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n ) : (\n <strong className=\"text-foreground\">{balanceLabel}</strong>\n )}\n </div>\n\n <Button\n type=\"button\"\n className=\"w-full\"\n disabled={!canPay}\n onClick={pay}\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> Processing…\n </>\n ) : (\n <>\n <Wallet className=\"mr-2 h-4 w-4\" /> Pay with wallet\n </>\n )}\n </Button>\n </Card>\n )\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport QRCode from 'qrcode'\nimport type { TokenInfo, SubmitPaymentResponse } from '../types'\nimport type {\n SolanaPayQRCodeIntent,\n SolanaPayStatusResponse,\n} from '../types/solana-pay'\nimport { useSolanaService } from './useSolanaService'\n\ninterface UseSolanaQrPaymentOptions {\n priceId: string\n selectedToken: TokenInfo | null\n onSuccess: (result: SubmitPaymentResponse | string, txId: string) => void\n onError: (error: string) => void\n}\n\ninterface UseSolanaQrPaymentState {\n intent: SolanaPayQRCodeIntent | null\n qrDataUri: string | null\n isLoading: boolean\n error: string | null\n timeRemaining: number\n refresh: () => void\n}\n\nexport const useSolanaQrPayment = (\n options: UseSolanaQrPaymentOptions\n): UseSolanaQrPaymentState => {\n const { priceId, selectedToken, onSuccess, onError } = options\n const solanaService = useSolanaService()\n\n const [intent, setIntent] = useState<SolanaPayQRCodeIntent | null>(null)\n const [qrDataUri, setQrDataUri] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [timeRemaining, setTimeRemaining] = useState(0)\n\n const pollRef = useRef<NodeJS.Timeout | null>(null)\n const countdownRef = useRef<NodeJS.Timeout | null>(null)\n\n const clearTimers = useCallback(() => {\n if (pollRef.current) {\n clearInterval(pollRef.current)\n pollRef.current = null\n }\n if (countdownRef.current) {\n clearInterval(countdownRef.current)\n countdownRef.current = null\n }\n }, [])\n\n useEffect(() => {\n return () => {\n clearTimers()\n }\n }, [clearTimers])\n\n const handleError = useCallback(\n (message: string, notifyParent = false) => {\n clearTimers()\n setError(message)\n setIntent(null)\n setQrDataUri(null)\n setTimeRemaining(0)\n if (notifyParent) {\n onError(message)\n }\n },\n [clearTimers, onError]\n )\n\n const handleSuccess = useCallback(\n (status: SolanaPayStatusResponse) => {\n clearTimers()\n setTimeRemaining(0)\n setIntent(null)\n onSuccess(status.payment_id, status.transaction || '')\n },\n [clearTimers, onSuccess]\n )\n\n const pollStatus = useCallback(\n async (reference: string) => {\n try {\n const status = await solanaService.checkPaymentStatus(reference)\n\n if (status.status === 'confirmed') {\n handleSuccess(status)\n }\n\n if (status.status === 'failed') {\n handleError(\n status.error_message || 'Payment failed. Please try again.',\n true\n )\n }\n } catch (err) {\n console.error('Failed to poll Solana Pay status:', err)\n }\n },\n [handleError, handleSuccess, solanaService]\n )\n\n const startCountdown = useCallback(\n (expiresAt: number, reference: string) => {\n const updateTime = () => {\n const remaining = Math.max(0, Math.floor(expiresAt - Date.now() / 1000))\n setTimeRemaining(remaining)\n\n if (remaining === 0) {\n handleError('Payment intent expired. Please generate a new QR code.')\n }\n }\n\n updateTime()\n\n countdownRef.current = setInterval(updateTime, 1000)\n pollRef.current = setInterval(() => void pollStatus(reference), 4000)\n },\n [handleError, pollStatus]\n )\n\n const renderQr = useCallback(async (qrIntent: SolanaPayQRCodeIntent) => {\n try {\n const dataUri = await QRCode.toDataURL(qrIntent.url, {\n width: 320,\n margin: 1,\n color: {\n dark: '#0f1116',\n light: '#ffffff',\n },\n })\n setQrDataUri(dataUri)\n } catch (err) {\n console.error('Failed to render QR code:', err)\n handleError('Unable to render QR code')\n }\n }, [handleError])\n\n const fetchIntent = useCallback(async () => {\n if (!selectedToken) {\n setIntent(null)\n setQrDataUri(null)\n setError(null)\n clearTimers()\n setTimeRemaining(0)\n return\n }\n\n try {\n setIsLoading(true)\n setError(null)\n clearTimers()\n\n const nextIntent = await solanaService.generateQRCode(\n priceId,\n selectedToken.symbol\n )\n setIntent(nextIntent)\n setTimeRemaining(\n Math.max(0, Math.floor(nextIntent.expires_at - Date.now() / 1000))\n )\n await renderQr(nextIntent)\n startCountdown(nextIntent.expires_at, nextIntent.reference)\n pollStatus(nextIntent.reference)\n } catch (err) {\n console.error('Failed to generate Solana Pay QR intent:', err)\n const message =\n err instanceof Error\n ? err.message\n : 'Unable to create Solana Pay QR code'\n handleError(message)\n } finally {\n setIsLoading(false)\n }\n }, [\n clearTimers,\n handleError,\n pollStatus,\n priceId,\n selectedToken,\n solanaService,\n startCountdown,\n renderQr,\n ])\n\n useEffect(() => {\n void fetchIntent()\n }, [fetchIntent])\n\n return {\n intent,\n qrDataUri,\n isLoading,\n error,\n timeRemaining,\n refresh: fetchIntent,\n }\n}\n","import React from 'react'\nimport { Loader2, RefreshCw } from 'lucide-react'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { useSolanaQrPayment } from '../hooks/useSolanaQrPayment'\nimport { Button } from '../ui/button'\nimport { Card } from '../ui/card'\n\ninterface QRCodePaymentProps {\n priceId: string\n selectedToken: TokenInfo | null\n onPaymentError: (error: string) => void\n onPaymentSuccess: (result: SubmitPaymentResponse | string, txId: string) => void\n}\n\nexport const QRCodePayment: React.FC<QRCodePaymentProps> = ({\n priceId,\n selectedToken,\n onPaymentError,\n onPaymentSuccess,\n}) => {\n const { intent, qrDataUri, isLoading, error, timeRemaining, refresh } =\n useSolanaQrPayment({\n priceId,\n selectedToken,\n onError: onPaymentError,\n onSuccess: onPaymentSuccess,\n })\n\n if (!selectedToken) {\n return (\n <div className=\"rounded-xl border border-dashed border-border/60 bg-muted/10 px-4 py-6 text-center text-sm text-muted-foreground\">\n Select a token to continue.\n </div>\n )\n }\n\n return (\n <Card className=\"space-y-4 border border-border/60 bg-background/80 p-6\">\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"text-sm font-semibold text-foreground\">Scan with Solana Pay</p>\n <p className=\"text-sm text-muted-foreground\">\n Use any Solana Pay compatible wallet to scan and confirm.\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n onClick={() => refresh()}\n disabled={isLoading}\n >\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-4 py-2 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n <div className=\"flex items-center justify-center rounded-2xl border border-dashed border-border/70 bg-muted/5 p-6\">\n {qrDataUri ? (\n <img src={qrDataUri} alt=\"Solana Pay QR\" className=\"h-72 w-72 rounded-lg border border-border/40 bg-card\" />\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-sm text-muted-foreground\">\n {isLoading ? (\n <>\n <Loader2 className=\"h-5 w-5 animate-spin\" /> Generating QR code…\n </>\n ) : (\n 'QR code unavailable'\n )}\n </div>\n )}\n </div>\n\n {intent && (\n <div className=\"text-center text-sm text-muted-foreground\">\n Expires in {timeRemaining}s · {intent.token_amount} {intent.token_symbol}\n </div>\n )}\n </Card>\n )\n}\n","import React from 'react'\nimport { CheckCircle, Loader2, RotateCcw, XCircle } from 'lucide-react'\nimport { Button } from '../ui/button'\n\ninterface PaymentStatusProps {\n state: 'selecting' | 'processing' | 'confirming' | 'success' | 'error'\n usdAmount: number\n solAmount?: number\n transactionId?: string | null\n errorMessage?: string | null\n onRetry?: () => void\n onClose?: () => void\n}\n\nexport const PaymentStatus: React.FC<PaymentStatusProps> = ({\n state,\n usdAmount,\n solAmount,\n transactionId,\n errorMessage,\n onRetry,\n onClose,\n}) => {\n if (state === 'processing' || state === 'confirming') {\n return (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-primary\" />\n <div>\n <p className=\"text-lg font-semibold text-foreground\">\n {state === 'processing' ? 'Processing payment…' : 'Awaiting confirmation…'}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n ${usdAmount.toFixed(2)} {solAmount ? `· ≈ ${solAmount.toFixed(4)} SOL` : ''}\n </p>\n </div>\n </div>\n )\n }\n\n if (state === 'success') {\n return (\n <div className=\"flex flex-col items-center gap-4 text-center\">\n <CheckCircle className=\"h-12 w-12 text-primary\" />\n <div>\n <p className=\"text-lg font-semibold text-foreground\">Payment complete</p>\n {transactionId && (\n <p className=\"text-xs text-muted-foreground\">Txn: {transactionId}</p>\n )}\n </div>\n <Button variant=\"secondary\" onClick={onClose} className=\"w-full\">\n Close\n </Button>\n </div>\n )\n }\n\n if (state === 'error') {\n return (\n <div className=\"flex flex-col items-center gap-4 text-center\">\n <XCircle className=\"h-12 w-12 text-destructive\" />\n <div>\n <p className=\"text-lg font-semibold text-foreground\">Payment failed</p>\n {errorMessage && (\n <p className=\"text-sm text-muted-foreground\">{errorMessage}</p>\n )}\n </div>\n <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n {onRetry && (\n <Button variant=\"secondary\" className=\"flex-1\" onClick={onRetry}>\n <RotateCcw className=\"mr-2 h-4 w-4\" /> Try again\n </Button>\n )}\n <Button className=\"flex-1\" onClick={onClose}>\n Close\n </Button>\n </div>\n </div>\n )\n }\n\n return null\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport { TokenInfo } from '../types'\nimport { useSolanaService } from './useSolanaService'\n\nexport const useSupportedTokens = () => {\n const solanaService = useSolanaService()\n const [tokens, setTokens] = useState<TokenInfo[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [lastFetched, setLastFetched] = useState<number | null>(null)\n\n // Cache duration: 5 minutes\n const CACHE_DURATION = 5 * 60 * 1000\n\n // Use refs to avoid dependency issues\n const tokensRef = useRef(tokens)\n const lastFetchedRef = useRef(lastFetched)\n\n // Update refs when state changes\n tokensRef.current = tokens\n lastFetchedRef.current = lastFetched\n\n // Fetch supported tokens from backend\n const fetchSupportedTokens = useCallback(async () => {\n // Check if we have fresh cached data\n if (\n tokensRef.current.length > 0 &&\n lastFetchedRef.current &&\n Date.now() - lastFetchedRef.current < CACHE_DURATION\n ) {\n return tokensRef.current\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const tokens = await solanaService.getSupportedTokens()\n\n // Sort tokens by symbol for consistent ordering\n const sortedTokens = [...tokens].sort((a, b) =>\n a.symbol.localeCompare(b.symbol)\n )\n\n setTokens(sortedTokens)\n setLastFetched(Date.now())\n return sortedTokens\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch supported tokens'\n setError(errorMessage)\n console.error('Failed to fetch supported tokens:', error)\n\n // Return empty array on error\n return []\n } finally {\n setIsLoading(false)\n }\n }, [solanaService])\n\n // Auto-fetch on mount\n useEffect(() => {\n if (tokens.length === 0) {\n fetchSupportedTokens()\n }\n }, [tokens.length, fetchSupportedTokens])\n\n // Get token by symbol\n const getTokenBySymbol = useCallback(\n (symbol: string): TokenInfo | undefined => {\n return tokens.find((token) => token.symbol === symbol)\n },\n [tokens]\n )\n\n // Get token by mint address\n const getTokenByMint = useCallback(\n (mintAddress: string): TokenInfo | undefined => {\n return tokens.find((token) => token.mint === mintAddress)\n },\n [tokens]\n )\n\n // Check if a token is supported\n const isTokenSupported = useCallback(\n (symbol: string): boolean => {\n return tokens.some((token) => token.symbol === symbol)\n },\n [tokens]\n )\n\n // Get USDC token (primary stablecoin)\n const getUSDCToken = useCallback((): TokenInfo | undefined => {\n return getTokenBySymbol('USDC')\n }, [getTokenBySymbol])\n\n // Get PYUSD token (secondary stablecoin)\n const getPYUSDToken = useCallback((): TokenInfo | undefined => {\n return getTokenBySymbol('PYUSD')\n }, [getTokenBySymbol])\n\n // Get SOL token (native token)\n const getSOLToken = useCallback((): TokenInfo | undefined => {\n return getTokenBySymbol('SOL')\n }, [getTokenBySymbol])\n\n // Get all stablecoins\n const getStablecoins = useCallback((): TokenInfo[] => {\n return tokens.filter((token) => ['USDC', 'PYUSD'].includes(token.symbol))\n }, [tokens])\n\n // Refresh tokens (bypass cache)\n const refreshTokens = useCallback(async () => {\n setLastFetched(null) // Clear cache\n return await fetchSupportedTokens()\n }, [fetchSupportedTokens])\n\n // Check if cache is stale\n const isCacheStale = useCallback((): boolean => {\n if (!lastFetched) return true\n return Date.now() - lastFetched > CACHE_DURATION\n }, [lastFetched])\n\n // Get token with formatted info for display\n const getTokenDisplayInfo = useCallback((token: TokenInfo) => {\n return {\n ...token,\n displayName: `${token.name} (${token.symbol})`,\n shortAddress: `${token.mint.slice(0, 4)}...${token.mint.slice(-4)}`,\n decimalPlaces: token.decimals,\n }\n }, [])\n\n const getTokenPrice = useCallback(\n (symbol: string): number => {\n const token = getTokenBySymbol(symbol)\n if (!token) return 0\n const price =\n token.price ?? 0\n return typeof price === 'number' ? price : Number(price)\n },\n [getTokenBySymbol]\n )\n\n // Calculate token amount from USD amount\n const calculateTokenAmount = useCallback(\n (usdAmount: number, tokenSymbol: string): string => {\n const token = getTokenBySymbol(tokenSymbol)\n const price = getTokenPrice(tokenSymbol)\n\n if (!token || price === 0) return '0'\n\n const tokenAmount = usdAmount / price\n const tokenAmountInSmallestUnit =\n tokenAmount * Math.pow(10, token.decimals)\n\n return Math.floor(tokenAmountInSmallestUnit).toString()\n },\n [getTokenBySymbol, getTokenPrice]\n )\n\n // Format token amount for display\n const formatTokenAmount = useCallback(\n (amount: string, tokenSymbol: string): string => {\n const token = getTokenBySymbol(tokenSymbol)\n if (!token) return '0'\n\n const numericAmount = parseFloat(amount)\n const displayAmount = numericAmount / Math.pow(10, token.decimals)\n\n return displayAmount.toFixed(token.decimals <= 6 ? token.decimals : 6)\n },\n [getTokenBySymbol]\n )\n\n return {\n tokens,\n isLoading,\n error,\n lastFetched,\n fetchSupportedTokens,\n refreshTokens,\n getTokenBySymbol,\n getTokenByMint,\n isTokenSupported,\n getUSDCToken,\n getPYUSDToken,\n getSOLToken,\n getStablecoins,\n getTokenDisplayInfo,\n getTokenPrice,\n calculateTokenAmount,\n formatTokenAmount,\n isCacheStale,\n hasTokens: tokens.length > 0,\n tokenCount: tokens.length,\n }\n}\n","import { useStore } from 'zustand'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { PaymentStoreState } from '../state/paymentStore'\n\nexport const usePaymentStore = <T>(\n selector: (state: PaymentStoreState) => T\n): T => {\n const { store } = usePaymentContext()\n return useStore(store, selector)\n}\n","import type { PaymentStoreState } from './paymentStore'\n\nexport const selectCheckoutFlow = (state: PaymentStoreState) => ({\n selectedMethodId: state.selectedMethodId,\n savedStatus: state.savedPaymentStatus,\n savedError: state.savedPaymentError,\n newCardStatus: state.newCardStatus,\n newCardError: state.newCardError,\n solanaModalOpen: state.solanaModalOpen,\n setSelectedMethod: state.setSelectedMethod,\n setSolanaModalOpen: state.setSolanaModalOpen,\n startSavedPayment: state.startSavedPayment,\n completeSavedPayment: state.completeSavedPayment,\n failSavedPayment: state.failSavedPayment,\n startNewCardPayment: state.startNewCardPayment,\n completeNewCardPayment: state.completeNewCardPayment,\n failNewCardPayment: state.failNewCardPayment,\n resetSavedPayment: state.resetSavedPayment,\n})\n\nexport const selectSolanaFlow = (state: PaymentStoreState) => ({\n tab: state.solanaTab,\n status: state.solanaStatus,\n error: state.solanaError,\n transactionId: state.solanaTransactionId,\n tokenAmount: state.solanaTokenAmount,\n selectedTokenSymbol: state.solanaSelectedToken,\n setTab: state.setSolanaTab,\n setTokenAmount: state.setSolanaTokenAmount,\n setTransactionId: state.setSolanaTransactionId,\n setSelectedTokenSymbol: state.setSolanaSelectedToken,\n startSolanaPayment: state.startSolanaPayment,\n confirmSolanaPayment: state.confirmSolanaPayment,\n completeSolanaPayment: state.completeSolanaPayment,\n failSolanaPayment: state.failSolanaPayment,\n resetSolanaPayment: state.resetSolanaPayment,\n})\n","import * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '../lib/utils'\nimport * as React from 'react'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import React, { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useWallet } from '@solana/wallet-adapter-react'\nimport { CreditCard, Loader2, Wallet } from 'lucide-react'\nimport type { SubmitPaymentResponse, TokenInfo } from '../types'\nimport { DirectPayment } from './DirectPayment'\nimport { QRCodePayment } from './QRCodePayment'\nimport { PaymentStatus } from './PaymentStatus'\nimport { useSupportedTokens } from '../hooks/useSupportedTokens'\nimport { usePaymentStore } from '../hooks/usePaymentStore'\nimport { selectSolanaFlow } from '../state/selectors'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\nimport { Button } from '../ui/button'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { cn } from '../lib/utils'\n\ninterface SolanaPaymentSelectorProps {\n isOpen: boolean\n priceId: string\n usdAmount: number\n onClose: () => void\n onError?: (error: string) => void\n onSuccess: (result: SubmitPaymentResponse | string) => void\n}\n\nexport const SolanaPaymentSelector: React.FC<SolanaPaymentSelectorProps> = ({\n isOpen,\n onClose,\n priceId,\n usdAmount,\n onSuccess,\n onError,\n}) => {\n const { connected } = useWallet()\n const {\n tab: activeTab,\n status: paymentState,\n error: errorMessage,\n transactionId,\n tokenAmount,\n selectedTokenSymbol,\n setTab,\n setTokenAmount,\n setTransactionId,\n setSelectedTokenSymbol,\n startSolanaPayment,\n confirmSolanaPayment,\n completeSolanaPayment,\n failSolanaPayment,\n resetSolanaPayment,\n } = usePaymentStore(selectSolanaFlow)\n\n const {\n tokens,\n isLoading: tokensLoading,\n error: tokensError,\n } = useSupportedTokens()\n\n const selectedToken = useMemo<TokenInfo | null>(() => {\n if (!tokens.length) return null\n const explicit = tokens.find((token) => token.symbol === selectedTokenSymbol)\n return explicit || tokens[0]\n }, [tokens, selectedTokenSymbol])\n\n useEffect(() => {\n if (!selectedTokenSymbol && tokens.length) {\n const defaultToken =\n tokens.find((token) => token.symbol === 'SOL') || tokens[0]\n setSelectedTokenSymbol(defaultToken.symbol)\n }\n }, [tokens, selectedTokenSymbol, setSelectedTokenSymbol])\n\n const handlePaymentStart = useCallback(() => {\n startSolanaPayment()\n }, [startSolanaPayment])\n\n const handlePaymentConfirming = useCallback(() => {\n confirmSolanaPayment()\n }, [confirmSolanaPayment])\n\n const handlePaymentSuccess = useCallback(\n (result: SubmitPaymentResponse | string, txId?: string) => {\n const resolvedTx = txId || (typeof result === 'string' ? result : result.transaction_id)\n setTransactionId(resolvedTx)\n completeSolanaPayment(\n typeof result === 'string'\n ? {\n transactionId: resolvedTx,\n processor: 'solana',\n metadata: { source: 'solana-pay' },\n }\n : {\n transactionId: result.transaction_id,\n intentId: result.intent_id,\n processor: 'solana',\n metadata: {\n purchaseId: result.purchase_id,\n amount: result.amount,\n currency: result.currency,\n },\n }\n )\n\n setTimeout(() => {\n onSuccess(result)\n }, 1500)\n },\n [completeSolanaPayment, onSuccess, setTransactionId]\n )\n\n const handlePaymentError = useCallback(\n (error: string) => {\n failSolanaPayment(error)\n onError?.(error)\n },\n [failSolanaPayment, onError]\n )\n\n const handleRetry = useCallback(() => {\n resetSolanaPayment()\n setTransactionId(null)\n }, [resetSolanaPayment, setTransactionId])\n\n const handleClose = useCallback(() => {\n if (paymentState === 'processing' || paymentState === 'confirming') {\n return\n }\n\n resetSolanaPayment()\n setTransactionId(null)\n onClose()\n }, [paymentState, resetSolanaPayment, setTransactionId, onClose])\n\n useEffect(() => {\n if (!isOpen || !selectedToken || usdAmount === 0) {\n setTokenAmount(0)\n return\n }\n\n const price = selectedToken.price ?? 0\n if (!price || price <= 0) {\n setTokenAmount(0)\n return\n }\n\n setTokenAmount(usdAmount / price)\n }, [isOpen, usdAmount, selectedToken, setTokenAmount])\n\n const handleTokenChange = useCallback(\n (value: string) => {\n setSelectedTokenSymbol(value)\n },\n [setSelectedTokenSymbol]\n )\n\n const wasConnectedRef = useRef(connected)\n\n useEffect(() => {\n if (connected && !wasConnectedRef.current) {\n setTab('wallet')\n }\n\n if (!connected && wasConnectedRef.current) {\n setTab('qr')\n }\n\n wasConnectedRef.current = connected\n }, [connected, setTab])\n\n const renderBody = () => {\n if (paymentState !== 'selecting') {\n return (\n <PaymentStatus\n state={paymentState}\n usdAmount={usdAmount}\n solAmount={tokenAmount}\n onRetry={handleRetry}\n onClose={handleClose}\n errorMessage={errorMessage}\n transactionId={transactionId}\n />\n )\n }\n\n return (\n <div className=\"space-y-6\">\n {tokensLoading ? (\n <div className=\"flex items-center justify-center rounded-lg border border-dashed border-border/60 bg-muted/10 py-8 text-sm text-muted-foreground\">\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> Loading supported tokens…\n </div>\n ) : tokensError ? (\n <div className=\"rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n {tokensError}\n </div>\n ) : !tokens.length ? (\n <div className=\"rounded-lg border border-dashed border-border/60 bg-muted/10 px-4 py-6 text-sm text-muted-foreground\">\n No payment tokens available.\n </div>\n ) : (\n <>\n <div className=\"rounded-xl border border-border/60 bg-muted/10 p-4 text-center\">\n <div className=\"text-2xl font-semibold text-foreground\">\n ${usdAmount.toFixed(2)} USD\n </div>\n {selectedToken && tokenAmount > 0 && (\n <div className=\"text-sm text-muted-foreground\">\n ≈ {tokenAmount.toFixed(selectedToken.symbol === 'SOL' ? 4 : 2)} {selectedToken.symbol}\n </div>\n )}\n </div>\n\n <Select value={selectedToken?.symbol ?? ''} onValueChange={handleTokenChange}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select token\" />\n </SelectTrigger>\n <SelectContent className=\"max-h-64\">\n {tokens.map((token) => (\n <SelectItem key={token.symbol} value={token.symbol}>\n {token.name} ({token.symbol})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Tabs\n value={activeTab}\n onValueChange={(value) => setTab(value as 'wallet' | 'qr')}\n className=\"w-full\"\n >\n <TabsList className=\"grid w-full grid-cols-2 bg-muted/20\">\n <TabsTrigger value=\"wallet\" disabled={!connected}>\n <Wallet className=\"mr-2 h-4 w-4\" /> Pay with Wallet\n </TabsTrigger>\n <TabsTrigger value=\"qr\">\n <CreditCard className=\"mr-2 h-4 w-4\" /> Scan QR Code\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"wallet\" className=\"mt-4\">\n <DirectPayment\n priceId={priceId}\n tokenAmount={tokenAmount}\n selectedToken={selectedToken}\n supportedTokens={tokens}\n onPaymentStart={handlePaymentStart}\n onPaymentConfirming={handlePaymentConfirming}\n onPaymentSuccess={handlePaymentSuccess}\n onPaymentError={handlePaymentError}\n />\n </TabsContent>\n <TabsContent value=\"qr\" className=\"mt-4\">\n <QRCodePayment\n priceId={priceId}\n selectedToken={selectedToken}\n onPaymentError={handlePaymentError}\n onPaymentSuccess={handlePaymentSuccess}\n />\n </TabsContent>\n </Tabs>\n\n {!connected && activeTab === 'wallet' && (\n <div className=\"rounded-xl border border-amber-500/40 bg-amber-500/10 p-4 text-sm text-amber-100\">\n Please connect your Solana wallet to complete this payment, or switch to QR mode.\n </div>\n )}\n </>\n )}\n </div>\n )\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={handleClose}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader className=\"space-y-1\">\n <DialogTitle>Complete your payment</DialogTitle>\n <DialogDescription>\n Select a token and preferred method. We’ll guide you through the rest.\n </DialogDescription>\n </DialogHeader>\n {renderBody()}\n </DialogContent>\n </Dialog>\n )\n}\n","import React from 'react'\nimport { CreditCard, Sparkles } from 'lucide-react'\nimport type { BillingDetails, PaymentMethod, SubmitPaymentResponse } from '../types'\nimport { CardDetailsForm } from './CardDetailsForm'\nimport { StoredPaymentMethods } from './StoredPaymentMethods'\nimport { SolanaPaymentSelector } from './SolanaPaymentSelector'\nimport { usePaymentStore } from '../hooks/usePaymentStore'\nimport { selectCheckoutFlow } from '../state/selectors'\nimport { Button } from '../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../ui/card'\nimport { Separator } from '../ui/separator'\n\nexport interface PaymentExperienceProps {\n priceId: string\n usdAmount: number\n onNewCardPayment?: (payload: {\n token: string\n billing: BillingDetails\n }) => Promise<void> | void\n onSavedMethodPayment?: (payload: {\n paymentMethodId: string\n amount: number\n }) => Promise<void> | void\n enableNewCard?: boolean\n enableStoredMethods?: boolean\n enableSolanaPay?: boolean\n checkoutSummary?: React.ReactNode\n onSolanaSuccess?: (result: SubmitPaymentResponse | string) => void\n onSolanaError?: (error: string) => void\n}\n\nexport const PaymentExperience: React.FC<PaymentExperienceProps> = ({\n priceId,\n usdAmount,\n onNewCardPayment,\n onSavedMethodPayment,\n enableNewCard = true,\n enableStoredMethods = true,\n enableSolanaPay = true,\n checkoutSummary,\n onSolanaSuccess,\n onSolanaError,\n}) => {\n const showNewCard = enableNewCard && Boolean(onNewCardPayment)\n const showStored = enableStoredMethods\n\n const {\n selectedMethodId,\n savedStatus,\n savedError,\n newCardStatus,\n newCardError,\n solanaModalOpen,\n setSelectedMethod,\n setSolanaModalOpen,\n startSavedPayment,\n completeSavedPayment,\n failSavedPayment,\n startNewCardPayment,\n completeNewCardPayment,\n failNewCardPayment,\n resetSavedPayment,\n } = usePaymentStore(selectCheckoutFlow)\n\n const handleMethodSelect = (method: PaymentMethod) => {\n setSelectedMethod(method.id)\n resetSavedPayment()\n }\n\n const handleNewCardTokenize = async (token: string, billing: BillingDetails) => {\n if (!onNewCardPayment) return\n try {\n startNewCardPayment()\n await onNewCardPayment({ token, billing })\n completeNewCardPayment()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unable to complete payment'\n failNewCardPayment(message)\n }\n }\n\n const handleSavedPayment = async () => {\n if (!onSavedMethodPayment || !selectedMethodId) return\n try {\n startSavedPayment()\n await onSavedMethodPayment({\n paymentMethodId: selectedMethodId,\n amount: usdAmount,\n })\n completeSavedPayment()\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : 'Unable to complete payment with saved card'\n failSavedPayment(message)\n }\n }\n\n return (\n <div className=\"space-y-8\">\n <Card className=\"border-border/60 bg-card/95\">\n <CardHeader className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div>\n <CardTitle className=\"flex items-center gap-2 text-lg text-foreground\">\n <CreditCard className=\"h-5 w-5 text-primary\" /> Secure checkout\n </CardTitle>\n <CardDescription>Amount due: ${usdAmount.toFixed(2)}</CardDescription>\n </div>\n {checkoutSummary && <div>{checkoutSummary}</div>}\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-8 lg:grid-cols-2\">\n {showStored && (\n <div className=\"space-y-4\">\n <StoredPaymentMethods\n selectedMethodId={selectedMethodId}\n onMethodSelect={handleMethodSelect}\n heading=\"Saved cards\"\n description=\"Use or manage your saved payment methods.\"\n />\n {onSavedMethodPayment && (\n <Button\n className=\"w-full\"\n disabled={!selectedMethodId || savedStatus === 'processing'}\n onClick={handleSavedPayment}\n >\n {savedStatus === 'processing' ? 'Processing…' : 'Pay with selected card'}\n </Button>\n )}\n {savedError && (\n <p className=\"text-sm text-destructive\">{savedError}</p>\n )}\n </div>\n )}\n\n {showNewCard && (\n <div className=\"space-y-4\">\n <div className=\"rounded-2xl border border-border/60 bg-background/80 p-6\">\n <div className=\"mb-4 space-y-1\">\n <p className=\"flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">\n <CreditCard className=\"h-4 w-4\" /> Pay with a new card\n </p>\n <p className=\"text-sm text-muted-foreground\">\n Card details are tokenized via Collect.js and never hit your server.\n </p>\n </div>\n <CardDetailsForm\n visible\n submitLabel=\"Pay now\"\n submitting={newCardStatus === 'processing'}\n externalError={newCardError}\n onTokenize={handleNewCardTokenize}\n />\n </div>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n\n {enableSolanaPay && (\n <Card className=\"border border-primary/40 bg-primary/5\">\n <CardContent className=\"flex flex-col gap-4 text-sm text-primary md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"flex items-center gap-2 text-base font-semibold text-primary\">\n <Sparkles className=\"h-4 w-4\" /> Prefer Solana Pay?\n </p>\n <p className=\"text-sm text-primary/80\">Use a Solana wallet or QR code for instant settlement.</p>\n </div>\n <Button onClick={() => setSolanaModalOpen(true)}>Open Solana Pay</Button>\n </CardContent>\n </Card>\n )}\n\n {enableSolanaPay && (\n <SolanaPaymentSelector\n isOpen={solanaModalOpen}\n onClose={() => setSolanaModalOpen(false)}\n priceId={priceId}\n usdAmount={usdAmount}\n onSuccess={(result) => {\n setSolanaModalOpen(false)\n onSolanaSuccess?.(result)\n }}\n onError={onSolanaError}\n />\n )}\n </div>\n )\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react'\nimport { useWallet, useConnection } from '@solana/wallet-adapter-react'\nimport { PublicKey } from '@solana/web3.js'\nimport { getAssociatedTokenAddress, getAccount } from '@solana/spl-token'\nimport { TokenBalance, TokenInfo } from '../types'\n\nexport const useTokenBalance = (tokens: TokenInfo[]) => {\n const { publicKey } = useWallet()\n const { connection } = useConnection()\n\n const [balances, setBalances] = useState<TokenBalance[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Fetch balance for a specific token\n const fetchTokenBalance = useCallback(\n async (\n token: TokenInfo,\n walletAddress: PublicKey\n ): Promise<TokenBalance> => {\n try {\n const mintPublicKey = new PublicKey(token.mint)\n\n // Get the associated token account address\n const associatedTokenAddress = await getAssociatedTokenAddress(\n mintPublicKey,\n walletAddress\n )\n\n try {\n // Get the token account info\n const tokenAccount = await getAccount(\n connection,\n associatedTokenAddress\n )\n\n const balance = Number(tokenAccount.amount)\n const uiAmount = balance / Math.pow(10, token.decimals)\n\n return {\n token,\n balance,\n uiAmount,\n hasBalance: balance > 0,\n }\n } catch (accountError) {\n // Account doesn't exist, balance is 0\n return {\n token,\n balance: 0,\n uiAmount: 0,\n hasBalance: false,\n }\n }\n } catch (error) {\n console.error(`Failed to fetch balance for ${token.symbol}:`, error)\n return {\n token,\n balance: 0,\n uiAmount: 0,\n hasBalance: false,\n }\n }\n },\n [connection]\n )\n\n // Memoize token serialization to prevent unnecessary refetches\n const tokensKey = useMemo(() => tokens.map((t) => t.mint).join(','), [tokens])\n\n // Auto-fetch balances when wallet or tokens change\n useEffect(() => {\n if (!publicKey || tokens.length === 0) {\n setBalances([])\n return\n }\n\n setIsLoading(true)\n setError(null)\n\n const fetchAllBalances = async () => {\n try {\n const balancePromises = tokens.map((token) =>\n fetchTokenBalance(token, publicKey)\n )\n const tokenBalances = await Promise.all(balancePromises)\n\n setBalances(tokenBalances)\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch token balances'\n setError(errorMessage)\n console.error('Failed to fetch token balances:', error)\n } finally {\n setIsLoading(false)\n }\n }\n\n fetchAllBalances()\n }, [publicKey, tokensKey, fetchTokenBalance]) // Use stable dependencies\n\n // Get balance for a specific token\n const getTokenBalance = useCallback(\n (tokenSymbol: string): TokenBalance | undefined => {\n return balances.find((balance) => balance.token.symbol === tokenSymbol)\n },\n [balances]\n )\n\n // Check if user has sufficient balance for a payment\n const hasSufficientBalance = useCallback(\n (tokenSymbol: string, requiredAmount: number): boolean => {\n const balance = getTokenBalance(tokenSymbol)\n return balance ? balance.uiAmount >= requiredAmount : false\n },\n [getTokenBalance]\n )\n\n // Get formatted balance string\n const getFormattedBalance = useCallback(\n (tokenSymbol: string): string => {\n const balance = getTokenBalance(tokenSymbol)\n if (!balance) return '0.00'\n\n // Format with appropriate decimal places\n if (balance.uiAmount < 0.01) {\n return balance.uiAmount.toFixed(6)\n } else if (balance.uiAmount < 1) {\n return balance.uiAmount.toFixed(4)\n } else {\n return balance.uiAmount.toFixed(2)\n }\n },\n [getTokenBalance]\n )\n\n // Refresh balances manually\n const refreshBalances = useCallback(async () => {\n if (!publicKey || tokens.length === 0) {\n setBalances([])\n return\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const balancePromises = tokens.map((token) =>\n fetchTokenBalance(token, publicKey)\n )\n const tokenBalances = await Promise.all(balancePromises)\n\n setBalances(tokenBalances)\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch token balances'\n setError(errorMessage)\n console.error('Failed to fetch token balances:', error)\n } finally {\n setIsLoading(false)\n }\n }, [publicKey, tokens, fetchTokenBalance])\n\n // Get total USD value of balances (would need price data)\n const getTotalValue = useCallback(\n (priceData?: Record<string, number>): number => {\n if (!priceData) return 0\n\n return balances.reduce((total, balance) => {\n const price = priceData[balance.token.symbol] || 0\n return total + balance.uiAmount * price\n }, 0)\n },\n [balances]\n )\n\n // Sort balances by amount (highest first)\n const sortedBalances = [...balances].sort((a, b) => b.uiAmount - a.uiAmount)\n\n // Get balances with positive amounts only\n const positiveBalances = balances.filter((balance) => balance.hasBalance)\n\n return {\n balances: sortedBalances,\n positiveBalances,\n isLoading,\n error,\n refreshBalances,\n getTokenBalance,\n hasSufficientBalance,\n getFormattedBalance,\n getTotalValue,\n hasAnyBalance: positiveBalances.length > 0,\n isConnected: !!publicKey,\n }\n}\n","import { useState, useCallback } from 'react'\nimport { useWallet } from '@solana/wallet-adapter-react'\nimport { Transaction } from '@solana/web3.js'\nimport { Buffer } from 'buffer'\nimport { TokenInfo, SubmitPaymentResponse } from '../types'\nimport { useSolanaService } from './useSolanaService'\n\ninterface DirectPaymentState {\n loading: boolean\n error: string | null\n success: boolean\n transactionId: string | null\n}\n\ninterface UseDirectWalletPaymentReturn {\n paymentState: DirectPaymentState\n payWithWallet: (token: TokenInfo, priceId: string) => Promise<void>\n resetPayment: () => void\n}\n\nexport const useDirectWalletPayment = (): UseDirectWalletPaymentReturn => {\n const { publicKey, signTransaction, connected } = useWallet()\n const solanaService = useSolanaService()\n\n const [paymentState, setPaymentState] = useState<DirectPaymentState>({\n loading: false,\n error: null,\n success: false,\n transactionId: null,\n })\n\n const resetPayment = useCallback(() => {\n setPaymentState({\n loading: false,\n error: null,\n success: false,\n transactionId: null,\n })\n }, [])\n\n const payWithWallet = useCallback(\n async (token: TokenInfo, priceId: string) => {\n if (!connected || !publicKey || !signTransaction) {\n setPaymentState((prev) => ({\n ...prev,\n error: 'Wallet not connected. Please connect your wallet first.',\n }))\n return\n }\n\n setPaymentState({\n loading: true,\n error: null,\n success: false,\n transactionId: null,\n })\n\n try {\n console.log('Generating payment transaction...', {\n token: token.symbol,\n priceId,\n })\n const paymentData = await solanaService.generatePayment(\n priceId,\n token.symbol,\n publicKey.toBase58()\n )\n\n const transactionBuffer = Buffer.from(paymentData.transaction, 'base64')\n const transaction = Transaction.from(transactionBuffer)\n\n console.log('Requesting wallet signature...')\n const signedTransaction = await signTransaction(transaction)\n\n const signedTransactionBase64 = signedTransaction\n .serialize()\n .toString('base64')\n\n console.log('Submitting signed transaction...')\n const submitResult: SubmitPaymentResponse = await solanaService.submitPayment(\n signedTransactionBase64,\n priceId,\n paymentData.intent_id\n )\n\n setPaymentState({\n loading: false,\n error: null,\n success: true,\n transactionId: submitResult.transaction_id,\n })\n\n console.log('Payment successful!', submitResult)\n } catch (err: unknown) {\n console.error('Payment failed:', err)\n\n let errorMessage = 'Payment failed. Please try again.'\n const message =\n err instanceof Error ? err.message : typeof err === 'string' ? err : ''\n\n if (message.includes('User rejected')) {\n errorMessage = 'Payment cancelled by user.'\n } else if (/insufficient\\s+funds/i.test(message)) {\n errorMessage = `Insufficient ${token.symbol} balance.`\n } else if (/network/i.test(message)) {\n errorMessage = 'Network error. Please check your connection.'\n } else if (message) {\n errorMessage = message\n }\n\n setPaymentState({\n loading: false,\n error: errorMessage,\n success: false,\n transactionId: null,\n })\n }\n },\n [connected, publicKey, signTransaction, solanaService]\n )\n\n return {\n paymentState,\n payWithWallet,\n resetPayment,\n }\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport { useConnection } from '@solana/wallet-adapter-react'\nimport { TransactionStatus, PaymentStatusResponse } from '../types'\nimport { usePaymentContext } from '../context/PaymentContext'\n\ninterface PaymentStatusHookOptions {\n transactionId?: string\n purchaseId?: string\n onConfirmed?: () => void\n onFailed?: (error: string) => void\n maxRetries?: number\n retryInterval?: number // milliseconds\n}\n\nexport const usePaymentStatus = (options: PaymentStatusHookOptions = {}) => {\n const { connection } = useConnection()\n const { services } = usePaymentContext()\n const billingApi = services.billingApi\n const {\n transactionId,\n purchaseId,\n onConfirmed,\n onFailed,\n maxRetries = 30, // 5 minutes with 10s intervals\n retryInterval = 10000, // 10 seconds\n } = options\n\n const [status, setStatus] = useState<TransactionStatus | null>(null)\n const [paymentStatus, setPaymentStatus] =\n useState<PaymentStatusResponse | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [retryCount, setRetryCount] = useState(0)\n\n const intervalRef = useRef<NodeJS.Timeout | null>(null)\n const isMonitoringRef = useRef(false)\n\n // Clear interval on unmount\n useEffect(() => {\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, [])\n\n // Check transaction status on Solana blockchain\n const checkTransactionStatus = useCallback(\n async (signature: string): Promise<TransactionStatus> => {\n try {\n const statusResponse = await connection.getSignatureStatus(signature, {\n searchTransactionHistory: true,\n })\n\n if (statusResponse.value === null) {\n return {\n signature,\n confirmationStatus: 'processed',\n confirmations: 0,\n error: 'Transaction not found',\n }\n }\n\n const { confirmationStatus, confirmations, slot, err } =\n statusResponse.value\n\n // Get block time if we have a slot\n let blockTime: number | undefined\n if (slot) {\n try {\n blockTime = (await connection.getBlockTime(slot)) || undefined\n } catch (error) {\n // Block time not available\n }\n }\n\n return {\n signature,\n confirmationStatus: err\n ? 'failed'\n : confirmationStatus || 'processed',\n confirmations: confirmations || 0,\n slot,\n blockTime,\n error: err ? `Transaction failed: ${err}` : undefined,\n }\n } catch (error) {\n console.error('Failed to check transaction status:', error)\n return {\n signature,\n confirmationStatus: 'failed',\n confirmations: 0,\n error:\n error instanceof Error\n ? error.message\n : 'Failed to check transaction status',\n }\n }\n },\n [connection]\n )\n\n // Check payment status from backend\n const checkPaymentStatus = useCallback(\n async (id: string): Promise<PaymentStatusResponse | null> => {\n try {\n const data = await billingApi.get<PaymentStatusResponse>(\n `/payment/status/${id}`\n )\n return data\n } catch (error: any) {\n if (error?.status === 404) {\n return null // Payment not found\n }\n console.error('Failed to check payment status:', error)\n return null\n }\n },\n [billingApi]\n )\n\n // Monitor transaction until confirmed or failed\n const startMonitoring = useCallback(async () => {\n if (isMonitoringRef.current || (!transactionId && !purchaseId)) {\n return\n }\n\n isMonitoringRef.current = true\n setIsLoading(true)\n setError(null)\n setRetryCount(0)\n\n const monitor = async () => {\n try {\n let currentStatus: TransactionStatus | null = null\n let currentPaymentStatus: PaymentStatusResponse | null = null\n\n // Check blockchain status if we have a transaction ID\n if (transactionId) {\n currentStatus = await checkTransactionStatus(transactionId)\n setStatus(currentStatus)\n }\n\n // Check backend payment status if we have a purchase ID\n if (purchaseId) {\n currentPaymentStatus = await checkPaymentStatus(purchaseId)\n setPaymentStatus(currentPaymentStatus)\n }\n\n // Determine if we should stop monitoring\n const isBlockchainConfirmed =\n currentStatus?.confirmationStatus === 'finalized' ||\n currentStatus?.confirmationStatus === 'confirmed'\n const isBackendConfirmed = currentPaymentStatus?.status === 'confirmed'\n const isBlockchainFailed =\n currentStatus?.confirmationStatus === 'failed' || currentStatus?.error\n const isBackendFailed = currentPaymentStatus?.status === 'failed'\n\n if (isBlockchainConfirmed || isBackendConfirmed) {\n // Payment confirmed\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n onConfirmed?.()\n return\n }\n\n if (isBlockchainFailed || isBackendFailed) {\n // Payment failed\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n const errorMessage = currentStatus?.error || 'Payment failed'\n setError(errorMessage)\n onFailed?.(errorMessage)\n return\n }\n\n // Continue monitoring\n setRetryCount((prev) => prev + 1)\n\n if (retryCount >= maxRetries) {\n // Max retries reached\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n const timeoutError =\n 'Payment confirmation timeout - please check your transaction manually'\n setError(timeoutError)\n onFailed?.(timeoutError)\n return\n }\n } catch (error) {\n console.error('Error monitoring payment:', error)\n setRetryCount((prev) => prev + 1)\n\n if (retryCount >= maxRetries) {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n const monitorError = 'Failed to monitor payment status'\n setError(monitorError)\n onFailed?.(monitorError)\n }\n }\n }\n\n // Start monitoring immediately\n await monitor()\n\n // Continue monitoring at intervals\n intervalRef.current = setInterval(monitor, retryInterval)\n }, [\n transactionId,\n purchaseId,\n checkTransactionStatus,\n checkPaymentStatus,\n onConfirmed,\n onFailed,\n maxRetries,\n retryInterval,\n retryCount,\n ])\n\n // Stop monitoring\n const stopMonitoring = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n isMonitoringRef.current = false\n setIsLoading(false)\n }, [])\n\n // Manual status check\n const checkStatus = useCallback(async () => {\n if (!transactionId && !purchaseId) return\n\n setIsLoading(true)\n setError(null)\n\n try {\n if (transactionId) {\n const txStatus = await checkTransactionStatus(transactionId)\n setStatus(txStatus)\n }\n\n if (purchaseId) {\n const payStatus = await checkPaymentStatus(purchaseId)\n setPaymentStatus(payStatus)\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to check status'\n setError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }, [transactionId, purchaseId, checkTransactionStatus, checkPaymentStatus])\n\n // Auto-start monitoring when transaction/purchase ID is provided\n useEffect(() => {\n if ((transactionId || purchaseId) && !isMonitoringRef.current) {\n startMonitoring()\n }\n\n return () => {\n stopMonitoring()\n }\n }, [transactionId, purchaseId, startMonitoring, stopMonitoring])\n\n // Get current confirmation status\n const getConfirmationStatus = useCallback(() => {\n if (paymentStatus?.status === 'confirmed') return 'confirmed'\n if (paymentStatus?.status === 'failed') return 'failed'\n if (status?.confirmationStatus === 'finalized') return 'confirmed'\n if (status?.confirmationStatus === 'confirmed') return 'confirmed'\n if (status?.confirmationStatus === 'failed' || status?.error)\n return 'failed'\n return 'pending'\n }, [status, paymentStatus])\n\n // Get Solscan URL for transaction\n const getSolscanUrl = useCallback(\n (signature?: string) => {\n const txId = signature || transactionId\n if (!txId) return null\n return `https://solscan.io/tx/${txId}`\n },\n [transactionId]\n )\n\n return {\n status,\n paymentStatus,\n isLoading,\n error,\n retryCount,\n maxRetries,\n isMonitoring: isMonitoringRef.current,\n confirmationStatus: getConfirmationStatus(),\n startMonitoring,\n stopMonitoring,\n checkStatus,\n getSolscanUrl,\n isConfirmed: getConfirmationStatus() === 'confirmed',\n isFailed: getConfirmationStatus() === 'failed',\n isPending: getConfirmationStatus() === 'pending',\n }\n}\n","import { useCallback } from 'react'\nimport { usePaymentContext } from '../context/PaymentContext'\nimport type { BillingDetails } from '../types/billing'\nimport type {\n CCBillSubscribePayload,\n FlexFormResponse,\n GenerateFlexFormURLBodyParams,\n NmiSubscribePayload,\n SubscriptionResponse,\n} from '../types/subscription'\n\nexport interface SubscribeWithCardParams {\n priceId?: string | null\n processor?: string\n provider?: string\n paymentToken: string\n billing: BillingDetails\n}\n\nexport interface SubscribeWithSavedMethodParams {\n priceId?: string | null\n processor?: string\n provider?: string\n paymentMethodId: string\n email?: string\n}\n\nexport interface SubscribeWithCCBillParams {\n priceId?: string | null\n email: string\n firstName: string\n lastName: string\n zipCode: string\n country: string\n processor?: string\n}\n\nexport interface GenerateFlexFormParams {\n priceId?: string | null\n firstName: string\n lastName: string\n address1: string\n city: string\n state: string\n zipCode: string\n country: string\n}\n\nexport const useSubscriptionActions = () => {\n const { services } = usePaymentContext()\n\n const ensurePrice = (priceId?: string | null) => {\n if (!priceId) {\n throw new Error('payments-ui: priceId is required for subscription actions')\n }\n return priceId\n }\n\n const subscribeWithCard = useCallback(\n async ({\n priceId,\n processor = 'nmi',\n provider,\n paymentToken,\n billing,\n }: SubscribeWithCardParams): Promise<SubscriptionResponse> => {\n const payload: NmiSubscribePayload = {\n priceId: ensurePrice(priceId),\n paymentToken,\n processor,\n provider,\n email: billing.email,\n firstName: billing.firstName,\n lastName: billing.lastName,\n address1: billing.address1,\n city: billing.city,\n state: billing.stateRegion,\n zipCode: billing.postalCode,\n country: billing.country,\n }\n return services.subscriptions.subscribe('nmi', payload)\n },\n [services]\n )\n\n const subscribeWithSavedMethod = useCallback(\n async ({\n priceId,\n processor = 'nmi',\n provider,\n paymentMethodId,\n email,\n }: SubscribeWithSavedMethodParams): Promise<SubscriptionResponse> => {\n const payload: NmiSubscribePayload = {\n priceId: ensurePrice(priceId),\n paymentMethodId,\n processor,\n provider,\n email,\n }\n return services.subscriptions.subscribe('nmi', payload)\n },\n [services]\n )\n\n const subscribeWithCCBill = useCallback(\n async ({\n priceId,\n email,\n firstName,\n lastName,\n zipCode,\n country,\n processor = 'ccbill',\n }: SubscribeWithCCBillParams): Promise<SubscriptionResponse> => {\n const payload: CCBillSubscribePayload = {\n priceId: ensurePrice(priceId),\n email,\n firstName,\n lastName,\n zipCode,\n country,\n processor,\n }\n return services.subscriptions.subscribe('ccbill', payload)\n },\n [services]\n )\n\n const generateFlexFormUrl = useCallback(\n async ({\n priceId,\n firstName,\n lastName,\n address1,\n city,\n state,\n zipCode,\n country,\n }: GenerateFlexFormParams): Promise<FlexFormResponse> => {\n const payload: GenerateFlexFormURLBodyParams = {\n price_id: ensurePrice(priceId),\n first_name: firstName,\n last_name: lastName,\n address1,\n city,\n state,\n zip_code: zipCode,\n country,\n }\n return services.subscriptions.generateFlexFormUrl(payload)\n },\n [services]\n )\n\n return {\n subscribeWithCard,\n subscribeWithSavedMethod,\n subscribeWithCCBill,\n generateFlexFormUrl,\n }\n}\n"]}
|