@doujins/payments-ui 0.0.0
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 +2861 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +686 -0
- package/dist/index.d.ts +686 -0
- package/dist/index.js +2810 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +474 -0
- package/package.json +61 -0
|
@@ -0,0 +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","createStore","createContext","useMemo","useEffect","jsx","useContext","countryList","useState","useRef","country","jsxs","clsx","User","MapPin","ChevronDown","Search","Loader2","CreditCard","useQueryClient","useQuery","useMutation","WalletCards","Trash2","Dialog","X","LAMPORTS_PER_SOL","TOKEN_PROGRAM_ID","useWallet","Connection","useCallback","buffer","Buffer","VersionedTransaction","Transaction","Wallet","QRCode","RefreshCw","Fragment","CheckCircle","XCircle","RotateCcw","tokens","error","useStore","Dialog2","Sparkles","useConnection","PublicKey","getAssociatedTokenAddress","getAccount","hasSufficientBalance"],"mappings":"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","file":"index.cjs","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"]}
|