@dubsdotapp/expo 0.2.77 → 0.2.78
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.js +656 -671
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +638 -646
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/ui/AuthGate.tsx +12 -52
- package/src/ui/AvatarEditor.tsx +159 -0
- package/src/ui/UserProfileSheet.tsx +18 -138
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/polyfill.ts","../src/constants.ts","../src/errors.ts","../src/client.ts","../src/storage.ts","../src/provider.tsx","../src/ui/theme.ts","../src/managed-wallet.tsx","../src/wallet/mwa-adapter.ts","../src/wallet/phantom-deeplink/phantom-deeplink-adapter.ts","../src/wallet/phantom-deeplink/crypto.ts","../src/wallet/phantom-deeplink/deeplink-handler.ts","../src/ui/ConnectWalletScreen.tsx","../src/ui/AuthGate.tsx","../src/hooks/useEvents.ts","../src/hooks/useGame.ts","../src/hooks/useGames.ts","../src/hooks/useNetworkGames.ts","../src/hooks/useCreateGame.ts","../src/utils/transaction.ts","../src/hooks/useJoinGame.ts","../src/hooks/useClaim.ts","../src/hooks/useCreateCustomGame.ts","../src/hooks/useHasClaimed.ts","../src/hooks/useAuth.ts","../src/auth-context.ts","../src/utils/device.ts","../src/utils/avatarUrl.ts","../src/hooks/useUFCFightCard.ts","../src/hooks/useUFCFighterDetail.ts","../src/hooks/usePushNotifications.ts","../src/ui/UserProfileCard.tsx","../src/ui/SettingsSheet.tsx","../src/ui/UserProfileSheet.tsx","../src/ui/game/GamePoster.tsx","../src/ui/game/LivePoolsCard.tsx","../src/ui/game/PickWinnerCard.tsx","../src/ui/game/PlayersCard.tsx","../src/ui/game/JoinGameButton.tsx","../src/ui/game/CreateCustomGameSheet.tsx","../src/ui/game/JoinGameSheet.tsx","../src/ui/game/ClaimPrizeSheet.tsx","../src/ui/game/ClaimButton.tsx"],"sourcesContent":["/**\n * Polyfill crypto.getRandomValues for React Native environments.\n *\n * This runs once at SDK import time, before tweetnacl, @solana/web3.js,\n * uuid, jayson, or any other dependency tries to use crypto.\n *\n * Must be imported as the very first line in src/index.ts.\n */\nimport { getRandomValues } from 'expo-crypto';\n\nif (typeof global !== 'undefined') {\n if (typeof global.crypto !== 'object') {\n (global as any).crypto = {};\n }\n if (typeof global.crypto.getRandomValues !== 'function') {\n (global.crypto as any).getRandomValues = getRandomValues;\n }\n}\n\n// Also polyfill `self` so tweetnacl's init finds crypto via self.crypto\nif (typeof self === 'undefined' && typeof globalThis !== 'undefined') {\n (globalThis as any).self = globalThis;\n}\n","export const DEFAULT_BASE_URL = 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1';\n\nexport const DEFAULT_RPC_URL = 'https://api.mainnet-beta.solana.com';\n\nexport type DubsNetwork = 'devnet' | 'mainnet-beta';\n\nexport const NETWORK_CONFIG: Record<DubsNetwork, { baseUrl: string; rpcUrl: string; cluster: string }> = {\n 'mainnet-beta': {\n baseUrl: DEFAULT_BASE_URL,\n rpcUrl: DEFAULT_RPC_URL,\n cluster: 'mainnet-beta',\n },\n devnet: {\n baseUrl: DEFAULT_BASE_URL,\n rpcUrl: 'https://api.devnet.solana.com',\n cluster: 'devnet',\n },\n};\n","import type { ParsedError, SolanaErrorCode } from './types';\n\nexport class DubsApiError extends Error {\n public readonly code: string;\n public readonly httpStatus: number;\n\n constructor(code: string, message: string, httpStatus: number) {\n super(message);\n this.name = 'DubsApiError';\n this.code = code;\n this.httpStatus = httpStatus;\n }\n}\n\n/** Custom error codes from dubs_solana_program (6000-6049) */\nexport const SOLANA_PROGRAM_ERRORS: Record<number, SolanaErrorCode> = {\n 6000: { code: 'invalid_amount', message: 'Amount must be greater than 0' },\n 6001: { code: 'invalid_max_players', message: 'Max players must be between 1 and 20' },\n 6002: { code: 'game_not_active', message: 'Game is not active' },\n 6003: { code: 'game_full', message: 'Game is full' },\n 6004: { code: 'player_already_joined', message: 'Player has already joined this game' },\n 6005: { code: 'insufficient_funds', message: 'Insufficient funds in pot' },\n 6006: { code: 'unauthorized', message: 'Only the game creator can perform this action' },\n 6007: { code: 'invalid_winner_index', message: 'Invalid winner index' },\n 6008: { code: 'game_still_active', message: 'Game is still active — must close before resetting' },\n 6009: { code: 'pot_not_empty', message: 'Pot must be empty before resetting — distribute winnings first' },\n 6010: { code: 'no_winners_specified', message: 'At least one winner must be specified' },\n 6011: { code: 'mismatched_winners_percentages', message: 'Number of winners must match number of percentages' },\n 6012: { code: 'percentages_invalid', message: 'Percentages must sum to exactly 100' },\n 6013: { code: 'winner_account_mismatch', message: 'Winner account does not match expected player' },\n 6014: { code: 'invalid_operator_fee', message: 'Operator fee must be between 0 and 100' },\n 6015: { code: 'operator_wallet_mismatch', message: 'Operator wallet does not match game settings' },\n 6016: { code: 'winner_not_in_game', message: 'Winner address is not a player in this game' },\n 6017: { code: 'voting_not_enabled', message: 'Voting is not enabled for this game' },\n 6018: { code: 'voter_not_in_game', message: 'Voter is not a player in this game' },\n 6019: { code: 'voted_for_not_in_game', message: 'Cannot vote for someone who is not in the game' },\n 6020: { code: 'voting_incomplete', message: 'Voting incomplete — need majority of players to vote' },\n 6021: { code: 'invalid_referee_commission', message: 'Referee commission must be between 0 and 100' },\n 6022: { code: 'total_fees_exceed_100', message: 'Total fees (operator + referee) cannot exceed 100%' },\n 6023: { code: 'referee_mode_requires_referee', message: 'Referee mode requires a referee address' },\n 6024: { code: 'referee_must_earn_commission', message: 'Referee must earn commission' },\n 6025: { code: 'referee_cannot_be_player', message: 'Referee cannot join as a player (conflict of interest)' },\n 6026: { code: 'only_referee_can_vote', message: 'Only the referee can vote in Referee mode' },\n 6027: { code: 'referee_account_mismatch', message: 'Referee account does not match game settings' },\n 6028: { code: 'invalid_lock_time', message: 'Lock time must be in the future' },\n 6029: { code: 'game_locked', message: 'Game is locked — no more players can join' },\n 6030: { code: 'lock_time_passed', message: 'Lock time has passed — game is now locked' },\n 6031: { code: 'unauthorized_oracle', message: 'Only authorized oracle can resolve this game' },\n 6032: { code: 'game_not_locked', message: 'Game must be locked before it can be resolved' },\n 6033: { code: 'already_resolved', message: 'Game has already been resolved' },\n 6034: { code: 'game_not_resolved', message: 'Game has not been resolved yet' },\n 6035: { code: 'player_not_in_game', message: 'Player is not in this game' },\n 6036: { code: 'not_a_winner', message: 'Player did not win this game' },\n 6037: { code: 'invalid_game_mode', message: 'Invalid game mode for this operation' },\n 6038: { code: 'already_claimed', message: 'Player has already claimed their winnings' },\n 6039: { code: 'lock_time_too_soon', message: 'Lock time must be at least 2 minutes in the future' },\n 6040: { code: 'operator_account_missing', message: 'Operator account must be provided' },\n 6041: { code: 'no_winners_to_distribute', message: 'No winners to distribute funds to' },\n 6042: { code: 'insufficient_funds_for_rent', message: 'Insufficient funds to maintain rent exemption' },\n 6043: { code: 'cannot_resolve_before_lock', message: 'Cannot resolve game before lock time has passed' },\n 6044: { code: 'emergency_refund_not_available', message: 'Emergency refund not available yet — must wait 7 days after lock time' },\n 6045: { code: 'sponsor_account_missing', message: 'Sponsor account must be provided for tie refund' },\n 6046: { code: 'sponsor_wallet_mismatch', message: 'Sponsor wallet does not match stored sponsor' },\n 6047: { code: 'invalid_bet_amount', message: 'Bet amount must be greater than zero' },\n 6048: { code: 'no_survivors_to_distribute', message: 'No survivors to distribute winnings to' },\n 6049: { code: 'too_many_survivors', message: 'Too many survivors (max 50 per batch)' },\n};\n\n/** Known Solana built-in instruction errors */\nconst SOLANA_BUILTIN_ERRORS: Record<number, SolanaErrorCode> = {\n 0: { code: 'generic_error', message: 'Generic instruction error' },\n 1: { code: 'invalid_argument', message: 'Invalid argument passed to program' },\n 2: { code: 'invalid_instruction_data', message: 'Invalid instruction data' },\n 3: { code: 'invalid_account_data', message: 'Invalid account data' },\n 4: { code: 'account_data_too_small', message: 'Account data too small' },\n 5: { code: 'insufficient_funds', message: 'Insufficient funds for transaction' },\n 6: { code: 'incorrect_program_id', message: 'Incorrect program ID' },\n 7: { code: 'missing_required_signature', message: 'Missing required signature' },\n 8: { code: 'account_already_initialized', message: 'Account already initialized' },\n 9: { code: 'uninitialized_account', message: 'Attempt to operate on uninitialized account' },\n};\n\n/**\n * Parse a raw Solana transaction error into a human-readable { code, message }.\n * Handles: { InstructionError: [idx, { Custom: N }] }, string errors, etc.\n */\nexport function parseSolanaError(err: unknown): ParsedError {\n if (!err) return { code: 'unknown_error', message: 'Unknown transaction error' };\n\n let parsed = err;\n\n if (typeof parsed === 'string') {\n try {\n const jsonMatch = parsed.match(/\\{.*\\}/s);\n if (jsonMatch) parsed = JSON.parse(jsonMatch[0]);\n else return { code: 'transaction_failed', message: parsed };\n } catch {\n return { code: 'transaction_failed', message: parsed as string };\n }\n }\n\n if (typeof parsed === 'object' && parsed !== null && 'InstructionError' in parsed) {\n const [ixIndex, details] = (parsed as { InstructionError: [number, unknown] }).InstructionError;\n\n if (details && typeof details === 'object' && 'Custom' in details) {\n const customCode = (details as { Custom: number }).Custom;\n const known = SOLANA_PROGRAM_ERRORS[customCode];\n if (known) return known;\n return { code: `program_error_${customCode}`, message: `Program error code ${customCode} (instruction ${ixIndex})` };\n }\n\n if (typeof details === 'string') {\n const snake = details.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n return { code: snake, message: details.replace(/([a-z])([A-Z])/g, '$1 $2') };\n }\n\n if (typeof details === 'number') {\n const known = SOLANA_BUILTIN_ERRORS[details];\n if (known) return known;\n return { code: `instruction_error_${details}`, message: `Instruction error ${details}` };\n }\n\n return { code: 'instruction_error', message: `Instruction ${ixIndex} failed: ${JSON.stringify(details)}` };\n }\n\n return { code: 'transaction_failed', message: typeof parsed === 'object' ? JSON.stringify(parsed) : String(parsed) };\n}\n","import { DEFAULT_BASE_URL } from './constants';\nimport { DubsApiError, parseSolanaError, SOLANA_PROGRAM_ERRORS } from './errors';\nimport type {\n UnifiedEvent,\n Pagination,\n EsportsMatchDetail,\n ValidateEventResult,\n CreateGameParams,\n CreateGameResult,\n CreateCustomGameParams,\n CreateCustomGameResult,\n JoinGameParams,\n JoinGameResult,\n ConfirmGameParams,\n ConfirmGameResult,\n BuildClaimParams,\n BuildClaimResult,\n ConfirmClaimParams,\n ConfirmClaimResult,\n GameDetail,\n GameListItem,\n GetGamesParams,\n GetNetworkGamesParams,\n GetUpcomingEventsParams,\n ParsedError,\n SolanaErrorCode,\n NonceResult,\n AuthenticateParams,\n AuthenticateResult,\n RegisterParams,\n RegisterResult,\n DubsUser,\n DubsPublicUser,\n DubsAppUser,\n CheckUsernameResult,\n LiveScore,\n UiConfig,\n UFCEvent,\n UFCFighterDetail,\n} from './types';\n\nexport interface DubsClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class DubsClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private _token: string | null = null;\n\n constructor(config: DubsClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, '');\n }\n\n /** Set the user JWT token for authenticated requests */\n setToken(token: string | null): void {\n this._token = token;\n }\n\n /** Get the current user JWT token */\n getToken(): string | null {\n return this._token;\n }\n\n // ── Private HTTP helper ──\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'X-API-Key': this.apiKey,\n 'Content-Type': 'application/json',\n };\n\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n console.log(`[DubsClient] ${method} ${url}`, body ? JSON.stringify(body).slice(0, 200) : '');\n\n const res = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const text = await res.text();\n console.log(`[DubsClient] ${method} ${path} → ${res.status}`, text.slice(0, 300));\n\n let json: any;\n try {\n json = JSON.parse(text);\n } catch {\n throw new DubsApiError('parse_error', `Invalid JSON response: ${text.slice(0, 100)}`, res.status);\n }\n\n if (!json.success) {\n const err = json.error;\n if (typeof err === 'object' && err !== null) {\n throw new DubsApiError(err.code || 'unknown', err.message || 'Unknown error', res.status);\n }\n throw new DubsApiError('unknown', typeof err === 'string' ? err : 'Request failed', res.status);\n }\n\n return json as T;\n }\n\n // ── Events ──\n\n async getUpcomingEvents(params?: GetUpcomingEventsParams): Promise<{ events: UnifiedEvent[]; pagination: Pagination }> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set('type', params.type);\n if (params?.game) qs.set('game', params.game);\n if (params?.page) qs.set('page', String(params.page));\n if (params?.per_page) qs.set('per_page', String(params.per_page));\n const query = qs.toString();\n const res = await this.request<{ success: true; events: UnifiedEvent[]; pagination: Pagination }>(\n 'GET',\n `/events/upcoming${query ? `?${query}` : ''}`,\n );\n return { events: res.events, pagination: res.pagination };\n }\n\n async getSportsEvents(league: string): Promise<UnifiedEvent[]> {\n const res = await this.request<{ success: true; league: string; events: UnifiedEvent[] }>(\n 'GET',\n `/sports/events/${encodeURIComponent(league)}`,\n );\n return res.events;\n }\n\n async getEsportsMatches(videogame?: string): Promise<UnifiedEvent[]> {\n const qs = videogame ? `?videogame=${encodeURIComponent(videogame)}` : '';\n const res = await this.request<{ success: true; matches: UnifiedEvent[] }>(\n 'GET',\n `/esports/matches/upcoming${qs}`,\n );\n return res.matches;\n }\n\n async getEsportsMatchDetail(matchId: string | number): Promise<EsportsMatchDetail> {\n const res = await this.request<{ success: true; match: EsportsMatchDetail }>(\n 'GET',\n `/esports/matches/${encodeURIComponent(String(matchId))}`,\n );\n return res.match;\n }\n\n // ── UFC ──\n\n async getUFCFightCard(): Promise<UFCEvent[]> {\n const res = await this.request<{ success: true; events: UFCEvent[] }>(\n 'GET',\n '/ufc/fightcard',\n );\n return res.events;\n }\n\n async getUFCFighterDetail(athleteId: string): Promise<UFCFighterDetail> {\n const res = await this.request<{ success: true; fighter: UFCFighterDetail }>(\n 'GET',\n `/ufc/fighters/${encodeURIComponent(athleteId)}`,\n );\n return res.fighter;\n }\n\n // ── Game Lifecycle ──\n\n async validateEvent(id: string): Promise<ValidateEventResult> {\n const res = await this.request<{ success: true } & ValidateEventResult>(\n 'POST',\n '/games/validate',\n { id },\n );\n return {\n bettable: res.bettable,\n gameMode: res.gameMode,\n lockTimestamp: res.lockTimestamp,\n startTime: res.startTime,\n status: res.status,\n };\n }\n\n async createGame(params: CreateGameParams): Promise<CreateGameResult> {\n const res = await this.request<{ success: true } & CreateGameResult>(\n 'POST',\n '/games/create',\n params,\n );\n return {\n gameId: res.gameId,\n gameAddress: res.gameAddress,\n transaction: res.transaction,\n lockTimestamp: res.lockTimestamp,\n event: res.event,\n };\n }\n\n async joinGame(params: JoinGameParams): Promise<JoinGameResult> {\n const res = await this.request<{ success: true } & JoinGameResult>(\n 'POST',\n '/games/join',\n params,\n );\n return {\n gameId: res.gameId,\n transaction: res.transaction,\n gameAddress: res.gameAddress,\n };\n }\n\n async confirmGame(params: ConfirmGameParams): Promise<ConfirmGameResult> {\n const res = await this.request<{ success: true } & ConfirmGameResult>(\n 'POST',\n '/games/confirm',\n params,\n );\n return {\n gameId: res.gameId,\n signature: res.signature,\n explorerUrl: res.explorerUrl,\n message: res.message,\n };\n }\n\n // ── Custom Game Lifecycle (game_mode=6) ──\n\n async createCustomGame(params: CreateCustomGameParams): Promise<CreateCustomGameResult> {\n const res = await this.request<{ success: true } & CreateCustomGameResult>(\n 'POST',\n '/games/custom/create',\n params,\n );\n return {\n gameId: res.gameId,\n gameAddress: res.gameAddress,\n transaction: res.transaction,\n lockTimestamp: res.lockTimestamp,\n };\n }\n\n async confirmCustomGame(params: ConfirmGameParams): Promise<ConfirmGameResult> {\n const res = await this.request<{ success: true } & ConfirmGameResult>(\n 'POST',\n '/games/custom/confirm',\n params,\n );\n return {\n gameId: res.gameId,\n signature: res.signature,\n explorerUrl: res.explorerUrl,\n message: res.message,\n };\n }\n\n async buildClaimTransaction(params: BuildClaimParams): Promise<BuildClaimResult> {\n const res = await this.request<{ success: true } & BuildClaimResult>(\n 'POST',\n '/transactions/build/claim',\n params,\n );\n return {\n transaction: res.transaction,\n gameAddress: res.gameAddress,\n message: res.message,\n };\n }\n\n async confirmClaim(gameId: string, params: ConfirmClaimParams): Promise<ConfirmClaimResult> {\n const res = await this.request<{ success: true } & ConfirmClaimResult>(\n 'POST',\n `/games/${encodeURIComponent(gameId)}/claim/confirm`,\n params,\n );\n return {\n gameId: res.gameId,\n signature: res.signature,\n explorerUrl: res.explorerUrl,\n message: res.message,\n };\n }\n\n // ── Game Queries ──\n\n async getGame(gameId: string): Promise<GameDetail> {\n const res = await this.request<{ success: true; game: GameDetail }>(\n 'GET',\n `/games/${encodeURIComponent(gameId)}`,\n );\n return res.game;\n }\n\n async getLiveScore(gameId: string): Promise<LiveScore | null> {\n const res = await this.request<{ success: true; liveScore: LiveScore | null }>(\n 'GET',\n `/games/${encodeURIComponent(gameId)}/live-score`,\n );\n return res.liveScore;\n }\n\n async getGames(params?: GetGamesParams): Promise<GameListItem[]> {\n const qs = new URLSearchParams();\n if (params?.wallet) qs.set('wallet', params.wallet);\n if (params?.status) qs.set('status', params.status);\n if (params?.limit != null) qs.set('limit', String(params.limit));\n if (params?.offset != null) qs.set('offset', String(params.offset));\n const query = qs.toString();\n const res = await this.request<{ success: true; games: GameListItem[] }>(\n 'GET',\n `/games${query ? `?${query}` : ''}`,\n );\n return res.games;\n }\n\n // ── Network ──\n\n async getNetworkGames(params?: GetNetworkGamesParams): Promise<{ games: GameListItem[]; pagination: Pagination }> {\n const qs = new URLSearchParams();\n if (params?.league) qs.set('league', params.league);\n if (params?.exclude_wallet) qs.set('exclude_wallet', params.exclude_wallet);\n if (params?.limit != null) qs.set('limit', String(params.limit));\n if (params?.offset != null) qs.set('offset', String(params.offset));\n const query = qs.toString();\n const res = await this.request<{ success: true; games: GameListItem[]; pagination: Pagination }>(\n 'GET',\n `/network/games${query ? `?${query}` : ''}`,\n );\n return { games: res.games, pagination: res.pagination };\n }\n\n // ── User Auth ──\n\n async getNonce(walletAddress: string): Promise<NonceResult> {\n const res = await this.request<{ success: true; data: NonceResult }>(\n 'POST',\n '/auth/nonce',\n { walletAddress },\n );\n return res.data;\n }\n\n async authenticate(params: AuthenticateParams): Promise<AuthenticateResult> {\n const res = await this.request<{ success: true; data: AuthenticateResult }>(\n 'POST',\n '/auth/authenticate',\n params,\n );\n // Auto-store token on successful auth\n if (res.data.token) {\n this._token = res.data.token;\n }\n return res.data;\n }\n\n async register(params: RegisterParams): Promise<RegisterResult> {\n const res = await this.request<{ success: true; data: RegisterResult }>(\n 'POST',\n '/auth/register',\n params,\n );\n // Auto-store token on successful registration\n if (res.data.token) {\n this._token = res.data.token;\n }\n return res.data;\n }\n\n async getMe(): Promise<DubsUser> {\n const res = await this.request<{ success: true; data: { user: DubsUser } }>(\n 'GET',\n '/auth/me',\n );\n return res.data.user;\n }\n\n async getUser(walletAddress: string): Promise<DubsPublicUser | null> {\n const res = await this.request<{ success: true; data: { user: DubsPublicUser | null } }>(\n 'GET',\n `/users/${encodeURIComponent(walletAddress)}`,\n );\n return res.data.user;\n }\n\n async getAppUsers(params?: { limit?: number; offset?: number }): Promise<{ users: DubsAppUser[]; pagination: { total: number; limit: number; offset: number } }> {\n const qs = new URLSearchParams();\n if (params?.limit != null) qs.set('limit', String(params.limit));\n if (params?.offset != null) qs.set('offset', String(params.offset));\n const query = qs.toString();\n const res = await this.request<{ success: true; data: { users: DubsAppUser[]; pagination: { total: number; limit: number; offset: number } } }>(\n 'GET',\n `/users${query ? `?${query}` : ''}`,\n );\n return res.data;\n }\n\n async checkUsername(username: string): Promise<CheckUsernameResult> {\n const res = await this.request<{ success: true; data: CheckUsernameResult }>(\n 'GET',\n `/auth/check-username/${encodeURIComponent(username)}`,\n );\n return res.data;\n }\n\n async logout(): Promise<void> {\n await this.request<{ success: true; data: { message: string } }>(\n 'POST',\n '/auth/logout',\n );\n this._token = null;\n }\n\n // ── Push Notifications ──\n\n async registerPushToken(params: { token: string; platform: string; deviceName?: string }): Promise<void> {\n await this.request<{ success: true; data: { tokenId: number; token: string } }>(\n 'POST',\n '/push/expo-token',\n params,\n );\n }\n\n async unregisterPushToken(token: string): Promise<void> {\n await this.request<{ success: true; data: { message: string } }>(\n 'DELETE',\n '/push/expo-token',\n { token },\n );\n }\n\n // ── Profile ──\n\n async updateProfile(params: { avatar?: string }): Promise<DubsUser> {\n const res = await this.request<{ success: true; data: { user: DubsUser } }>(\n 'PATCH',\n '/auth/profile',\n params,\n );\n return res.data.user;\n }\n\n // ── Error Utilities ──\n\n async parseError(error: unknown): Promise<ParsedError> {\n const res = await this.request<{ success: true; error: ParsedError }>(\n 'POST',\n '/errors/parse',\n { error },\n );\n return res.error;\n }\n\n async getErrorCodes(): Promise<Record<number, SolanaErrorCode>> {\n const res = await this.request<{ success: true; errors: Record<number, SolanaErrorCode> }>(\n 'GET',\n '/errors/codes',\n );\n return res.errors;\n }\n\n /**\n * Parse a Solana error locally without an API call.\n * Useful for instant feedback in the UI.\n */\n parseErrorLocal(error: unknown): ParsedError {\n return parseSolanaError(error);\n }\n\n /** Get the full local error code map */\n getErrorCodesLocal(): Record<number, SolanaErrorCode> {\n return { ...SOLANA_PROGRAM_ERRORS };\n }\n\n // ── App Config ──\n\n /** Fetch the app's UI customization config (accent color, icon, tagline, environment) */\n async getAppConfig(): Promise<UiConfig> {\n const res = await this.request<{ data: { environment?: string; uiConfig: UiConfig } }>('GET', '/apps/config');\n const config = res.data?.uiConfig || {};\n if (res.data?.environment) {\n config.environment = res.data.environment as UiConfig['environment'];\n }\n return config;\n }\n}\n","export interface TokenStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n deleteItem(key: string): Promise<void>;\n}\n\nexport const STORAGE_KEYS = {\n MWA_AUTH_TOKEN: 'dubs_mwa_auth_token',\n MWA_WALLET_ADDRESS: 'dubs_mwa_wallet_address',\n JWT_TOKEN: 'dubs_jwt_token',\n PHANTOM_SESSION: 'dubs_phantom_session',\n PHANTOM_CONNECT_IN_FLIGHT: 'dubs_phantom_connect_in_flight',\n} as const;\n\n/**\n * Creates a TokenStorage backed by expo-secure-store.\n * Lazy-imports the module so it's only required at runtime when actually used.\n * Throws a clear error if expo-secure-store is not installed.\n */\nexport function createSecureStoreStorage(): TokenStorage {\n // Use `any` to avoid requiring expo-secure-store types at build time.\n // The module is lazy-imported at runtime only when this storage is actually used.\n let SecureStore: any = null;\n\n function getStore(): {\n getItemAsync: (key: string) => Promise<string | null>;\n setItemAsync: (key: string, value: string) => Promise<void>;\n deleteItemAsync: (key: string) => Promise<void>;\n } {\n if (!SecureStore) {\n try {\n // Use require() to keep the import opaque to TypeScript's DTS generation.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n SecureStore = require('expo-secure-store');\n } catch {\n throw new Error(\n '@dubsdotapp/expo: expo-secure-store is required for default token storage. ' +\n 'Install it with: npx expo install expo-secure-store — ' +\n 'or pass a custom tokenStorage prop to <DubsProvider>.',\n );\n }\n }\n return SecureStore;\n }\n\n return {\n async getItem(key: string): Promise<string | null> {\n const store = getStore();\n return store.getItemAsync(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const store = getStore();\n await store.setItemAsync(key, value);\n },\n async deleteItem(key: string): Promise<void> {\n const store = getStore();\n await store.deleteItemAsync(key);\n },\n };\n}\n","import React, { createContext, useContext, useMemo, useCallback, useState, useEffect } from 'react';\nimport { ThemeOverrideProvider } from './ui/theme';\nimport type { DubsTheme } from './ui/theme';\nimport { Connection } from '@solana/web3.js';\nimport { DubsClient } from './client';\nimport { NETWORK_CONFIG } from './constants';\nimport type { DubsNetwork } from './constants';\nimport type { WalletAdapter } from './wallet/types';\nimport type { TokenStorage } from './storage';\nimport { createSecureStoreStorage, STORAGE_KEYS } from './storage';\nimport { ManagedWalletProvider, useDisconnect } from './managed-wallet';\nimport { AuthGate } from './ui/AuthGate';\nimport type { RegistrationScreenProps } from './ui/AuthGate';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { AuthStatus, UiConfig } from './types';\n\n// ── Context ──\n\nexport interface DubsContextValue {\n client: DubsClient;\n wallet: WalletAdapter;\n connection: Connection;\n appName: string;\n network: DubsNetwork;\n disconnect: () => Promise<void>;\n uiConfig: UiConfig;\n pushEnabled: boolean;\n}\n\nconst DubsContext = createContext<DubsContextValue | null>(null);\n\n// ── Props ──\n\nexport interface DubsProviderProps {\n apiKey: string;\n children: React.ReactNode;\n appName?: string;\n network?: DubsNetwork;\n /** Escape hatch: bring your own wallet adapter. Disables managed MWA. */\n wallet?: WalletAdapter;\n /** Escape hatch: custom token persistence. Defaults to expo-secure-store. */\n tokenStorage?: TokenStorage;\n /** Escape hatch: override base URL (takes precedence over network). */\n baseUrl?: string;\n /** Escape hatch: override RPC URL (takes precedence over network). */\n rpcUrl?: string;\n /** Custom connect screen, or false to hide it entirely (headless mode). */\n renderConnectScreen?: ((props: ConnectWalletScreenProps) => React.ReactNode) | false;\n /** Custom loading screen shown during auth. */\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n /** Custom error screen shown on auth failure. */\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n /** Custom registration screen. */\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n /** Set to false to skip AuthGate and connect screen (headless/BYOA mode). Default: true. */\n managed?: boolean;\n /** Deeplink redirect URI for Phantom wallet (required for iOS support). */\n redirectUri?: string;\n /** App URL shown in Phantom's connect screen. */\n appUrl?: string;\n /** Enable Dubs push notifications. Default: true. Set false if your app manages its own Firebase/push. */\n pushEnabled?: boolean;\n}\n\n// ── Provider ──\n\nexport function DubsProvider({\n apiKey,\n children,\n appName = 'Dubs',\n network = 'mainnet-beta',\n wallet: externalWallet,\n tokenStorage,\n baseUrl: baseUrlOverride,\n rpcUrl: rpcUrlOverride,\n renderConnectScreen,\n renderLoading,\n renderError,\n renderRegistration,\n managed = true,\n redirectUri,\n appUrl,\n pushEnabled = true,\n}: DubsProviderProps) {\n // Resolve network config — explicit props override network defaults\n const config = NETWORK_CONFIG[network];\n const baseUrl = baseUrlOverride || config.baseUrl;\n const rpcUrl = rpcUrlOverride || config.rpcUrl;\n\n // Create stable instances\n const client = useMemo(() => new DubsClient({ apiKey, baseUrl }), [apiKey, baseUrl]);\n const storage = useMemo(() => tokenStorage || createSecureStoreStorage(), [tokenStorage]);\n\n // Fetch developer UI config on mount (silent fail = default theme)\n // Also auto-detects sandbox/production environment from the API key\n const [uiConfig, setUiConfig] = useState<UiConfig | null>(null);\n const [resolvedNetwork, setResolvedNetwork] = useState<DubsNetwork>(network);\n useEffect(() => {\n client.getAppConfig()\n .then((cfg) => {\n console.log('[DubsProvider] UI config loaded:', JSON.stringify(cfg));\n setUiConfig(cfg);\n // Auto-detect network from API key environment (sandbox → devnet)\n // Only override if the user didn't explicitly set network or rpcUrl\n if (cfg.environment === 'sandbox' && network === 'mainnet-beta' && !rpcUrlOverride) {\n console.log('[DubsProvider] Sandbox API key detected — auto-switching to devnet');\n setResolvedNetwork('devnet');\n }\n })\n .catch((err) => {\n console.log('[DubsProvider] UI config fetch failed, using defaults:', err?.message);\n setUiConfig({});\n });\n }, [client]);\n\n // Use resolved network (may differ from prop if sandbox was auto-detected)\n const resolvedConfig = NETWORK_CONFIG[resolvedNetwork];\n const resolvedRpcUrl = rpcUrlOverride || resolvedConfig.rpcUrl;\n const cluster = resolvedConfig.cluster;\n\n // Connection uses the resolved RPC (auto-switched to devnet for sandbox keys)\n const connection = useMemo(() => new Connection(resolvedRpcUrl, { commitment: 'confirmed' }), [resolvedRpcUrl]);\n\n // Wait for config before rendering so accent color is applied on first paint\n if (uiConfig === null) return null;\n\n // Build theme overrides from server config so all SDK components respect the tint\n const themeOverrides: Partial<DubsTheme> = {};\n if (uiConfig.accentColor) {\n themeOverrides.accent = uiConfig.accentColor;\n }\n\n // ── Path A: External wallet provided (BYOA) ──\n if (externalWallet) {\n return (\n <ThemeOverrideProvider value={themeOverrides}>\n <ExternalWalletProvider\n client={client}\n connection={connection}\n wallet={externalWallet}\n appName={uiConfig.appName || appName}\n network={resolvedNetwork}\n storage={storage}\n managed={managed}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n pushEnabled={pushEnabled}\n >\n {children}\n </ExternalWalletProvider>\n </ThemeOverrideProvider>\n );\n }\n\n // ── Path B: Managed MWA wallet ──\n return (\n <ThemeOverrideProvider value={themeOverrides}>\n <ManagedWalletProvider\n appName={uiConfig.appName || appName}\n cluster={cluster}\n storage={storage}\n renderConnectScreen={renderConnectScreen}\n accentColor={uiConfig.accentColor}\n appIcon={uiConfig.appIcon}\n tagline={uiConfig.tagline}\n redirectUri={redirectUri}\n appUrl={appUrl || uiConfig.appUrl}\n >\n {(adapter) => (\n <ManagedInner\n client={client}\n connection={connection}\n wallet={adapter}\n appName={uiConfig.appName || appName}\n network={resolvedNetwork}\n storage={storage}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n pushEnabled={pushEnabled}\n >\n {children}\n </ManagedInner>\n )}\n </ManagedWalletProvider>\n </ThemeOverrideProvider>\n );\n}\n\n// ── ManagedInner: context + AuthGate for managed wallet path ──\n\nfunction ManagedInner({\n client,\n connection,\n wallet,\n appName,\n network,\n storage,\n renderLoading,\n renderError,\n renderRegistration,\n accentColor,\n uiConfig,\n pushEnabled,\n children,\n}: {\n client: DubsClient;\n connection: Connection;\n wallet: WalletAdapter;\n appName: string;\n network: DubsNetwork;\n storage: TokenStorage;\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n accentColor?: string;\n uiConfig: UiConfig;\n pushEnabled: boolean;\n children: React.ReactNode;\n}) {\n const managedDisconnect = useDisconnect();\n\n const disconnect = useCallback(async () => {\n // Clear client JWT\n client.setToken(null);\n // Delegate to managed wallet (clears adapter + storage)\n await managedDisconnect?.();\n }, [client, managedDisconnect]);\n\n const value = useMemo<DubsContextValue>(\n () => ({ client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled }),\n [client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled],\n );\n\n return (\n <DubsContext.Provider value={value}>\n <AuthGate\n onSaveToken={(token) => {\n if (token) return storage.setItem(STORAGE_KEYS.JWT_TOKEN, token);\n return storage.deleteItem(STORAGE_KEYS.JWT_TOKEN);\n }}\n onLoadToken={() => storage.getItem(STORAGE_KEYS.JWT_TOKEN)}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n appName={appName}\n accentColor={accentColor}\n >\n {children}\n </AuthGate>\n </DubsContext.Provider>\n );\n}\n\n// ── ExternalWalletProvider: for BYOA path ──\n\nfunction ExternalWalletProvider({\n client,\n connection,\n wallet,\n appName,\n network,\n storage,\n managed,\n renderLoading,\n renderError,\n renderRegistration,\n accentColor,\n uiConfig,\n pushEnabled,\n children,\n}: {\n client: DubsClient;\n connection: Connection;\n wallet: WalletAdapter;\n appName: string;\n network: DubsNetwork;\n storage: TokenStorage;\n managed: boolean;\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n accentColor?: string;\n uiConfig: UiConfig;\n pushEnabled: boolean;\n children: React.ReactNode;\n}) {\n const disconnect = useCallback(async () => {\n client.setToken(null);\n await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n await wallet.disconnect?.();\n }, [client, storage, wallet]);\n\n const value = useMemo<DubsContextValue>(\n () => ({ client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled }),\n [client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled],\n );\n\n if (!managed) {\n // Headless mode — just context, no AuthGate\n return <DubsContext.Provider value={value}>{children}</DubsContext.Provider>;\n }\n\n return (\n <DubsContext.Provider value={value}>\n <AuthGate\n onSaveToken={(token) => {\n if (token) return storage.setItem(STORAGE_KEYS.JWT_TOKEN, token);\n return storage.deleteItem(STORAGE_KEYS.JWT_TOKEN);\n }}\n onLoadToken={() => storage.getItem(STORAGE_KEYS.JWT_TOKEN)}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n appName={appName}\n accentColor={accentColor}\n >\n {children}\n </AuthGate>\n </DubsContext.Provider>\n );\n}\n\n// ── Hooks ──\n\nexport function useDubs(): DubsContextValue {\n const ctx = useContext(DubsContext);\n if (!ctx) {\n throw new Error('useDubs must be used within a <DubsProvider>');\n }\n return ctx;\n}\n\nexport function useAppConfig(): UiConfig {\n const ctx = useContext(DubsContext);\n return ctx?.uiConfig || {};\n}\n","import { createContext, useContext } from 'react';\nimport { useColorScheme } from 'react-native';\n\nexport interface DubsTheme {\n background: string;\n surface: string;\n surfaceActive: string;\n border: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n textDim: string;\n accent: string;\n success: string;\n live: string;\n errorText: string;\n errorBg: string;\n errorBorder: string;\n}\n\nconst dark: DubsTheme = {\n background: '#08080D',\n surface: '#111118',\n surfaceActive: '#7C3AED',\n border: '#1A1A24',\n text: '#FFFFFF',\n textSecondary: '#E0E0EE',\n textMuted: '#666666',\n textDim: '#555555',\n accent: '#7C3AED',\n success: '#22C55E',\n live: '#EF4444',\n errorText: '#F87171',\n errorBg: '#1A0A0A',\n errorBorder: '#3A1515',\n};\n\nconst light: DubsTheme = {\n background: '#FFFFFF',\n surface: '#F0F0F5',\n surfaceActive: '#7C3AED',\n border: '#E0E0E8',\n text: '#111118',\n textSecondary: '#333333',\n textMuted: '#888888',\n textDim: '#999999',\n accent: '#7C3AED',\n success: '#16A34A',\n live: '#DC2626',\n errorText: '#DC2626',\n errorBg: '#FEF2F2',\n errorBorder: '#FECACA',\n};\n\n/** Context for provider-level theme overrides (e.g. accent color from developer config). */\nconst ThemeOverrideContext = createContext<Partial<DubsTheme>>({});\nexport const ThemeOverrideProvider = ThemeOverrideContext.Provider;\n\nexport function useDubsTheme(): DubsTheme {\n const scheme = useColorScheme();\n const base = scheme === 'light' ? light : dark;\n const overrides = useContext(ThemeOverrideContext);\n if (Object.keys(overrides).length === 0) return base;\n return { ...base, ...overrides };\n}\n\n/** Merge overrides into a base theme (e.g. custom accent color from developer config) */\nexport function mergeTheme(base: DubsTheme, overrides: Partial<DubsTheme>): DubsTheme {\n return { ...base, ...overrides };\n}\n","import React, { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';\nimport { Platform } from 'react-native';\nimport { MwaWalletAdapter } from './wallet/mwa-adapter';\nimport { PhantomDeeplinkAdapter } from './wallet/phantom-deeplink';\nimport type { PhantomSession } from './wallet/phantom-deeplink';\nimport type { WalletAdapter } from './wallet/types';\nimport { ConnectWalletScreen } from './ui/ConnectWalletScreen';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { TokenStorage } from './storage';\nimport { STORAGE_KEYS } from './storage';\n\nconst TAG = '[Dubs:ManagedWallet]';\n\n/** Auto-detect redirect URI on iOS using the app's scheme from expo-linking. */\nfunction getDefaultRedirectUri(): string | undefined {\n if (Platform.OS !== 'ios') return undefined;\n try {\n const expoLinking = require('expo-linking');\n if (expoLinking.createURL) {\n const uri = expoLinking.createURL('phantom-callback');\n console.log(TAG, 'Auto-detected redirect URI via expo-linking:', uri);\n return uri;\n }\n } catch {}\n try {\n const Constants = require('expo-constants').default;\n const scheme = Constants.expoConfig?.scheme;\n if (scheme) {\n const uri = `${scheme}://phantom-callback`;\n console.log(TAG, 'Auto-detected redirect URI via expo-constants:', uri);\n return uri;\n }\n } catch {}\n return undefined;\n}\n\n// ── Module-level Phantom adapter singleton ──\n// Persists across React remounts (e.g. when the app backgrounds to open Phantom).\n// This prevents the Linking listener from being torn down mid-flow.\nlet phantomSingleton: PhantomDeeplinkAdapter | null = null;\n\nfunction getOrCreatePhantomAdapter(config: {\n redirectUri: string;\n appUrl?: string;\n cluster: string;\n storage: TokenStorage;\n}): PhantomDeeplinkAdapter {\n if (!phantomSingleton) {\n console.log(TAG, 'Creating PhantomDeeplinkAdapter (singleton)');\n phantomSingleton = new PhantomDeeplinkAdapter({\n redirectUri: config.redirectUri,\n appUrl: config.appUrl,\n cluster: config.cluster,\n storage: config.storage,\n onSessionChange: (session) => {\n if (session) {\n console.log(TAG, 'Phantom session changed — saving to storage, wallet:', session.walletPublicKey);\n config.storage.setItem(STORAGE_KEYS.PHANTOM_SESSION, JSON.stringify(session)).catch((err) => {\n console.log(TAG, 'Failed to save Phantom session:', err);\n });\n } else {\n console.log(TAG, 'Phantom session cleared — removing from storage');\n config.storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch((err) => {\n console.log(TAG, 'Failed to delete Phantom session:', err);\n });\n }\n },\n });\n }\n return phantomSingleton;\n}\n\n// ── Disconnect Context (internal) ──\n\ntype DisconnectFn = () => Promise<void>;\n\nexport const DisconnectContext = createContext<DisconnectFn | null>(null);\n\nexport function useDisconnect(): DisconnectFn | null {\n return useContext(DisconnectContext);\n}\n\n// ── Props ──\n\ninterface ManagedWalletProviderProps {\n appName: string;\n cluster: string;\n storage: TokenStorage;\n renderConnectScreen?: ((props: ConnectWalletScreenProps) => React.ReactNode) | false;\n /** Developer UI config overrides for the connect screen */\n accentColor?: string;\n appIcon?: string;\n tagline?: string;\n /** Deeplink redirect URI for Phantom (required on iOS, optional on Android) */\n redirectUri?: string;\n /** App URL shown in Phantom's connect screen */\n appUrl?: string;\n children: (adapter: WalletAdapter) => React.ReactNode;\n}\n\n// ── Component ──\n\nexport function ManagedWalletProvider({\n appName,\n cluster,\n storage,\n renderConnectScreen,\n accentColor,\n appIcon,\n tagline,\n redirectUri,\n appUrl,\n children,\n}: ManagedWalletProviderProps) {\n const [connected, setConnected] = useState(false);\n const [connecting, setConnecting] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Determine which adapter to use:\n // - Android → MWA (Phantom + other wallets support Mobile Wallet Adapter natively)\n // - iOS → Phantom deeplinks (MWA not available on iOS)\n const resolvedRedirectUri = redirectUri || getDefaultRedirectUri();\n const usePhantom = Platform.OS === 'ios' && !!resolvedRedirectUri;\n\n console.log(TAG, `Platform: ${Platform.OS}, redirectUri: ${resolvedRedirectUri ?? 'none'} (explicit: ${!!redirectUri}), usePhantom: ${usePhantom}`);\n\n const adapterRef = useRef<WalletAdapter | null>(null);\n const transactRef = useRef<any>(null);\n\n // Lazily create adapter — Phantom uses a module-level singleton to survive remounts\n if (!adapterRef.current) {\n if (usePhantom) {\n adapterRef.current = getOrCreatePhantomAdapter({\n redirectUri: resolvedRedirectUri!,\n appUrl,\n cluster,\n storage,\n });\n } else {\n console.log(TAG, 'Creating MwaWalletAdapter');\n adapterRef.current = new MwaWalletAdapter({\n transact: (...args: any[]) => {\n if (!transactRef.current) {\n throw new Error(\n '@dubsdotapp/expo: @solana-mobile/mobile-wallet-adapter-protocol-web3js is required. ' +\n 'Install it with: npm install @solana-mobile/mobile-wallet-adapter-protocol-web3js',\n );\n }\n return transactRef.current(...args);\n },\n appIdentity: { name: appName, uri: appUrl },\n cluster,\n onAuthTokenChange: (token) => {\n if (token) {\n storage.setItem(STORAGE_KEYS.MWA_AUTH_TOKEN, token).catch(() => {});\n } else {\n storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n }\n },\n });\n }\n }\n const adapter = adapterRef.current;\n\n // Restore session / dynamic-import on mount\n useEffect(() => {\n let cancelled = false;\n\n (async () => {\n if (usePhantom) {\n const phantom = adapter as PhantomDeeplinkAdapter;\n\n // If the singleton is already connected (e.g. after returning from Phantom), skip restore\n if (phantom.connected) {\n console.log(TAG, 'Phantom adapter already connected, skipping restore');\n if (!cancelled) {\n setConnected(true);\n setIsReady(true);\n }\n return;\n }\n\n // Check for cold-start recovery (Android killed the app during connect)\n const coldStartUrl = phantom.consumeColdStartUrl();\n if (coldStartUrl) {\n try {\n console.log(TAG, 'Cold-start URL detected, attempting recovery');\n await phantom.completeConnectFromColdStart(coldStartUrl);\n if (!cancelled) {\n console.log(TAG, 'Cold-start recovery succeeded');\n setConnected(true);\n setIsReady(true);\n }\n return;\n } catch (err) {\n console.log(TAG, 'Cold-start recovery failed:', err instanceof Error ? err.message : err);\n // Fall through to normal session restore\n }\n }\n\n try {\n const savedSession = await storage.getItem(STORAGE_KEYS.PHANTOM_SESSION);\n if (savedSession && !cancelled) {\n const session: PhantomSession = JSON.parse(savedSession);\n console.log(TAG, 'Found saved Phantom session, restoring for wallet:', session.walletPublicKey);\n phantom.restoreSession(session);\n if (!cancelled) {\n console.log(TAG, 'Phantom reconnected from saved session');\n setConnected(true);\n }\n } else {\n console.log(TAG, 'No saved Phantom session');\n }\n } catch (err) {\n console.log(TAG, 'Phantom session restore failed:', err instanceof Error ? err.message : err);\n await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {});\n } finally {\n if (!cancelled) {\n console.log(TAG, 'Phantom init complete, marking ready');\n setIsReady(true);\n }\n }\n } else {\n console.log(TAG, 'MWA path — dynamic-importing transact...');\n try {\n const mwa = await import('@solana-mobile/mobile-wallet-adapter-protocol-web3js');\n if (cancelled) return;\n transactRef.current = mwa.transact;\n console.log(TAG, 'MWA transact loaded');\n } catch {\n console.log(TAG, 'MWA not installed — transact will throw on use');\n }\n\n try {\n const savedToken = await storage.getItem(STORAGE_KEYS.MWA_AUTH_TOKEN);\n const savedAddress = await storage.getItem(STORAGE_KEYS.MWA_WALLET_ADDRESS);\n if (savedToken && savedAddress && !cancelled) {\n console.log(TAG, 'Found saved MWA session, restoring silently for wallet:', savedAddress);\n (adapter as MwaWalletAdapter).restoreSession(savedToken, savedAddress);\n setConnected(true);\n } else {\n console.log(TAG, 'No saved MWA session (token or address missing)');\n }\n } catch (err) {\n console.log(TAG, 'MWA session restore failed:', err instanceof Error ? err.message : err);\n await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.MWA_WALLET_ADDRESS).catch(() => {});\n } finally {\n if (!cancelled) {\n console.log(TAG, 'MWA init complete, marking ready');\n setIsReady(true);\n }\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [adapter, storage, usePhantom]);\n\n const handleConnect = useCallback(async () => {\n console.log(TAG, 'handleConnect() — user tapped connect');\n setConnecting(true);\n setError(null);\n try {\n await adapter.connect!();\n const walletAddress = adapter.publicKey?.toBase58();\n console.log(TAG, 'handleConnect() — success, wallet:', walletAddress);\n // Save wallet address for silent session restore on next launch (MWA only)\n if (!usePhantom && walletAddress) {\n storage.setItem(STORAGE_KEYS.MWA_WALLET_ADDRESS, walletAddress).catch(() => {});\n }\n setConnected(true);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Connection failed';\n console.log(TAG, 'handleConnect() — failed:', message);\n setError(message);\n } finally {\n setConnecting(false);\n }\n }, [adapter, storage, usePhantom]);\n\n const disconnect = useCallback(async () => {\n console.log(TAG, 'disconnect() — clearing all state');\n adapter.disconnect?.();\n // Destroy and reset the singleton so a fresh adapter is created on next connect\n if (usePhantom && phantomSingleton) {\n console.log(TAG, 'Destroying Phantom singleton');\n phantomSingleton.destroy();\n phantomSingleton = null;\n adapterRef.current = null;\n }\n await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.MWA_WALLET_ADDRESS).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n setConnected(false);\n console.log(TAG, 'disconnect() — done');\n }, [adapter, storage, usePhantom]);\n\n // Show nothing until we've attempted silent reconnect\n if (!isReady) {\n console.log(TAG, 'Not ready yet — rendering null');\n return null;\n }\n\n // Not connected — show connect screen\n if (!connected) {\n if (renderConnectScreen === false) {\n return null;\n }\n const connectProps: ConnectWalletScreenProps = {\n onConnect: handleConnect,\n connecting,\n error,\n appName,\n accentColor,\n appIcon,\n tagline,\n };\n if (renderConnectScreen) {\n return <>{renderConnectScreen(connectProps)}</>;\n }\n return <ConnectWalletScreen {...connectProps} />;\n }\n\n // Connected — render children with adapter + disconnect\n console.log(TAG, 'Rendering children — connected with wallet:', adapter.publicKey?.toBase58());\n return (\n <DisconnectContext.Provider value={disconnect}>\n {children(adapter)}\n </DisconnectContext.Provider>\n );\n}\n","import { PublicKey, Transaction } from '@solana/web3.js';\nimport type { WalletAdapter } from './types';\n\n/** Convert an MWA address (base64 string or Uint8Array) to a PublicKey */\nfunction toPublicKey(address: string | Uint8Array): PublicKey {\n if (address instanceof Uint8Array) {\n return new PublicKey(address);\n }\n // MWA protocol returns addresses as base64 — decode to bytes\n const bytes = Uint8Array.from(atob(address), (c) => c.charCodeAt(0));\n return new PublicKey(bytes);\n}\n\n/** The `transact` function signature from @solana-mobile/mobile-wallet-adapter-protocol-web3js */\nexport type MwaTransactFn = (\n callback: (wallet: any) => Promise<any>,\n) => Promise<any>;\n\nexport interface MwaAdapterConfig {\n /** The MWA `transact` function — import it from @solana-mobile/mobile-wallet-adapter-protocol-web3js */\n transact: MwaTransactFn;\n appIdentity: {\n name: string;\n uri?: string;\n icon?: string;\n };\n cluster?: string;\n onAuthTokenChange?: (token: string | null) => void;\n}\n\n/**\n * Mobile Wallet Adapter implementation.\n * Wraps @solana-mobile/mobile-wallet-adapter-protocol-web3js.\n */\nexport class MwaWalletAdapter implements WalletAdapter {\n private _publicKey: PublicKey | null = null;\n private _connected = false;\n private _authToken: string | null = null;\n /** The raw base64-encoded address from MWA authorize — needed for signMessages */\n private _mwaAddress: string | null = null;\n private readonly config: MwaAdapterConfig;\n private readonly transact: MwaTransactFn;\n\n constructor(config: MwaAdapterConfig) {\n this.config = config;\n this.transact = config.transact;\n }\n\n get publicKey(): PublicKey | null {\n return this._publicKey;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get authToken(): string | null {\n return this._authToken;\n }\n\n setAuthToken(token: string | null): void {\n this._authToken = token;\n }\n\n /**\n * Restore a previous session silently (no wallet interaction).\n * Sets the public key and auth token so the adapter appears connected.\n * The next signing operation will reauthorize with Phantom.\n */\n restoreSession(token: string, walletAddressBase58: string): void {\n this._authToken = token;\n this._publicKey = new PublicKey(walletAddressBase58);\n this._connected = true;\n }\n\n /**\n * Connect to a mobile wallet. Call this before any signing.\n * Tries reauthorize first (if we have a saved token), then falls back to\n * a fresh authorize in a SEPARATE transact session.\n */\n async connect(): Promise<void> {\n // Try reauthorize with saved token in its own transact session\n if (this._authToken) {\n try {\n await this.transact(async (wallet) => {\n const authResult = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(authResult);\n });\n return;\n } catch {\n // Stale token — clear it and do fresh authorize below\n console.log('[Dubs:MWA] reauthorize failed, clearing token and doing fresh authorize');\n this._authToken = null;\n this.config.onAuthTokenChange?.(null);\n }\n }\n\n // Fresh authorize in a new transact session\n await this.transact(async (wallet) => {\n const authResult = await wallet.authorize({\n identity: this.config.appIdentity,\n cluster: this.config.cluster || 'mainnet-beta',\n });\n this.applyAuthResult(authResult);\n });\n }\n\n /**\n * Disconnect and clear auth token.\n */\n disconnect(): void {\n this._publicKey = null;\n this._connected = false;\n this._authToken = null;\n this._mwaAddress = null;\n this.config.onAuthTokenChange?.(null);\n }\n\n async signTransaction(transaction: Transaction): Promise<Transaction> {\n if (!this._connected) throw new Error('Wallet not connected');\n\n const signed = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(reauth);\n\n const result = await wallet.signTransactions({\n transactions: [transaction],\n });\n return result[0];\n });\n\n return signed;\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n if (!this._connected || !this._publicKey) throw new Error('Wallet not connected');\n\n const sig = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(reauth);\n\n const result = await wallet.signMessages({\n addresses: [reauth.accounts[0].address],\n payloads: [message],\n });\n return result[0];\n });\n\n return sig instanceof Uint8Array ? sig : new Uint8Array(sig);\n }\n\n async signAndSendTransaction(transaction: Transaction): Promise<string> {\n if (!this._connected) throw new Error('Wallet not connected');\n\n let signature: any;\n try {\n signature = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(reauth);\n\n const result = await wallet.signAndSendTransactions({\n transactions: [transaction],\n });\n return result[0];\n });\n } catch (err: any) {\n console.error('[Dubs:MWA] ===== signAndSendTransaction ERROR DUMP =====');\n console.error('[Dubs:MWA] typeof:', typeof err);\n console.error('[Dubs:MWA] value:', err);\n console.error('[Dubs:MWA] message:', err?.message);\n console.error('[Dubs:MWA] name:', err?.name);\n console.error('[Dubs:MWA] code:', err?.code);\n console.error('[Dubs:MWA] cause:', err?.cause);\n console.error('[Dubs:MWA] stack:', err?.stack);\n console.error('[Dubs:MWA] JSON:', (() => { try { return JSON.stringify(err, Object.getOwnPropertyNames(err ?? {})); } catch { return 'unstringifiable'; } })());\n console.error('[Dubs:MWA] ===== END DUMP =====');\n throw err;\n }\n\n // MWA returns Uint8Array signature — convert to base58 string\n if (signature instanceof Uint8Array) {\n return new PublicKey(signature).toBase58();\n }\n\n return String(signature);\n }\n\n private applyAuthResult(authResult: any): void {\n this._mwaAddress = authResult.accounts[0].address as string;\n this._publicKey = toPublicKey(this._mwaAddress);\n this._authToken = authResult.auth_token;\n this._connected = true;\n this.config.onAuthTokenChange?.(this._authToken);\n }\n}\n","import { PublicKey, Transaction } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport type { WalletAdapter } from '../types';\nimport type { TokenStorage } from '../../storage';\nimport { STORAGE_KEYS } from '../../storage';\nimport {\n generateKeyPair,\n deriveSharedSecret,\n encryptPayload,\n decryptPayload,\n} from './crypto';\nimport { DeeplinkHandler } from './deeplink-handler';\n\nconst TAG = '[Dubs:PhantomAdapter]';\n\n/** Serializable session state — save this to restore without a deeplink round-trip. */\nexport interface PhantomSession {\n /** Our x25519 public key (base58) */\n dappPublicKey: string;\n /** Our x25519 secret key (base58) */\n dappSecretKey: string;\n /** Phantom's x25519 public key (base58) */\n phantomPublicKey: string;\n /** Shared secret (base58) */\n sharedSecret: string;\n /** Phantom session token (opaque string) */\n sessionToken: string;\n /** User's wallet public key (base58) */\n walletPublicKey: string;\n}\n\nexport interface PhantomDeeplinkAdapterConfig {\n /** The deeplink redirect URI, e.g. \"myapp://phantom-callback\" */\n redirectUri: string;\n /** Shown in Phantom's connect screen */\n appUrl?: string;\n /** Solana cluster: 'devnet' | 'mainnet-beta' */\n cluster?: string;\n /** Deeplink round-trip timeout in ms (default 120000) */\n timeout?: number;\n /** Called when the Phantom session changes (save/clear for persistence) */\n onSessionChange?: (session: PhantomSession | null) => void;\n /** Storage for persisting in-flight connect state (cold-start recovery on Android) */\n storage?: TokenStorage;\n}\n\nlet requestCounter = 0;\nfunction nextRequestId(): string {\n return `req${Date.now()}_${++requestCounter}`;\n}\n\n/**\n * Phantom wallet adapter using deeplinks (works on iOS and Android).\n * Uses x25519 encrypted communication per Phantom's deeplink protocol.\n */\nexport class PhantomDeeplinkAdapter implements WalletAdapter {\n private _publicKey: PublicKey | null = null;\n private _connected = false;\n private _dappKeyPair: { publicKey: Uint8Array; secretKey: Uint8Array } | null = null;\n private _sharedSecret: Uint8Array | null = null;\n private _sessionToken: string | null = null;\n private _phantomPublicKey: Uint8Array | null = null;\n\n private readonly config: PhantomDeeplinkAdapterConfig;\n private readonly handler: DeeplinkHandler;\n private readonly timeout: number;\n\n constructor(config: PhantomDeeplinkAdapterConfig) {\n console.log(TAG, 'Creating adapter with config:', {\n redirectUri: config.redirectUri,\n appUrl: config.appUrl,\n cluster: config.cluster,\n timeout: config.timeout,\n });\n this.config = config;\n this.timeout = config.timeout ?? 120_000;\n this.handler = new DeeplinkHandler(config.redirectUri);\n this.handler.start();\n console.log(TAG, 'Adapter created and deeplink listener started');\n }\n\n get publicKey(): PublicKey | null {\n return this._publicKey;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n /**\n * Restore a previously saved session without opening Phantom.\n * Call this before connect() if you have persisted session state.\n */\n restoreSession(saved: PhantomSession): void {\n console.log(TAG, 'Restoring session for wallet:', saved.walletPublicKey);\n this._dappKeyPair = {\n publicKey: bs58.decode(saved.dappPublicKey),\n secretKey: bs58.decode(saved.dappSecretKey),\n };\n this._phantomPublicKey = bs58.decode(saved.phantomPublicKey);\n this._sharedSecret = bs58.decode(saved.sharedSecret);\n this._sessionToken = saved.sessionToken;\n this._publicKey = new PublicKey(saved.walletPublicKey);\n this._connected = true;\n console.log(TAG, 'Session restored successfully — connected:', this._publicKey.toBase58());\n }\n\n /** Serialize the current session for persistence. Returns null if not connected. */\n getSession(): PhantomSession | null {\n if (\n !this._connected ||\n !this._dappKeyPair ||\n !this._phantomPublicKey ||\n !this._sharedSecret ||\n !this._sessionToken ||\n !this._publicKey\n ) {\n return null;\n }\n return {\n dappPublicKey: bs58.encode(this._dappKeyPair.publicKey),\n dappSecretKey: bs58.encode(this._dappKeyPair.secretKey),\n phantomPublicKey: bs58.encode(this._phantomPublicKey),\n sharedSecret: bs58.encode(this._sharedSecret),\n sessionToken: this._sessionToken,\n walletPublicKey: this._publicKey.toBase58(),\n };\n }\n\n async connect(): Promise<void> {\n console.log(TAG, 'connect() — generating x25519 keypair');\n // Generate a fresh keypair for this connection\n this._dappKeyPair = generateKeyPair();\n const dappPubBase58 = bs58.encode(this._dappKeyPair.publicKey);\n console.log(TAG, 'Dapp public key:', dappPubBase58);\n\n const requestId = nextRequestId();\n // Use clean redirect_link without query params — Phantom appends its own params\n const redirectLink = this.config.redirectUri;\n console.log(TAG, `connect() requestId=${requestId} redirectLink=${redirectLink}`);\n\n // app_url is required by Phantom — default to redirectUri if not provided\n const appUrl = this.config.appUrl || this.config.redirectUri;\n console.log(TAG, 'Using app_url:', appUrl);\n\n const params = new URLSearchParams({\n dapp_encryption_public_key: dappPubBase58,\n // Force mainnet-beta for deeplink session — devnet sessions cause -32603 on signMessage\n cluster: 'mainnet-beta',\n redirect_link: redirectLink,\n app_url: appUrl,\n });\n\n // Persist in-flight state so we can recover if the OS kills the app (Android cold-start)\n if (this.config.storage) {\n console.log(TAG, 'Saving in-flight connect state to storage');\n await this.config.storage.setItem(\n STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT,\n JSON.stringify({\n dappPublicKey: dappPubBase58,\n dappSecretKey: bs58.encode(this._dappKeyPair.secretKey),\n requestId,\n createdAt: Date.now(),\n }),\n );\n }\n\n const url = `https://phantom.app/ul/v1/connect?${params.toString()}`;\n console.log(TAG, 'Opening Phantom connect deeplink...');\n const response = await this.handler.send(url, requestId, this.timeout);\n console.log(TAG, 'Received connect response, param keys:', Object.keys(response.params).join(', '));\n\n // Extract Phantom's public key and derive shared secret\n const phantomPubBase58 = response.params.phantom_encryption_public_key;\n if (!phantomPubBase58) {\n console.log(TAG, 'ERROR: No phantom_encryption_public_key in response');\n throw new Error('Phantom did not return an encryption public key');\n }\n console.log(TAG, 'Phantom public key:', phantomPubBase58);\n\n this._phantomPublicKey = bs58.decode(phantomPubBase58);\n this._sharedSecret = deriveSharedSecret(\n this._dappKeyPair.secretKey,\n this._phantomPublicKey,\n );\n console.log(TAG, 'Shared secret derived, decrypting response...');\n\n // Decrypt the connect response data\n const data = decryptPayload(\n response.params.data,\n response.params.nonce,\n this._sharedSecret,\n );\n console.log(TAG, 'Decrypted connect data — public_key:', data.public_key, 'session length:', data.session?.length);\n\n this._sessionToken = data.session;\n this._publicKey = new PublicKey(data.public_key);\n this._connected = true;\n\n console.log(TAG, 'Connected! Wallet:', this._publicKey.toBase58());\n\n // Notify consumer of new session\n this.config.onSessionChange?.(this.getSession());\n\n // Clear in-flight state now that connect succeeded\n this.config.storage?.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n }\n\n disconnect(): void {\n console.log(TAG, 'disconnect() — clearing state, was connected:', this._connected, 'wallet:', this._publicKey?.toBase58());\n this._publicKey = null;\n this._connected = false;\n this._dappKeyPair = null;\n this._sharedSecret = null;\n this._sessionToken = null;\n this._phantomPublicKey = null;\n this.config.onSessionChange?.(null);\n console.log(TAG, 'Disconnected');\n }\n\n /**\n * Return and clear the stashed cold-start URL from the deeplink handler.\n * Used by ManagedWalletProvider to detect an in-flight connect on cold start.\n */\n consumeColdStartUrl(): string | null {\n return this.handler.getColdStartUrl();\n }\n\n /**\n * Complete a connect flow that was interrupted by the OS killing the app (Android).\n * Loads the saved in-flight keypair from storage, decrypts the Phantom response\n * from the cold-start URL, and restores the session.\n */\n async completeConnectFromColdStart(url: string): Promise<void> {\n if (!this.config.storage) {\n throw new Error('Cannot recover cold-start connect: no storage configured');\n }\n\n console.log(TAG, 'completeConnectFromColdStart() — attempting recovery');\n\n const raw = await this.config.storage.getItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT);\n if (!raw) {\n throw new Error('No in-flight connect state found in storage');\n }\n\n const inFlight = JSON.parse(raw) as {\n dappPublicKey: string;\n dappSecretKey: string;\n requestId: string;\n createdAt: number;\n };\n\n // Check expiry (120s)\n const age = Date.now() - inFlight.createdAt;\n if (age > 120_000) {\n console.log(TAG, `In-flight state expired (${Math.round(age / 1000)}s old), clearing`);\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n throw new Error('In-flight connect state expired');\n }\n\n console.log(TAG, `In-flight state age: ${Math.round(age / 1000)}s, requestId: ${inFlight.requestId}`);\n\n // Restore keypair from storage\n this._dappKeyPair = {\n publicKey: bs58.decode(inFlight.dappPublicKey),\n secretKey: bs58.decode(inFlight.dappSecretKey),\n };\n\n // Parse the Phantom callback URL\n const parsed = new URL(url);\n const params: Record<string, string> = {};\n parsed.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n // Check for Phantom error\n if (params.errorCode) {\n const errorMessage = params.errorMessage\n ? decodeURIComponent(params.errorMessage)\n : `Phantom error code: ${params.errorCode}`;\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n throw new Error(errorMessage);\n }\n\n const phantomPubBase58 = params.phantom_encryption_public_key;\n if (!phantomPubBase58) {\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n throw new Error('Phantom did not return an encryption public key');\n }\n\n console.log(TAG, 'Cold-start: Phantom public key:', phantomPubBase58);\n\n this._phantomPublicKey = bs58.decode(phantomPubBase58);\n this._sharedSecret = deriveSharedSecret(\n this._dappKeyPair.secretKey,\n this._phantomPublicKey,\n );\n\n const data = decryptPayload(params.data, params.nonce, this._sharedSecret);\n console.log(TAG, 'Cold-start: Decrypted connect data — public_key:', data.public_key);\n\n this._sessionToken = data.session;\n this._publicKey = new PublicKey(data.public_key);\n this._connected = true;\n\n console.log(TAG, 'Cold-start recovery complete! Wallet:', this._publicKey.toBase58());\n\n // Notify consumer of new session\n this.config.onSessionChange?.(this.getSession());\n\n // Clear in-flight state\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n }\n\n async signTransaction(transaction: Transaction): Promise<Transaction> {\n this.assertConnected();\n console.log(TAG, 'signTransaction() — serializing transaction');\n\n const serializedTx = bs58.encode(\n transaction.serialize({ requireAllSignatures: false, verifySignatures: false }),\n );\n console.log(TAG, 'Transaction serialized, length:', serializedTx.length);\n\n const { nonce, ciphertext } = encryptPayload(\n { transaction: serializedTx, session: this._sessionToken },\n this._sharedSecret!,\n );\n\n const requestId = nextRequestId();\n const redirectLink = this.config.redirectUri;\n console.log(TAG, `signTransaction() requestId=${requestId}`);\n\n const params = new URLSearchParams({\n dapp_encryption_public_key: bs58.encode(this._dappKeyPair!.publicKey),\n nonce,\n payload: ciphertext,\n redirect_link: redirectLink,\n });\n\n const url = `https://phantom.app/ul/v1/signTransaction?${params.toString()}`;\n console.log(TAG, 'Opening Phantom signTransaction deeplink...');\n const response = await this.handler.send(url, requestId, this.timeout);\n console.log(TAG, 'Received signTransaction response');\n\n const data = decryptPayload(\n response.params.data,\n response.params.nonce,\n this._sharedSecret!,\n );\n console.log(TAG, 'Decrypted signed transaction, length:', data.transaction?.length);\n\n return Transaction.from(bs58.decode(data.transaction));\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n this.assertConnected();\n console.log(TAG, 'signMessage() — message length:', message.length);\n\n const encodedMessage = bs58.encode(message);\n // Match Phantom demo app exactly: { session, message } — no display field\n const payload = {\n session: this._sessionToken,\n message: encodedMessage,\n };\n console.log(TAG, 'signMessage() payload keys:', Object.keys(payload).join(', '));\n console.log(TAG, 'signMessage() message (first 40 chars):', encodedMessage.substring(0, 40) + '...');\n console.log(TAG, 'signMessage() session (first 20 chars):', this._sessionToken?.substring(0, 20) + '...');\n console.log(TAG, 'signMessage() sharedSecret length:', this._sharedSecret!.length);\n console.log(TAG, 'signMessage() dappPubKey:', bs58.encode(this._dappKeyPair!.publicKey));\n\n // Verify encryption round-trip before sending\n const { nonce, ciphertext } = encryptPayload(payload, this._sharedSecret!);\n console.log(TAG, 'signMessage() encrypted — nonce length:', bs58.decode(nonce).length, 'ciphertext length:', bs58.decode(ciphertext).length);\n\n // Self-test: verify we can decrypt our own payload\n try {\n const selfTest = decryptPayload(ciphertext, nonce, this._sharedSecret!);\n console.log(TAG, 'signMessage() self-test decrypt OK — keys:', Object.keys(selfTest).join(', '));\n } catch (err) {\n console.log(TAG, 'signMessage() SELF-TEST FAILED:', err instanceof Error ? err.message : err);\n }\n\n const requestId = nextRequestId();\n // Clean redirect_link — no query params. Phantom appends its own response params.\n const redirectLink = this.config.redirectUri;\n console.log(TAG, `signMessage() requestId=${requestId} redirectLink=${redirectLink}`);\n\n const params = new URLSearchParams({\n dapp_encryption_public_key: bs58.encode(this._dappKeyPair!.publicKey),\n nonce,\n payload: ciphertext,\n redirect_link: redirectLink,\n });\n\n const url = `https://phantom.app/ul/v1/signMessage?${params.toString()}`;\n console.log(TAG, 'signMessage() full URL length:', url.length);\n console.log(TAG, 'Opening Phantom signMessage deeplink...');\n const response = await this.handler.send(url, requestId, this.timeout);\n console.log(TAG, 'Received signMessage response');\n\n const data = decryptPayload(\n response.params.data,\n response.params.nonce,\n this._sharedSecret!,\n );\n console.log(TAG, 'Message signed, signature:', data.signature?.substring(0, 20) + '...');\n\n return bs58.decode(data.signature);\n }\n\n /** Remove the Linking event listener. Call when the adapter is no longer needed. */\n destroy(): void {\n console.log(TAG, 'destroy() — cleaning up');\n this.handler.destroy();\n }\n\n private assertConnected(): void {\n if (!this._connected || !this._sharedSecret || !this._sessionToken) {\n console.log(TAG, 'assertConnected FAILED — connected:', this._connected, 'hasSecret:', !!this._sharedSecret, 'hasSession:', !!this._sessionToken);\n throw new Error('Wallet not connected');\n }\n }\n}\n","import nacl from 'tweetnacl';\nimport bs58 from 'bs58';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n}\n\n/** Generate an x25519 keypair for Diffie-Hellman key exchange with Phantom. */\nexport function generateKeyPair(): KeyPair {\n const kp = nacl.box.keyPair();\n return { publicKey: kp.publicKey, secretKey: kp.secretKey };\n}\n\n/** Derive a shared secret from our secret key and Phantom's public key. */\nexport function deriveSharedSecret(\n ourSecretKey: Uint8Array,\n theirPublicKey: Uint8Array,\n): Uint8Array {\n return nacl.box.before(theirPublicKey, ourSecretKey);\n}\n\n/** Encrypt a payload for Phantom using the shared secret. */\nexport function encryptPayload(\n payload: object,\n sharedSecret: Uint8Array,\n): { nonce: string; ciphertext: string } {\n const nonce = nacl.randomBytes(24);\n const message = new TextEncoder().encode(JSON.stringify(payload));\n const encrypted = nacl.box.after(message, nonce, sharedSecret);\n if (!encrypted) throw new Error('Encryption failed');\n return {\n nonce: bs58.encode(nonce),\n ciphertext: bs58.encode(encrypted),\n };\n}\n\n/** Decrypt a payload returned by Phantom using the shared secret. */\nexport function decryptPayload(\n ciphertextBase58: string,\n nonceBase58: string,\n sharedSecret: Uint8Array,\n): Record<string, any> {\n const ciphertext = bs58.decode(ciphertextBase58);\n const nonce = bs58.decode(nonceBase58);\n const decrypted = nacl.box.open.after(ciphertext, nonce, sharedSecret);\n if (!decrypted) throw new Error('Decryption failed — invalid shared secret or corrupted data');\n return JSON.parse(new TextDecoder().decode(decrypted));\n}\n","import { Linking } from 'react-native';\n\nconst TAG = '[Dubs:DeeplinkHandler]';\n\nexport interface DeeplinkResponse {\n /** All query parameters from the redirect URL */\n params: Record<string, string>;\n}\n\ninterface PendingRequest {\n resolve: (response: DeeplinkResponse) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Manages the deeplink round-trip with Phantom:\n * 1. Opens a Phantom deeplink URL\n * 2. Waits for Phantom to redirect back to our `redirectBase`\n * 3. Routes the response to the correct pending promise via request ID\n */\nexport class DeeplinkHandler {\n private readonly redirectBase: string;\n private readonly pending = new Map<string, PendingRequest>();\n private subscription: ReturnType<typeof Linking.addEventListener> | null = null;\n private _coldStartUrl: string | null = null;\n\n constructor(redirectBase: string) {\n // Strip trailing slashes for consistent matching\n this.redirectBase = redirectBase.replace(/\\/+$/, '');\n console.log(TAG, 'Created with redirectBase:', this.redirectBase);\n }\n\n /** Start listening for incoming deeplinks. Call once on adapter init. */\n start(): void {\n if (this.subscription) {\n console.log(TAG, 'Already listening, skipping start()');\n return;\n }\n\n console.log(TAG, 'Starting URL listener');\n this.subscription = Linking.addEventListener('url', ({ url }) => {\n console.log(TAG, 'Received URL event:', url);\n this.handleUrl(url);\n });\n\n // Check for cold-start URL (app was launched via deeplink)\n Linking.getInitialURL().then((url) => {\n if (url) {\n console.log(TAG, 'Cold-start URL found:', url);\n this.handleUrl(url);\n } else {\n console.log(TAG, 'No cold-start URL');\n }\n });\n }\n\n /** Stop listening and reject all pending requests. */\n destroy(): void {\n console.log(TAG, 'Destroying — pending requests:', this.pending.size);\n this.subscription?.remove();\n this.subscription = null;\n\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error('DeeplinkHandler destroyed'));\n this.pending.delete(id);\n }\n }\n\n /**\n * Open a Phantom deeplink and wait for the redirect response.\n * @param url The full Phantom deeplink URL to open\n * @param requestId Unique ID embedded in the redirect_link param\n * @param timeoutMs How long to wait before rejecting (default 120s)\n */\n async send(url: string, requestId: string, timeoutMs = 120_000): Promise<DeeplinkResponse> {\n console.log(TAG, `send() requestId=${requestId} timeout=${timeoutMs}ms`);\n console.log(TAG, 'Opening URL:', url.substring(0, 120) + (url.length > 120 ? '...' : ''));\n\n return new Promise<DeeplinkResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n console.log(TAG, `Timeout reached for requestId=${requestId}`);\n this.pending.delete(requestId);\n reject(new Error(`Phantom deeplink timed out after ${timeoutMs / 1000}s`));\n }, timeoutMs);\n\n this.pending.set(requestId, { resolve, reject, timer });\n\n Linking.openURL(url).catch((err) => {\n console.log(TAG, `Failed to open URL: ${err.message}`);\n this.pending.delete(requestId);\n clearTimeout(timer);\n reject(new Error(`Failed to open Phantom: ${err.message}`));\n });\n });\n }\n\n private handleUrl(url: string): void {\n // Only process URLs that match our redirect base\n if (!url.startsWith(this.redirectBase)) {\n console.log(TAG, 'Ignoring URL (not our redirect base):', url.substring(0, 80));\n return;\n }\n\n console.log(TAG, 'Processing redirect URL:', url.substring(0, 120) + (url.length > 120 ? '...' : ''));\n\n const parsed = new URL(url);\n const params: Record<string, string> = {};\n parsed.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n const paramKeys = Object.keys(params);\n console.log(TAG, 'Parsed params keys:', paramKeys.join(', '));\n\n // Check for Phantom error\n if (params.errorCode) {\n const errorMessage = params.errorMessage\n ? decodeURIComponent(params.errorMessage)\n : `Phantom error code: ${params.errorCode}`;\n console.log(TAG, `Phantom returned error: code=${params.errorCode} message=\"${errorMessage}\"`);\n\n // Route error to the pending request if we can identify it\n const requestId = this.extractRequestId(url);\n if (requestId && this.pending.has(requestId)) {\n console.log(TAG, `Routing error to requestId=${requestId}`);\n const req = this.pending.get(requestId)!;\n clearTimeout(req.timer);\n this.pending.delete(requestId);\n req.reject(new Error(errorMessage));\n return;\n }\n\n // If we can't route it, reject all pending (only one is typically active)\n console.log(TAG, `Cannot route error to specific request, rejecting all ${this.pending.size} pending`);\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error(errorMessage));\n this.pending.delete(id);\n }\n return;\n }\n\n // Route success to the correct pending request\n const requestId = this.extractRequestId(url);\n console.log(TAG, `Extracted requestId=${requestId}, pending requests: [${[...this.pending.keys()].join(', ')}]`);\n\n if (requestId && this.pending.has(requestId)) {\n console.log(TAG, `Resolving requestId=${requestId}`);\n const req = this.pending.get(requestId)!;\n clearTimeout(req.timer);\n this.pending.delete(requestId);\n req.resolve({ params });\n return;\n }\n\n // Fallback: resolve the first (and usually only) pending request\n const first = this.pending.entries().next().value;\n if (first) {\n const [id, req] = first;\n console.log(TAG, `Fallback: resolving first pending requestId=${id}`);\n clearTimeout(req.timer);\n this.pending.delete(id);\n req.resolve({ params });\n } else {\n console.log(TAG, 'No pending requests to resolve — stashing as cold-start URL');\n this._coldStartUrl = url;\n }\n }\n\n /** Return and clear the stashed cold-start URL (if any). */\n getColdStartUrl(): string | null {\n const url = this._coldStartUrl;\n this._coldStartUrl = null;\n return url;\n }\n\n /** Extract the request ID from the dubs_rid query parameter. */\n private extractRequestId(url: string): string | null {\n try {\n const parsed = new URL(url);\n return parsed.searchParams.get('dubs_rid');\n } catch {\n return null;\n }\n }\n}\n","import React from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n Image,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\n\nexport interface ConnectWalletScreenProps {\n /** Called when the user taps Connect Wallet */\n onConnect: () => void | Promise<void>;\n /** Show a loading spinner on the button while connecting */\n connecting?: boolean;\n /** Error message to display (e.g. \"User rejected the request\") */\n error?: string | null;\n /** App name shown in the header. Defaults to \"Dubs\" */\n appName?: string;\n /** Override accent color (e.g. from developer UI config) */\n accentColor?: string;\n /** URL to app icon — renders as Image instead of the default letter circle */\n appIcon?: string;\n /** Override subtitle text below app name */\n tagline?: string;\n}\n\nexport function ConnectWalletScreen({\n onConnect,\n connecting = false,\n error = null,\n appName = 'Dubs',\n accentColor,\n appIcon,\n tagline,\n}: ConnectWalletScreenProps) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n\n return (\n <View style={[styles.container, { backgroundColor: t.background }]}>\n <View style={styles.content}>\n {/* Branding */}\n <View style={styles.brandingSection}>\n {appIcon ? (\n <Image\n source={{ uri: appIcon }}\n style={styles.logoImage}\n />\n ) : (\n <View style={[styles.logoCircle, { backgroundColor: accent }]}>\n <Text style={styles.logoText}>\n {appName.charAt(0).toUpperCase()}\n </Text>\n </View>\n )}\n <Text style={[styles.appName, { color: t.text }]}>{appName}</Text>\n <Text style={[styles.subtitle, { color: t.textMuted }]}>\n {tagline || 'Connect your Solana wallet to get started'}\n </Text>\n </View>\n\n {/* Action */}\n <View style={styles.actionSection}>\n {error ? (\n <View\n style={[\n styles.errorBox,\n { backgroundColor: t.errorBg, borderColor: t.errorBorder },\n ]}\n >\n <Text style={[styles.errorText, { color: t.errorText }]}>{error}</Text>\n </View>\n ) : null}\n\n <TouchableOpacity\n style={[styles.connectButton, { backgroundColor: accent }]}\n onPress={onConnect}\n disabled={connecting}\n activeOpacity={0.8}\n >\n {connecting ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : (\n <Text style={styles.connectButtonText}>Connect Wallet</Text>\n )}\n </TouchableOpacity>\n\n <Text style={[styles.hint, { color: t.textDim }]}>\n Phantom, Solflare, or any Solana wallet\n </Text>\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n },\n content: {\n flex: 1,\n justifyContent: 'space-between',\n paddingHorizontal: 32,\n paddingTop: 120,\n paddingBottom: 80,\n },\n brandingSection: {\n alignItems: 'center',\n gap: 12,\n },\n logoCircle: {\n width: 80,\n height: 80,\n borderRadius: 40,\n justifyContent: 'center',\n alignItems: 'center',\n marginBottom: 8,\n },\n logoImage: {\n width: 80,\n height: 80,\n borderRadius: 16,\n marginBottom: 8,\n },\n logoText: {\n fontSize: 36,\n fontWeight: '800',\n color: '#FFFFFF',\n },\n appName: {\n fontSize: 32,\n fontWeight: '800',\n },\n subtitle: {\n fontSize: 16,\n textAlign: 'center',\n lineHeight: 22,\n },\n actionSection: {\n gap: 16,\n },\n errorBox: {\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n errorText: {\n fontSize: 14,\n textAlign: 'center',\n },\n connectButton: {\n height: 56,\n borderRadius: 16,\n justifyContent: 'center',\n alignItems: 'center',\n },\n connectButtonText: {\n color: '#FFFFFF',\n fontSize: 18,\n fontWeight: '700',\n },\n hint: {\n fontSize: 13,\n textAlign: 'center',\n },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n Keyboard,\n KeyboardAvoidingView,\n Platform,\n Image,\n Animated,\n ScrollView,\n} from 'react-native';\nimport { useAuth } from '../hooks';\nimport { usePushNotifications } from '../hooks/usePushNotifications';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport { useDubsTheme } from './theme';\nimport type { AuthStatus } from '../types';\nimport type { DubsClient } from '../client';\n\n// ── Avatar Helpers ──\n\nconst DICEBEAR_STYLES = [\n 'adventurer',\n 'avataaars',\n 'fun-emoji',\n 'bottts',\n 'big-smile',\n 'thumbs',\n];\n\nconst BG_COLORS = [\n '1a1a2e', 'f43f5e', 'f97316', 'eab308', '22c55e',\n '3b82f6', '8b5cf6', 'ec4899', '06b6d4', '64748b',\n];\n\nfunction generateSeed(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction getAvatarUrl(style: string, seed: string, bg = '1a1a2e', size = 256): string {\n return `https://api.dicebear.com/9.x/${style}/png?seed=${seed}&backgroundColor=${bg}&size=${size}`;\n}\n\n// ── Public Types ──\n\nexport interface RegistrationScreenProps {\n onRegister: (username: string, referralCode?: string, avatarUrl?: string) => void;\n registering: boolean;\n error: Error | null;\n client: DubsClient;\n}\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n onSaveToken: (token: string | null) => void | Promise<void>;\n onLoadToken: () => string | null | Promise<string | null>;\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n appName?: string;\n /** Override accent color for registration screens (from developer UI config) */\n accentColor?: string;\n}\n\n// ── AuthGate Component ──\n\nexport function AuthGate({\n children,\n onSaveToken,\n onLoadToken,\n renderLoading,\n renderError,\n renderRegistration,\n appName = 'Dubs',\n accentColor,\n}: AuthGateProps) {\n const { client, pushEnabled } = useDubs();\n const auth = useAuth();\n const [phase, setPhase] = useState<'init' | 'active'>('init');\n const [registrationPhase, setRegistrationPhase] = useState(false);\n const [showPushSetup, setShowPushSetup] = useState(false);\n const [isRestoredSession, setIsRestoredSession] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const savedToken = await onLoadToken();\n if (cancelled) return;\n if (savedToken) {\n const restored = await auth.restoreSession(savedToken);\n if (cancelled) return;\n if (restored) { setIsRestoredSession(true); setPhase('active'); return; }\n await onSaveToken(null);\n }\n if (cancelled) return;\n setPhase('active');\n await auth.authenticate();\n } catch {\n if (!cancelled) setPhase('active');\n }\n })();\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (auth.status === 'needsRegistration') setRegistrationPhase(true);\n }, [auth.status]);\n\n // Show push setup after new registration completes (not restored sessions)\n useEffect(() => {\n if (pushEnabled && auth.status === 'authenticated' && registrationPhase && !isRestoredSession) {\n setShowPushSetup(true);\n }\n }, [pushEnabled, auth.status, registrationPhase, isRestoredSession]);\n\n useEffect(() => {\n if (auth.token) onSaveToken(auth.token);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [auth.token]);\n\n const retry = useCallback(() => {\n setRegistrationPhase(false);\n auth.reset();\n auth.authenticate();\n }, [auth]);\n\n const handleRegister = useCallback(\n (username: string, referralCode?: string, avatarUrl?: string) => {\n auth.register(username, referralCode, avatarUrl);\n },\n [auth],\n );\n\n // ── Render ──\n\n if (phase === 'init') {\n if (renderLoading) return <>{renderLoading('authenticating')}</>;\n return <DefaultLoadingScreen status=\"authenticating\" appName={appName} accentColor={accentColor} />;\n }\n\n if (auth.status === 'authenticated') {\n if (showPushSetup) {\n return (\n <PushSetupScreen\n accentColor={accentColor}\n appName={appName}\n onComplete={() => setShowPushSetup(false)}\n />\n );\n }\n return (\n <AuthContext.Provider value={auth}>\n {pushEnabled && <PushTokenRestorer />}\n {children}\n </AuthContext.Provider>\n );\n }\n\n if (registrationPhase) {\n const isRegistering = auth.status === 'registering';\n const regError = auth.status === 'error' ? auth.error : null;\n if (renderRegistration) {\n return <>{renderRegistration({ onRegister: handleRegister, registering: isRegistering, error: regError, client })}</>;\n }\n return (\n <DefaultRegistrationScreen\n onRegister={handleRegister}\n registering={isRegistering}\n error={regError}\n client={client}\n appName={appName}\n accentColor={accentColor}\n />\n );\n }\n\n if (auth.status === 'error' && auth.error) {\n if (renderError) return <>{renderError(auth.error, retry)}</>;\n return <DefaultErrorScreen error={auth.error} onRetry={retry} appName={appName} accentColor={accentColor} />;\n }\n\n if (renderLoading) return <>{renderLoading(auth.status)}</>;\n return <DefaultLoadingScreen status={auth.status} appName={appName} accentColor={accentColor} />;\n}\n\n// ── Default Loading Screen ──\n\nfunction DefaultLoadingScreen({ status, appName, accentColor }: { status: AuthStatus; appName: string; accentColor?: string }) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n const statusText: Record<AuthStatus, string> = {\n idle: 'Initializing...',\n authenticating: 'Connecting...',\n signing: 'Approve in your wallet...',\n verifying: 'Verifying...',\n registering: 'Creating account...',\n needsRegistration: 'Almost there...',\n authenticated: 'Ready!',\n error: 'Something went wrong',\n };\n return (\n <View style={[s.container, { backgroundColor: t.background }]}>\n <View style={s.centerContent}>\n <View style={s.brandingSection}>\n <View style={[s.logoCircle, { backgroundColor: accent }]}>\n <Text style={s.logoText}>D</Text>\n </View>\n <Text style={[s.appNameText, { color: t.text }]}>{appName}</Text>\n </View>\n <View style={s.loadingSection}>\n <ActivityIndicator size=\"large\" color={accent} />\n <Text style={[s.statusText, { color: t.textMuted }]}>{statusText[status] || 'Loading...'}</Text>\n </View>\n </View>\n </View>\n );\n}\n\n// ── Default Error Screen ──\n\nfunction DefaultErrorScreen({ error, onRetry, appName, accentColor }: { error: Error; onRetry: () => void; appName: string; accentColor?: string }) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n return (\n <View style={[s.container, { backgroundColor: t.background }]}>\n <View style={s.spreadContent}>\n <View style={s.brandingSection}>\n <View style={[s.logoCircle, { backgroundColor: accent }]}>\n <Text style={s.logoText}>D</Text>\n </View>\n <Text style={[s.appNameText, { color: t.text }]}>{appName}</Text>\n </View>\n <View style={{ gap: 16 }}>\n <View style={[s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[s.errorText, { color: t.errorText }]}>{error.message}</Text>\n </View>\n <TouchableOpacity style={[s.primaryBtn, { backgroundColor: accent }]} onPress={onRetry} activeOpacity={0.8}>\n <Text style={s.primaryBtnText}>Try Again</Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n );\n}\n\n// ── Step Indicator ──\n\nfunction StepIndicator({ currentStep }: { currentStep: number }) {\n const t = useDubsTheme();\n const steps = [0, 1, 2, 3];\n return (\n <View style={s.stepRow}>\n {steps.map((i) => (\n <React.Fragment key={i}>\n {i > 0 && (\n <View style={[s.stepLine, { backgroundColor: i <= currentStep ? t.success : t.border }]} />\n )}\n <View\n style={[\n s.stepCircle,\n i < currentStep\n ? { backgroundColor: t.success }\n : i === currentStep\n ? { backgroundColor: t.accent }\n : { backgroundColor: 'transparent', borderWidth: 2, borderColor: t.border },\n ]}\n >\n {i < currentStep ? (\n <Text style={s.stepCheck}>✓</Text>\n ) : (\n <Text style={[s.stepNum, { color: i === currentStep ? '#FFF' : t.textMuted }]}>{i + 1}</Text>\n )}\n </View>\n </React.Fragment>\n ))}\n </View>\n );\n}\n\n// ── Default Registration Screen (3-Step Onboarding) ──\n\nfunction DefaultRegistrationScreen({\n onRegister,\n registering,\n error,\n client,\n appName,\n accentColor,\n}: RegistrationScreenProps & { appName: string; accentColor?: string }) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n\n // ── Shared state ──\n const [step, setStep] = useState(0);\n const [avatarSeed, setAvatarSeed] = useState(generateSeed);\n const [avatarStyle, setAvatarStyle] = useState('adventurer');\n const [avatarBg, setAvatarBg] = useState('1a1a2e');\n const [showStyles, setShowStyles] = useState(false);\n const [username, setUsername] = useState('');\n const [referralCode, setReferralCode] = useState('');\n const [checking, setChecking] = useState(false);\n const [availability, setAvailability] = useState<{ available: boolean; reason?: string } | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // ── Animation ──\n const fadeAnim = useRef(new Animated.Value(1)).current;\n const slideAnim = useRef(new Animated.Value(0)).current;\n\n const avatarUrl = getAvatarUrl(avatarStyle, avatarSeed, avatarBg);\n\n // Debounced username check\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const trimmed = username.trim();\n if (trimmed.length < 3) { setAvailability(null); setChecking(false); return; }\n setChecking(true);\n debounceRef.current = setTimeout(async () => {\n try {\n const result = await client.checkUsername(trimmed);\n setAvailability(result);\n } catch { setAvailability(null); }\n finally { setChecking(false); }\n }, 500);\n return () => { if (debounceRef.current) clearTimeout(debounceRef.current); };\n }, [username, client]);\n\n const animateToStep = useCallback((newStep: number) => {\n const dir = newStep > step ? 1 : -1;\n Keyboard.dismiss();\n Animated.parallel([\n Animated.timing(fadeAnim, { toValue: 0, duration: 120, useNativeDriver: true }),\n Animated.timing(slideAnim, { toValue: -dir * 40, duration: 120, useNativeDriver: true }),\n ]).start(() => {\n setStep(newStep);\n slideAnim.setValue(dir * 40);\n Animated.parallel([\n Animated.timing(fadeAnim, { toValue: 1, duration: 200, useNativeDriver: true }),\n Animated.timing(slideAnim, { toValue: 0, duration: 200, useNativeDriver: true }),\n ]).start();\n });\n }, [step, fadeAnim, slideAnim]);\n\n const canContinueUsername =\n username.trim().length >= 3 && availability?.available === true && !checking;\n\n const handleSubmit = () => {\n Keyboard.dismiss();\n onRegister(username.trim(), referralCode.trim() || undefined, avatarUrl);\n };\n\n // ── Step 1: Avatar ──\n const renderAvatarStep = () => (\n <View style={s.stepContainer}>\n <View style={s.stepTop}>\n <Text style={[s.title, { color: t.text }]}>Choose Your Avatar</Text>\n <Text style={[s.subtitle, { color: t.textMuted }]}>Pick a look that represents you</Text>\n <StepIndicator currentStep={0} />\n\n <View style={s.avatarCenter}>\n <View style={[s.avatarFrame, { borderColor: accent }]}>\n <Image source={{ uri: avatarUrl }} style={s.avatarLarge} />\n <View style={[s.checkBadge, { backgroundColor: t.success }]}>\n <Text style={s.checkBadgeText}>✓</Text>\n </View>\n </View>\n </View>\n\n <View style={s.avatarActions}>\n <TouchableOpacity\n style={[s.outlineBtn, { borderColor: t.border }]}\n onPress={() => setAvatarSeed(generateSeed())}\n activeOpacity={0.7}\n >\n <Text style={[s.outlineBtnText, { color: t.text }]}>↻ Shuffle</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.outlineBtn, { borderColor: accent, backgroundColor: accent + '15' }]}\n onPress={() => setShowStyles(!showStyles)}\n activeOpacity={0.7}\n >\n <Text style={[s.outlineBtnText, { color: accent }]}>☺ Customize</Text>\n </TouchableOpacity>\n </View>\n\n {showStyles && (\n <>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} style={s.styleScroll}>\n {DICEBEAR_STYLES.map((st) => (\n <TouchableOpacity\n key={st}\n onPress={() => setAvatarStyle(st)}\n style={[s.styleThumbWrap, { borderColor: st === avatarStyle ? accent : t.border }]}\n >\n <Image source={{ uri: getAvatarUrl(st, avatarSeed, avatarBg, 80) }} style={s.styleThumb} />\n </TouchableOpacity>\n ))}\n </ScrollView>\n <Text style={[s.subtitle, { color: t.textMuted, marginTop: 8 }]}>Background Color</Text>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} style={s.styleScroll}>\n {BG_COLORS.map((color) => (\n <TouchableOpacity\n key={color}\n onPress={() => setAvatarBg(color)}\n style={[\n s.colorSwatch,\n { backgroundColor: `#${color}` },\n color === avatarBg && { borderColor: accent, borderWidth: 2.5 },\n ]}\n />\n ))}\n </ScrollView>\n </>\n )}\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1 }]}\n onPress={() => animateToStep(1)}\n activeOpacity={0.8}\n >\n <Text style={s.primaryBtnText}>Continue ›</Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n\n // ── Step 2: Username ──\n const renderUsernameStep = () => (\n <View style={s.stepContainer}>\n <View style={s.stepTop}>\n <View style={s.headerRow}>\n <TouchableOpacity onPress={() => animateToStep(0)} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}>\n <Text style={[s.backChevron, { color: t.text }]}>‹</Text>\n </TouchableOpacity>\n <Text style={[s.titleInline, { color: t.text }]}>Pick a Username</Text>\n </View>\n <Text style={[s.subtitle, { color: t.textMuted }]}>This is how others will see you</Text>\n <StepIndicator currentStep={1} />\n\n <View style={s.avatarCenter}>\n <View style={[s.avatarFrameSmall, { borderColor: accent }]}>\n <Image source={{ uri: avatarUrl }} style={s.avatarSmall} />\n <View style={[s.checkBadgeSm, { backgroundColor: t.success }]}>\n <Text style={s.checkBadgeTextSm}>✓</Text>\n </View>\n </View>\n </View>\n\n <View style={s.inputGroup}>\n <Text style={[s.inputLabel, { color: t.text }]}>\n Username <Text style={{ color: t.errorText }}>*</Text>\n </Text>\n <TextInput\n style={[s.input, { backgroundColor: t.surface, color: t.text, borderColor: accent }]}\n placeholder=\"Enter username\"\n placeholderTextColor={t.textDim}\n value={username}\n onChangeText={setUsername}\n autoCapitalize=\"none\"\n autoCorrect={false}\n autoFocus\n />\n {checking ? (\n <Text style={[s.hint, { color: t.textDim }]}>Checking...</Text>\n ) : availability ? (\n <Text style={[s.hint, { color: availability.available ? t.success : t.errorText }]}>\n {availability.available ? '\\u2713 Available!' : (availability.reason || 'Username taken')}\n </Text>\n ) : username.trim().length > 0 && username.trim().length < 3 ? (\n <Text style={[s.hint, { color: t.textDim }]}>At least 3 characters</Text>\n ) : null}\n </View>\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.secondaryBtn, { borderColor: t.border }]}\n onPress={() => animateToStep(0)}\n activeOpacity={0.7}\n >\n <Text style={[s.secondaryBtnText, { color: t.text }]}>‹ Back</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: canContinueUsername ? 1 : 0.4 }]}\n onPress={() => animateToStep(2)}\n disabled={!canContinueUsername}\n activeOpacity={0.8}\n >\n <Text style={s.primaryBtnText}>Continue ›</Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n\n // ── Step 3: Referral + Create ──\n const renderReferralStep = () => (\n <View style={s.stepContainer}>\n <View style={s.stepTop}>\n <View style={s.headerRow}>\n <TouchableOpacity onPress={() => animateToStep(1)} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}>\n <Text style={[s.backChevron, { color: t.text }]}>‹</Text>\n </TouchableOpacity>\n <Text style={[s.titleInline, { color: t.text }]}>Almost There!</Text>\n </View>\n <Text style={[s.subtitle, { color: t.textMuted }]}>Got a referral code? (optional)</Text>\n <StepIndicator currentStep={2} />\n\n {/* Profile preview card */}\n <View style={[s.profileCard, { borderColor: t.border }]}>\n <Text style={[s.profileLabel, { color: t.textMuted }]}>Your Profile</Text>\n <View style={s.profileRow}>\n <Image source={{ uri: avatarUrl }} style={s.profileAvatar} />\n <View style={{ gap: 4 }}>\n <Text style={[s.profileUsername, { color: t.text }]}>@{username}</Text>\n <Text style={[s.profileReady, { color: t.success }]}>{'\\u2713'} Ready to go!</Text>\n </View>\n </View>\n </View>\n\n {error ? (\n <View style={[s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[s.errorText, { color: t.errorText }]}>{error.message}</Text>\n </View>\n ) : null}\n\n <View style={s.inputGroup}>\n <Text style={[s.inputLabel, { color: t.text }]}>\n Referral Code <Text style={{ color: t.textMuted }}>(optional)</Text>\n </Text>\n <TextInput\n style={[s.input, { backgroundColor: t.surface, color: t.text, borderColor: t.border }]}\n placeholder=\"Enter referral code\"\n placeholderTextColor={t.textDim}\n value={referralCode}\n onChangeText={setReferralCode}\n autoCapitalize=\"none\"\n autoCorrect={false}\n editable={!registering}\n />\n <Text style={[s.hint, { color: t.textMuted }]}>\n {'\\uD83C\\uDF81'} If a friend invited you, enter their code to give them credit!\n </Text>\n </View>\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.secondaryBtn, { borderColor: t.border }]}\n onPress={() => animateToStep(1)}\n disabled={registering}\n activeOpacity={0.7}\n >\n <Text style={[s.secondaryBtnText, { color: t.text }]}>‹ Back</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: registering ? 0.7 : 1 }]}\n onPress={handleSubmit}\n disabled={registering}\n activeOpacity={0.8}\n >\n {registering ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : (\n <Text style={s.primaryBtnText}>Create Account</Text>\n )}\n </TouchableOpacity>\n </View>\n </View>\n );\n\n const renderStep = () => {\n switch (step) {\n case 0: return renderAvatarStep();\n case 1: return renderUsernameStep();\n case 2: return renderReferralStep();\n default: return null;\n }\n };\n\n return (\n <KeyboardAvoidingView\n style={[s.container, { backgroundColor: t.background }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <ScrollView\n contentContainerStyle={{ flexGrow: 1 }}\n keyboardShouldPersistTaps=\"handled\"\n bounces={false}\n >\n <Animated.View\n style={[\n { flex: 1 },\n { opacity: fadeAnim, transform: [{ translateX: slideAnim }] },\n ]}\n >\n {renderStep()}\n </Animated.View>\n </ScrollView>\n </KeyboardAvoidingView>\n );\n}\n\n// ── Push Token Restorer (silent, zero UI) ──\n// Runs inside DubsContext + AuthGate when user is authenticated.\n// Silently re-registers the push token for returning users who already granted permission.\n// Does NOT prompt — the prompt only happens in PushSetupScreen during onboarding.\n\nfunction PushTokenRestorer() {\n const push = usePushNotifications();\n const restored = useRef(false);\n\n useEffect(() => {\n if (restored.current) return;\n restored.current = true;\n push.restoreIfGranted();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return null;\n}\n\n// ── Push Setup Screen (Step 3 of onboarding) ──\n\nfunction PushSetupScreen({\n accentColor,\n appName,\n onComplete,\n}: {\n accentColor?: string;\n appName: string;\n onComplete: () => void;\n}) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n const push = usePushNotifications();\n const fadeAnim = useRef(new Animated.Value(0)).current;\n const slideAnim = useRef(new Animated.Value(30)).current;\n\n useEffect(() => {\n Animated.parallel([\n Animated.timing(fadeAnim, { toValue: 1, duration: 300, useNativeDriver: true }),\n Animated.timing(slideAnim, { toValue: 0, duration: 300, useNativeDriver: true }),\n ]).start();\n }, [fadeAnim, slideAnim]);\n\n const handleEnable = async () => {\n await push.register();\n onComplete();\n };\n\n const benefits = [\n 'A fight you picked on goes LIVE',\n 'Your pick wins or loses',\n 'Final results and rankings',\n ];\n\n return (\n <View style={[s.container, { backgroundColor: t.background }]}>\n <Animated.View\n style={[\n s.stepContainer,\n { opacity: fadeAnim, transform: [{ translateY: slideAnim }] },\n ]}\n >\n <View style={s.stepTop}>\n <Text style={[s.title, { color: t.text }]}>Enable Notifications</Text>\n <Text style={[s.subtitle, { color: t.textMuted }]}>\n Stay in the loop with real-time updates\n </Text>\n <StepIndicator currentStep={3} />\n\n <View style={pushStyles.iconContainer}>\n <View style={[pushStyles.bellCircle, { backgroundColor: accent + '20' }]}>\n <Text style={[pushStyles.bellIcon, { color: accent }]}>{'\\uD83D\\uDD14'}</Text>\n </View>\n </View>\n\n <View style={pushStyles.benefitsList}>\n <Text style={[pushStyles.benefitsHeader, { color: t.text }]}>\n Get real-time updates when:\n </Text>\n {benefits.map((item, i) => (\n <View key={i} style={pushStyles.benefitRow}>\n <View style={[pushStyles.bulletDot, { backgroundColor: accent }]} />\n <Text style={[pushStyles.benefitText, { color: t.textMuted }]}>{item}</Text>\n </View>\n ))}\n </View>\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.secondaryBtn, { borderColor: t.border }]}\n onPress={onComplete}\n activeOpacity={0.7}\n >\n <Text style={[s.secondaryBtnText, { color: t.textMuted }]}>Maybe Later</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: push.loading ? 0.7 : 1 }]}\n onPress={handleEnable}\n disabled={push.loading}\n activeOpacity={0.8}\n >\n {push.loading ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : (\n <Text style={s.primaryBtnText}>Enable Notifications</Text>\n )}\n </TouchableOpacity>\n </View>\n </Animated.View>\n </View>\n );\n}\n\nconst pushStyles = StyleSheet.create({\n iconContainer: { alignItems: 'center', marginVertical: 24 },\n bellCircle: { width: 100, height: 100, borderRadius: 50, justifyContent: 'center', alignItems: 'center' },\n bellIcon: { fontSize: 48 },\n benefitsList: { paddingHorizontal: 24, gap: 12, marginTop: 8 },\n benefitsHeader: { fontSize: 17, fontWeight: '700', marginBottom: 4 },\n benefitRow: { flexDirection: 'row', alignItems: 'center', gap: 12 },\n bulletDot: { width: 8, height: 8, borderRadius: 4 },\n benefitText: { fontSize: 16, flex: 1 },\n});\n\n// ── Styles ──\n\nconst s = StyleSheet.create({\n container: { flex: 1 },\n // Loading / Error\n centerContent: { flex: 1, justifyContent: 'center', alignItems: 'center', paddingHorizontal: 32, gap: 48 },\n spreadContent: { flex: 1, justifyContent: 'space-between', paddingHorizontal: 32, paddingTop: 120, paddingBottom: 80 },\n brandingSection: { alignItems: 'center', gap: 12 },\n logoCircle: { width: 80, height: 80, borderRadius: 40, justifyContent: 'center', alignItems: 'center', marginBottom: 8 },\n logoText: { fontSize: 36, fontWeight: '800', color: '#FFFFFF' },\n appNameText: { fontSize: 32, fontWeight: '800' },\n loadingSection: { alignItems: 'center', gap: 16 },\n statusText: { fontSize: 16, textAlign: 'center' },\n errorBox: { borderWidth: 1, borderRadius: 12, paddingHorizontal: 16, paddingVertical: 12 },\n errorText: { fontSize: 14, textAlign: 'center' },\n // Step indicator\n stepRow: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 24, marginVertical: 16 },\n stepLine: { flex: 1, height: 2 },\n stepCircle: { width: 36, height: 36, borderRadius: 18, justifyContent: 'center', alignItems: 'center' },\n stepCheck: { color: '#FFF', fontSize: 16, fontWeight: '700' },\n stepNum: { fontSize: 14, fontWeight: '700' },\n // Onboarding layout\n stepContainer: { flex: 1, justifyContent: 'space-between', paddingBottom: 40 },\n stepTop: { gap: 8, paddingTop: 64 },\n headerRow: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 24 },\n backChevron: { fontSize: 32, fontWeight: '300', lineHeight: 36, marginTop: -2 },\n title: { fontSize: 28, fontWeight: '800', paddingHorizontal: 24 },\n titleInline: { fontSize: 28, fontWeight: '800' },\n subtitle: { fontSize: 15, paddingHorizontal: 24, lineHeight: 20 },\n // Avatar\n avatarCenter: { alignItems: 'center', marginVertical: 12 },\n avatarFrame: { borderWidth: 3, borderRadius: 20, padding: 4 },\n avatarLarge: { width: 160, height: 160, borderRadius: 16, backgroundColor: '#E5E5EA' },\n checkBadge: { position: 'absolute', bottom: -6, right: -6, width: 28, height: 28, borderRadius: 14, justifyContent: 'center', alignItems: 'center' },\n checkBadgeText: { color: '#FFF', fontSize: 15, fontWeight: '700' },\n avatarFrameSmall: { borderWidth: 3, borderRadius: 14, padding: 3 },\n avatarSmall: { width: 100, height: 100, borderRadius: 12, backgroundColor: '#E5E5EA' },\n checkBadgeSm: { position: 'absolute', bottom: -4, right: -4, width: 22, height: 22, borderRadius: 11, justifyContent: 'center', alignItems: 'center' },\n checkBadgeTextSm: { color: '#FFF', fontSize: 12, fontWeight: '700' },\n avatarActions: { flexDirection: 'row', justifyContent: 'center', gap: 12, paddingHorizontal: 24 },\n outlineBtn: { borderWidth: 1.5, borderRadius: 12, paddingHorizontal: 20, paddingVertical: 12 },\n outlineBtnText: { fontSize: 15, fontWeight: '600' },\n styleScroll: { paddingHorizontal: 24, marginTop: 4 },\n styleThumbWrap: { borderWidth: 2, borderRadius: 12, padding: 3, marginRight: 10 },\n styleThumb: { width: 52, height: 52, borderRadius: 10, backgroundColor: '#E5E5EA' },\n colorSwatch: { width: 32, height: 32, borderRadius: 16, borderWidth: 1.5, borderColor: 'rgba(255,255,255,0.15)', marginRight: 10 },\n // Input\n inputGroup: { paddingHorizontal: 24, gap: 6 },\n inputLabel: { fontSize: 15, fontWeight: '600' },\n input: { height: 56, borderRadius: 16, borderWidth: 1.5, paddingHorizontal: 16, fontSize: 16 },\n hint: { fontSize: 13, paddingLeft: 4 },\n // Profile card\n profileCard: { marginHorizontal: 24, borderWidth: 1, borderRadius: 16, padding: 16, gap: 12 },\n profileLabel: { fontSize: 13 },\n profileRow: { flexDirection: 'row', alignItems: 'center', gap: 14 },\n profileAvatar: { width: 56, height: 56, borderRadius: 12, backgroundColor: '#E5E5EA' },\n profileUsername: { fontSize: 20, fontWeight: '800' },\n profileReady: { fontSize: 14, fontWeight: '600' },\n // Buttons\n bottomRow: { flexDirection: 'row', gap: 12, paddingHorizontal: 24 },\n primaryBtn: { height: 56, borderRadius: 16, justifyContent: 'center', alignItems: 'center' },\n primaryBtnText: { color: '#FFFFFF', fontSize: 18, fontWeight: '700' },\n secondaryBtn: { height: 56, borderRadius: 16, borderWidth: 1.5, justifyContent: 'center', alignItems: 'center', paddingHorizontal: 24 },\n secondaryBtnText: { fontSize: 16, fontWeight: '600' },\n});\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UnifiedEvent, Pagination, GetUpcomingEventsParams, QueryResult } from '../types';\n\nexport function useEvents(\n params?: GetUpcomingEventsParams,\n): QueryResult<{ events: UnifiedEvent[]; pagination: Pagination }> {\n const { client } = useDubs();\n const [data, setData] = useState<{ events: UnifiedEvent[]; pagination: Pagination } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Serialize params for dependency comparison\n const paramKey = JSON.stringify(params ?? {});\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.getUpcomingEvents(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameDetail, QueryResult } from '../types';\n\nexport function useGame(gameId: string | null): QueryResult<GameDetail> {\n const { client } = useDubs();\n const [data, setData] = useState<GameDetail | null>(null);\n const [loading, setLoading] = useState(!!gameId);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!gameId) return;\n setLoading(true);\n setError(null);\n try {\n const game = await client.getGame(gameId);\n setData(game);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, gameId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameListItem, GetGamesParams, QueryResult } from '../types';\n\nexport function useGames(params?: GetGamesParams): QueryResult<GameListItem[]> {\n const { client } = useDubs();\n const [data, setData] = useState<GameListItem[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const paramKey = JSON.stringify(params ?? {});\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const games = await client.getGames(params);\n setData(games);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameListItem, Pagination, GetNetworkGamesParams, QueryResult } from '../types';\n\nexport function useNetworkGames(params?: GetNetworkGamesParams): QueryResult<{ games: GameListItem[]; pagination: Pagination }> {\n const { client } = useDubs();\n const [data, setData] = useState<{ games: GameListItem[]; pagination: Pagination } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const paramKey = JSON.stringify(params ?? {});\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.getNetworkGames(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { CreateGameParams, MutationStatus } from '../types';\n\nexport interface CreateGameMutationResult {\n gameId: string;\n gameAddress: string;\n signature: string;\n explorerUrl: string;\n}\n\nexport function useCreateGame() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<CreateGameMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: CreateGameParams): Promise<CreateGameMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned transaction\n console.log('[useCreateGame] Step 1: Building transaction...');\n const createResult = await client.createGame(params);\n console.log('[useCreateGame] Step 1 done:', { gameId: createResult.gameId, gameAddress: createResult.gameAddress });\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useCreateGame] Step 2: Signing and sending...');\n const signature = await signAndSendBase64Transaction(\n createResult.transaction,\n wallet,\n connection,\n );\n console.log('[useCreateGame] Step 2 done. Signature:', signature);\n\n // 3. Confirm with backend (server handles on-chain verification)\n setStatus('confirming');\n console.log('[useCreateGame] Step 3: Confirming with backend...');\n const confirmResult = await client.confirmGame({\n gameId: createResult.gameId,\n playerWallet: params.playerWallet,\n signature,\n teamChoice: params.teamChoice,\n wagerAmount: params.wagerAmount,\n role: 'creator',\n gameAddress: createResult.gameAddress,\n });\n console.log('[useCreateGame] Step 3 done.');\n\n const result: CreateGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useCreateGame] Complete!');\n return result;\n } catch (err) {\n console.error('[useCreateGame] FAILED:', err);\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { Transaction, Connection } from '@solana/web3.js';\nimport type { WalletAdapter } from '../wallet/types';\n\n/**\n * Deserialize a base64-encoded transaction, sign via wallet adapter, send to Solana.\n * Prefers signAndSendTransaction if available (MWA), otherwise falls back to\n * signTransaction + sendRawTransaction via RPC (Phantom deeplinks).\n * Returns the transaction signature.\n */\nexport async function signAndSendBase64Transaction(\n base64Tx: string,\n wallet: WalletAdapter,\n connection: Connection,\n): Promise<string> {\n if (!wallet.publicKey) throw new Error('Wallet not connected');\n\n const binaryStr = atob(base64Tx);\n const bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n const transaction = Transaction.from(bytes);\n\n // Prefer signAndSendTransaction if wallet supports it (e.g. MWA)\n if (wallet.signAndSendTransaction) {\n return wallet.signAndSendTransaction(transaction);\n }\n\n // Fallback: sign via wallet, then send via RPC\n const signed = await wallet.signTransaction(transaction);\n const signature = await connection.sendRawTransaction(signed.serialize());\n return signature;\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { JoinGameParams, MutationStatus } from '../types';\n\nexport interface JoinGameMutationResult {\n gameId: string;\n gameAddress: string;\n signature: string;\n explorerUrl: string;\n}\n\nexport function useJoinGame() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<JoinGameMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: JoinGameParams): Promise<JoinGameMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned transaction\n console.log('[useJoinGame] Step 1: Building transaction...', { gameId: params.gameId, playerWallet: params.playerWallet, teamChoice: params.teamChoice, amount: params.amount });\n const joinResult = await client.joinGame(params);\n console.log('[useJoinGame] Step 1 done:', { gameId: joinResult.gameId, gameAddress: joinResult.gameAddress, hasTx: !!joinResult.transaction });\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useJoinGame] Step 2: Signing and sending transaction...');\n const signature = await signAndSendBase64Transaction(\n joinResult.transaction,\n wallet,\n connection,\n );\n console.log('[useJoinGame] Step 2 done. Signature:', signature);\n\n // 3. Confirm with backend (server handles on-chain verification)\n setStatus('confirming');\n const confirmParams = {\n gameId: params.gameId,\n playerWallet: params.playerWallet,\n signature,\n teamChoice: params.teamChoice,\n wagerAmount: params.amount,\n role: 'joiner' as const,\n gameAddress: joinResult.gameAddress,\n };\n console.log('[useJoinGame] Step 3: Confirming with backend...', confirmParams);\n const confirmResult = await client.confirmGame(confirmParams);\n console.log('[useJoinGame] Step 3 done. Backend confirmed.');\n\n const result: JoinGameMutationResult = {\n gameId: params.gameId,\n gameAddress: joinResult.gameAddress,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useJoinGame] Complete!');\n return result;\n } catch (err) {\n console.error('[useJoinGame] FAILED at status:', status, err);\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { BuildClaimParams, MutationStatus } from '../types';\n\nexport interface ClaimMutationResult {\n gameId: string;\n signature: string;\n explorerUrl: string;\n}\n\nexport function useClaim() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<ClaimMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: BuildClaimParams & { amountClaimed?: number }): Promise<ClaimMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned claim transaction\n console.log('[useClaim] Step 1: Building claim transaction...');\n const claimResult = await client.buildClaimTransaction(params);\n console.log('[useClaim] Step 1 done.');\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useClaim] Step 2: Signing and sending...');\n const signature = await signAndSendBase64Transaction(\n claimResult.transaction,\n wallet,\n connection,\n );\n console.log('[useClaim] Step 2 done. Signature:', signature);\n\n // 3. Confirm claim with backend (records signature + amount in DB)\n setStatus('confirming');\n console.log('[useClaim] Step 3: Confirming claim...');\n const confirmResult = await client.confirmClaim(params.gameId, {\n playerWallet: params.playerWallet,\n signature,\n amountClaimed: params.amountClaimed,\n });\n console.log('[useClaim] Step 3 done.');\n\n const result: ClaimMutationResult = {\n gameId: params.gameId,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useClaim] Complete!');\n return result;\n } catch (err: any) {\n console.error('[useClaim] ===== CLAIM ERROR DUMP =====');\n console.error('[useClaim] typeof:', typeof err);\n console.error('[useClaim] value:', err);\n console.error('[useClaim] message:', err?.message);\n console.error('[useClaim] name:', err?.name);\n console.error('[useClaim] code:', err?.code);\n console.error('[useClaim] cause:', err?.cause);\n console.error('[useClaim] stack:', err?.stack);\n console.error('[useClaim] JSON:', (() => { try { return JSON.stringify(err, Object.getOwnPropertyNames(err ?? {})); } catch { return 'unstringifiable'; } })());\n console.error('[useClaim] ===== END DUMP =====');\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { CreateCustomGameParams, MutationStatus } from '../types';\n\nexport interface CreateCustomGameMutationResult {\n gameId: string;\n gameAddress: string;\n signature: string;\n explorerUrl: string;\n buyIn: number;\n}\n\nexport function useCreateCustomGame() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<CreateCustomGameMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: CreateCustomGameParams): Promise<CreateCustomGameMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned transaction\n console.log('[useCreateCustomGame] Step 1: Building transaction...');\n const createResult = await client.createCustomGame(params);\n console.log('[useCreateCustomGame] Step 1 done:', { gameId: createResult.gameId, gameAddress: createResult.gameAddress });\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useCreateCustomGame] Step 2: Signing and sending...');\n const signature = await signAndSendBase64Transaction(\n createResult.transaction,\n wallet,\n connection,\n );\n console.log('[useCreateCustomGame] Step 2 done. Signature:', signature);\n\n // 3. Confirm with backend\n setStatus('confirming');\n console.log('[useCreateCustomGame] Step 3: Confirming with backend...');\n const confirmResult = await client.confirmCustomGame({\n gameId: createResult.gameId,\n playerWallet: params.playerWallet,\n signature,\n teamChoice: params.teamChoice,\n wagerAmount: params.wagerAmount,\n role: 'creator',\n gameAddress: createResult.gameAddress,\n });\n console.log('[useCreateCustomGame] Step 3 done.');\n\n const result: CreateCustomGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n buyIn: params.wagerAmount,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useCreateCustomGame] Complete!');\n return result;\n } catch (err) {\n console.error('[useCreateCustomGame] FAILED:', err);\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { useState, useEffect } from 'react';\nimport { useDubs } from '../provider';\n\nexport interface ClaimStatus {\n /** Whether the current wallet has claimed this game's prize */\n hasClaimed: boolean;\n /** Amount claimed (null if not claimed) */\n amountClaimed: number | null;\n /** Claim transaction signature (null if not claimed) */\n claimSignature: string | null;\n /** Whether the game has been resolved */\n isResolved: boolean;\n /** Loading state */\n loading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Re-fetch claim status */\n refetch: () => void;\n}\n\n/**\n * Check whether the current wallet has already claimed a prize for a game.\n *\n * Uses the game detail endpoint which includes per-bettor claim data.\n */\nexport function useHasClaimed(gameId: string | null): ClaimStatus {\n const { client, wallet } = useDubs();\n const [hasClaimed, setHasClaimed] = useState(false);\n const [amountClaimed, setAmountClaimed] = useState<number | null>(null);\n const [claimSignature, setClaimSignature] = useState<string | null>(null);\n const [isResolved, setIsResolved] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [trigger, setTrigger] = useState(0);\n\n const refetch = () => setTrigger(t => t + 1);\n\n useEffect(() => {\n if (!gameId || !wallet.publicKey) {\n setHasClaimed(false);\n setAmountClaimed(null);\n setClaimSignature(null);\n setIsResolved(false);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n client\n .getGame(gameId)\n .then(game => {\n if (cancelled) return;\n setIsResolved(game.isResolved);\n\n const myWallet = wallet.publicKey!.toBase58();\n const myBet = game.bettors?.find(b => b.wallet === myWallet);\n\n if (myBet?.amountClaimed != null && myBet.amountClaimed > 0) {\n setHasClaimed(true);\n setAmountClaimed(myBet.amountClaimed);\n setClaimSignature(myBet.claimSignature ?? null);\n } else {\n setHasClaimed(false);\n setAmountClaimed(null);\n setClaimSignature(null);\n }\n })\n .catch(err => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [gameId, wallet.publicKey, client, trigger]);\n\n return { hasClaimed, amountClaimed, claimSignature, isResolved, loading, error, refetch };\n}\n","import { useState, useCallback, useRef, useContext } from 'react';\nimport bs58 from 'bs58';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport { useDisconnect } from '../managed-wallet';\nimport { getDeviceInfo } from '../utils/device';\nimport type { AuthStatus, DubsUser } from '../types';\nimport { ensurePngAvatar } from '../utils/avatarUrl';\n\nexport interface UseAuthResult {\n /** Current auth status */\n status: AuthStatus;\n /** Authenticated user profile, or null */\n user: DubsUser | null;\n /** JWT token, or null */\n token: string | null;\n /** Convenience boolean */\n isAuthenticated: boolean;\n /** Error from the last operation, or null */\n error: Error | null;\n\n /**\n * Full nonce → sign → verify flow.\n * If the wallet is already registered, resolves to authenticated state.\n * If new wallet, resolves to needsRegistration state — call register() next.\n */\n authenticate: () => Promise<void>;\n\n /**\n * Register a new user after authenticate() returned needsRegistration.\n * Reuses the nonce+signature from authenticate() — no second signing prompt.\n */\n register: (username: string, referralCode?: string, avatarUrl?: string) => Promise<void>;\n\n /** Log out and clear state */\n logout: () => Promise<void>;\n\n /**\n * Restore a session from a saved token (e.g. AsyncStorage on app restart).\n * Calls GET /auth/me to validate. Returns true if valid, false otherwise.\n */\n restoreSession: (token: string) => Promise<boolean>;\n\n /** Re-fetch user profile from the server (e.g. after avatar change) */\n refreshUser: () => Promise<void>;\n\n /** Reset to idle state, clearing errors and user */\n reset: () => void;\n}\n\nexport function useAuth(): UseAuthResult {\n // If inside AuthGate, return the shared auth state\n const sharedAuth = useContext(AuthContext);\n\n const { client, wallet } = useDubs();\n const disconnect = useDisconnect();\n const [status, setStatus] = useState<AuthStatus>('idle');\n const [user, setUser] = useState<DubsUser | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n // Stash nonce+signature+deviceInfo between authenticate → register (single-sign flow)\n const pendingAuth = useRef<{\n walletAddress: string;\n nonce: string;\n signature: string;\n deviceInfo?: import('../utils/device').DeviceInfo;\n } | null>(null);\n\n const normalizeUser = (u: DubsUser): DubsUser => ({\n ...u,\n avatar: ensurePngAvatar(u.avatar) ?? u.avatar,\n });\n\n const reset = useCallback(() => {\n setStatus('idle');\n setUser(null);\n setToken(null);\n setError(null);\n pendingAuth.current = null;\n client.setToken(null);\n }, [client]);\n\n const authenticate = useCallback(async () => {\n try {\n if (!wallet.publicKey) {\n throw new Error('Wallet not connected');\n }\n if (!wallet.signMessage) {\n throw new Error('Wallet does not support signMessage');\n }\n\n setStatus('authenticating');\n setError(null);\n\n const walletAddress = wallet.publicKey.toBase58();\n\n // 0. Collect device info\n const deviceInfo = await getDeviceInfo();\n console.log('[useAuth] Device info:', JSON.stringify(deviceInfo, null, 2));\n\n // 1. Get nonce\n const { nonce, message } = await client.getNonce(walletAddress);\n\n // 2. Sign message\n setStatus('signing');\n const messageBytes = new TextEncoder().encode(message);\n const signatureBytes = await wallet.signMessage!(messageBytes);\n\n const signature = bs58.encode(signatureBytes);\n\n // 3. Verify with server\n setStatus('verifying');\n const result = await client.authenticate({ walletAddress, signature, nonce, deviceInfo });\n\n if (result.needsRegistration) {\n // Stash credentials for register() — nonce is NOT consumed\n pendingAuth.current = { walletAddress, nonce, signature, deviceInfo };\n setStatus('needsRegistration');\n return;\n }\n\n // Existing user — fully authenticated\n setUser(normalizeUser(result.user!));\n setToken(result.token!);\n setStatus('authenticated');\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // Phantom 4100 = stale/revoked session — clear it and return to connect screen\n if (message.includes('4100') || message.includes('not been authorized')) {\n console.log('[useAuth] Stale Phantom session detected (4100), forcing disconnect');\n await disconnect?.();\n setStatus('idle');\n setError(null);\n return;\n }\n setError(err instanceof Error ? err : new Error(message));\n setStatus('error');\n }\n }, [client, wallet, disconnect]);\n\n const register = useCallback(async (username: string, referralCode?: string, avatarUrl?: string) => {\n try {\n const pending = pendingAuth.current;\n if (!pending) {\n throw new Error('No pending authentication — call authenticate() first');\n }\n\n setStatus('registering');\n setError(null);\n\n const result = await client.register({\n walletAddress: pending.walletAddress,\n signature: pending.signature,\n nonce: pending.nonce,\n username,\n referralCode,\n avatarUrl,\n deviceInfo: pending.deviceInfo,\n });\n\n pendingAuth.current = null;\n // Use the chosen avatar locally if the backend didn't store it\n const user = avatarUrl && !result.user.avatar\n ? { ...result.user, avatar: avatarUrl }\n : result.user;\n setUser(normalizeUser(user));\n setToken(result.token);\n setStatus('authenticated');\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setStatus('error');\n }\n }, [client]);\n\n const logout = useCallback(async () => {\n try {\n await client.logout();\n } catch {\n // Ignore logout errors — clear state regardless\n }\n setUser(null);\n setToken(null);\n setStatus('idle');\n setError(null);\n pendingAuth.current = null;\n }, [client]);\n\n const restoreSession = useCallback(async (savedToken: string): Promise<boolean> => {\n try {\n client.setToken(savedToken);\n const me = await client.getMe();\n setUser(normalizeUser(me));\n setToken(savedToken);\n setStatus('authenticated');\n return true;\n } catch {\n client.setToken(null);\n setUser(null);\n setToken(null);\n setStatus('idle');\n return false;\n }\n }, [client]);\n\n const refreshUser = useCallback(async () => {\n try {\n const me = await client.getMe();\n setUser(normalizeUser(me));\n } catch {\n // Silent failure — keep existing user state\n }\n }, [client]);\n\n // If shared context exists (inside AuthGate), prefer it over local state\n if (sharedAuth) return sharedAuth;\n\n return {\n status,\n user,\n token,\n isAuthenticated: status === 'authenticated',\n error,\n authenticate,\n register,\n logout,\n restoreSession,\n refreshUser,\n reset,\n };\n}\n","import { createContext } from 'react';\nimport type { UseAuthResult } from './hooks/useAuth';\n\n/**\n * Shared auth context provided by AuthGate.\n * When useAuth() is called inside an AuthGate, it reads from this context\n * so all components share the same auth state.\n */\nexport const AuthContext = createContext<UseAuthResult | null>(null);\n","import { Platform } from 'react-native';\n\nexport interface DeviceInfo {\n platform: string;\n modelName: string | null;\n brand: string | null;\n manufacturer: string | null;\n osName: string | null;\n osVersion: string | null;\n deviceType: number | null;\n deviceName: string | null;\n totalMemory: number | null;\n modelId: string | null;\n designName: string | null;\n productName: string | null;\n isDevice: boolean | null;\n}\n\n/**\n * Detect Solana Seeker device (synchronous — safe to call during render).\n * Checks brand from expo-device; returns false if expo-device isn't installed.\n */\nexport function isSolanaSeeker(): boolean {\n try {\n const Device = require('expo-device');\n return Device.brand?.toLowerCase() === 'solanamobile';\n } catch {\n return false;\n }\n}\n\nexport async function getDeviceInfo(): Promise<DeviceInfo> {\n try {\n const Device = require('expo-device');\n return {\n platform: Platform.OS,\n modelName: Device.modelName,\n brand: Device.brand,\n manufacturer: Device.manufacturer,\n osName: Device.osName,\n osVersion: Device.osVersion,\n deviceType: Device.deviceType,\n deviceName: Device.deviceName,\n totalMemory: Device.totalMemory,\n modelId: Device.modelId,\n designName: Device.designName,\n productName: Device.productName,\n isDevice: Device.isDevice,\n };\n } catch {\n // expo-device not installed — return minimal info\n return {\n platform: Platform.OS,\n modelName: null,\n brand: null,\n manufacturer: null,\n osName: null,\n osVersion: null,\n deviceType: null,\n deviceName: null,\n totalMemory: null,\n modelId: null,\n designName: null,\n productName: null,\n isDevice: null,\n };\n }\n}\n","/**\n * Ensure a DiceBear avatar URL uses PNG format for React Native compatibility.\n * React Native's Image component cannot render SVGs.\n * This converts at render time only — the stored URL in the DB is never modified.\n */\nexport function ensurePngAvatar(url: string | null | undefined): string | undefined {\n if (!url) return undefined;\n return url.replace('/svg?', '/png?');\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UFCEvent, QueryResult } from '../types';\n\nexport function useUFCFightCard(): QueryResult<UFCEvent[]> {\n const { client } = useDubs();\n const [data, setData] = useState<UFCEvent[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.getUFCFightCard();\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UFCFighterDetail, QueryResult } from '../types';\n\nexport function useUFCFighterDetail(athleteId: string | null): QueryResult<UFCFighterDetail> {\n const { client } = useDubs();\n const [data, setData] = useState<UFCFighterDetail | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!athleteId) {\n setData(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await client.getUFCFighterDetail(athleteId);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, athleteId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useCallback, useRef, useMemo, useEffect } from 'react';\nimport { Platform } from 'react-native';\nimport { useDubs } from '../provider';\n\nexport interface PushNotificationStatus {\n /** Whether push notifications are enabled in the SDK configuration */\n enabled: boolean;\n /** Whether notification permission has been granted */\n hasPermission: boolean;\n /** The push token (native FCM/APNs), if registered */\n pushToken: string | null;\n /**\n * @deprecated Use pushToken instead. Kept for backwards compatibility.\n */\n expoPushToken: string | null;\n /** Whether a registration operation is in progress */\n loading: boolean;\n /** The last error encountered */\n error: Error | null;\n /**\n * Request notification permission and register the push token.\n * Does NOT auto-prompt — must be called explicitly (e.g. from an onboarding screen).\n */\n register: () => Promise<boolean>;\n /** Unregister the current push token */\n unregister: () => Promise<void>;\n /**\n * Silently re-register if permission was already granted (no prompt).\n * Safe to call on app startup for returning users.\n */\n restoreIfGranted: () => Promise<void>;\n}\n\nexport function usePushNotifications(): PushNotificationStatus {\n const { client, appName, pushEnabled } = useDubs();\n const channelId = useMemo(() => appName.toLowerCase().replace(/[^a-z0-9-]/g, ''), [appName]);\n const [hasPermission, setHasPermission] = useState(false);\n const [pushToken, setPushToken] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const registering = useRef(false);\n\n const getNotificationsModule = useCallback(() => {\n try {\n return require('expo-notifications');\n } catch {\n return null;\n }\n }, []);\n\n const getDeviceName = useCallback((): string | null => {\n try {\n const Device = require('expo-device');\n return Device.deviceName || null;\n } catch {\n return null;\n }\n }, []);\n\n const setupAndroidChannels = useCallback((Notifications: any) => {\n if (Platform.OS === 'android') {\n Notifications.setNotificationChannelAsync(channelId || 'default', {\n name: appName || 'Default',\n importance: Notifications.AndroidImportance?.MAX ?? 4,\n vibrationPattern: [0, 250, 250, 250],\n }).catch(() => {});\n }\n }, [channelId, appName]);\n\n const registerTokenWithServer = useCallback(async (token: string) => {\n const deviceName = getDeviceName();\n await client.registerPushToken({\n token,\n platform: Platform.OS,\n deviceName: deviceName || undefined,\n });\n }, [client, getDeviceName]);\n\n const register = useCallback(async (): Promise<boolean> => {\n if (!pushEnabled) return false;\n if (registering.current) return false;\n registering.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const Notifications = getNotificationsModule();\n if (!Notifications) {\n throw new Error('expo-notifications is not installed');\n }\n\n // Request permission\n const { status: existingStatus } = await Notifications.getPermissionsAsync();\n let finalStatus = existingStatus;\n\n if (existingStatus !== 'granted') {\n const { status } = await Notifications.requestPermissionsAsync();\n finalStatus = status;\n }\n\n if (finalStatus !== 'granted') {\n setHasPermission(false);\n setLoading(false);\n registering.current = false;\n return false;\n }\n\n setHasPermission(true);\n\n // Get native device push token (FCM on Android, APNs on iOS)\n const tokenResult = await Notifications.getDevicePushTokenAsync();\n const token = tokenResult.data;\n setPushToken(token);\n\n // Register with server\n await registerTokenWithServer(token);\n\n // Setup Android channels\n setupAndroidChannels(Notifications);\n\n setLoading(false);\n registering.current = false;\n return true;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setLoading(false);\n registering.current = false;\n console.error('[usePushNotifications] Registration error:', e.message);\n return false;\n }\n }, [getNotificationsModule, registerTokenWithServer, setupAndroidChannels]);\n\n const unregister = useCallback(async () => {\n if (!pushToken) return;\n try {\n await client.unregisterPushToken(pushToken);\n setPushToken(null);\n } catch (err) {\n console.error('[usePushNotifications] Unregister error:', err);\n }\n }, [client, pushToken]);\n\n const restoreIfGranted = useCallback(async () => {\n if (!pushEnabled) return;\n try {\n const Notifications = getNotificationsModule();\n if (!Notifications) return;\n\n const { status } = await Notifications.getPermissionsAsync();\n if (status !== 'granted') return;\n\n // Get native device push token (FCM on Android, APNs on iOS)\n const tokenResult = await Notifications.getDevicePushTokenAsync();\n const token = tokenResult.data;\n\n // Register with server — only mark as enabled if this succeeds\n await registerTokenWithServer(token);\n setPushToken(token);\n setHasPermission(true);\n setupAndroidChannels(Notifications);\n } catch (err) {\n // Server registration failed — don't show as enabled\n setHasPermission(false);\n console.log('[usePushNotifications] Restore skipped:', err instanceof Error ? err.message : err);\n }\n }, [getNotificationsModule, registerTokenWithServer, setupAndroidChannels]);\n\n // On mount, set up foreground notification handler and restore push state\n const didMount = useRef(false);\n useEffect(() => {\n if (didMount.current) return;\n didMount.current = true;\n\n const Notifications = getNotificationsModule();\n if (Notifications) {\n // Show notifications even when app is in the foreground\n Notifications.setNotificationHandler({\n handleNotification: async () => ({\n shouldShowAlert: true,\n shouldPlaySound: true,\n shouldSetBadge: false,\n }),\n });\n }\n\n restoreIfGranted();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n enabled: pushEnabled,\n hasPermission,\n pushToken,\n expoPushToken: pushToken, // backwards compat\n loading,\n error,\n register,\n unregister,\n restoreIfGranted,\n };\n}\n","import React, { useMemo } from 'react';\nimport { View, Text, Image, StyleSheet } from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { ensurePngAvatar } from '../utils/avatarUrl';\n\nexport interface UserProfileCardProps {\n walletAddress: string;\n username?: string;\n avatarUrl?: string | null;\n memberSince?: string | null;\n}\n\nfunction truncateAddress(address: string, chars = 4): string {\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\nfunction formatMemberSince(iso: string): string {\n const date = new Date(iso);\n const month = date.toLocaleString('en-US', { month: 'short' });\n const year = date.getFullYear();\n return `Member since ${month} ${year}`;\n}\n\nexport function UserProfileCard({\n walletAddress,\n username,\n avatarUrl,\n memberSince,\n}: UserProfileCardProps) {\n const t = useDubsTheme();\n\n const imageUri = useMemo(\n () =>\n ensurePngAvatar(avatarUrl) ||\n `https://api.dicebear.com/9.x/avataaars/png?seed=${walletAddress}&size=128`,\n [avatarUrl, walletAddress],\n );\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Image source={{ uri: imageUri }} style={styles.avatar} />\n <View style={styles.info}>\n {username ? (\n <Text style={[styles.username, { color: t.text }]}>{username}</Text>\n ) : null}\n <Text style={[styles.address, { color: t.textMuted }]}>\n {truncateAddress(walletAddress)}\n </Text>\n {memberSince ? (\n <Text style={[styles.memberSince, { color: t.textDim }]}>\n {formatMemberSince(memberSince)}\n </Text>\n ) : null}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 16,\n borderRadius: 16,\n borderWidth: 1,\n gap: 14,\n },\n avatar: {\n width: 64,\n height: 64,\n borderRadius: 32,\n backgroundColor: '#1A1A24',\n },\n info: {\n flex: 1,\n gap: 2,\n },\n username: {\n fontSize: 18,\n fontWeight: '700',\n },\n address: {\n fontSize: 14,\n fontFamily: 'monospace',\n },\n memberSince: {\n fontSize: 12,\n marginTop: 2,\n },\n});\n","import React from 'react';\nimport {\n View,\n Text,\n ScrollView,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { UserProfileCard } from './UserProfileCard';\n\nexport interface SettingsSheetProps {\n walletAddress: string;\n username?: string;\n avatarUrl?: string | null;\n memberSince?: string | null;\n appVersion?: string;\n onCopyAddress?: () => void;\n onSupport?: () => void;\n onLogout: () => void | Promise<void>;\n loggingOut?: boolean;\n}\n\nfunction truncateAddress(address: string, chars = 4): string {\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\nexport function SettingsSheet({\n walletAddress,\n username,\n avatarUrl,\n memberSince,\n appVersion,\n onCopyAddress,\n onSupport,\n onLogout,\n loggingOut = false,\n}: SettingsSheetProps) {\n const t = useDubsTheme();\n\n return (\n <ScrollView\n style={[styles.container, { backgroundColor: t.background }]}\n contentContainerStyle={styles.content}\n >\n {/* Profile card */}\n <UserProfileCard\n walletAddress={walletAddress}\n username={username}\n avatarUrl={avatarUrl}\n memberSince={memberSince}\n />\n\n {/* Action rows */}\n <View style={[styles.actionsCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n {onCopyAddress ? (\n <TouchableOpacity\n style={styles.actionRow}\n onPress={onCopyAddress}\n activeOpacity={0.7}\n >\n <View style={styles.actionRowLeft}>\n <Text style={[styles.actionLabel, { color: t.text }]}>Wallet Address</Text>\n <Text style={[styles.actionValue, { color: t.textMuted }]}>\n {truncateAddress(walletAddress)}\n </Text>\n </View>\n <Text style={[styles.copyLabel, { color: t.accent }]}>Copy</Text>\n </TouchableOpacity>\n ) : null}\n\n {onSupport ? (\n <>\n {onCopyAddress ? (\n <View style={[styles.separator, { backgroundColor: t.border }]} />\n ) : null}\n <TouchableOpacity\n style={styles.actionRow}\n onPress={onSupport}\n activeOpacity={0.7}\n >\n <Text style={[styles.actionLabel, { color: t.text }]}>Help & Support</Text>\n <Text style={[styles.chevron, { color: t.textMuted }]}>{'\\u203A'}</Text>\n </TouchableOpacity>\n </>\n ) : null}\n </View>\n\n {/* Logout button */}\n <TouchableOpacity\n style={[styles.logoutButton, { borderColor: t.live }]}\n onPress={onLogout}\n disabled={loggingOut}\n activeOpacity={0.7}\n >\n {loggingOut ? (\n <ActivityIndicator color={t.live} size=\"small\" />\n ) : (\n <Text style={[styles.logoutText, { color: t.live }]}>Log Out</Text>\n )}\n </TouchableOpacity>\n\n {/* App version */}\n {appVersion ? (\n <Text style={[styles.version, { color: t.textDim }]}>v{appVersion}</Text>\n ) : null}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n content: {\n padding: 20,\n paddingTop: 24,\n gap: 20,\n },\n actionsCard: {\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n actionRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n actionRowLeft: {\n flex: 1,\n gap: 2,\n },\n actionLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n actionValue: {\n fontSize: 13,\n fontFamily: 'monospace',\n },\n copyLabel: {\n fontSize: 14,\n fontWeight: '600',\n },\n chevron: {\n fontSize: 22,\n fontWeight: '300',\n },\n separator: {\n height: 1,\n marginHorizontal: 16,\n },\n logoutButton: {\n height: 52,\n borderRadius: 16,\n borderWidth: 1.5,\n justifyContent: 'center',\n alignItems: 'center',\n },\n logoutText: {\n fontSize: 16,\n fontWeight: '700',\n },\n version: {\n fontSize: 12,\n textAlign: 'center',\n },\n});\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n Image,\n ScrollView,\n Dimensions,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { useDubs } from '../provider';\nimport { usePushNotifications } from '../hooks/usePushNotifications';\nimport { ensurePngAvatar } from '../utils/avatarUrl';\n\n// ── Avatar Helpers ──\n\nconst DICEBEAR_STYLES = [\n 'adventurer',\n 'avataaars',\n 'fun-emoji',\n 'bottts',\n 'big-smile',\n 'thumbs',\n];\n\nconst BG_COLORS = [\n '1a1a2e', 'f43f5e', 'f97316', 'eab308', '22c55e',\n '3b82f6', '8b5cf6', 'ec4899', '06b6d4', '64748b',\n];\n\nfunction generateSeed(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction getAvatarUrl(style: string, seed: string, bg = '1a1a2e', size = 256): string {\n return `https://api.dicebear.com/9.x/${style}/png?seed=${seed}&backgroundColor=${bg}&size=${size}`;\n}\n\n/** Parse style, seed, and backgroundColor from a DiceBear URL, or return defaults. */\nfunction parseAvatarUrl(url?: string | null): { style: string; seed: string; bg: string } {\n if (!url) return { style: 'adventurer', seed: generateSeed(), bg: '1a1a2e' };\n try {\n const match = url.match(/\\/\\d+\\.x\\/([^/]+)\\/(?:png|svg)\\?seed=([^&]+)/);\n if (match) {\n const bgMatch = url.match(/backgroundColor=([^&]+)/);\n return { style: match[1], seed: match[2], bg: bgMatch?.[1] || '1a1a2e' };\n }\n } catch {}\n return { style: 'adventurer', seed: generateSeed(), bg: '1a1a2e' };\n}\n\nfunction truncateAddress(address: string, chars = 4): string {\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\n// ── Props ──\n\nexport interface UserProfileSheetProps {\n visible: boolean;\n onDismiss: () => void;\n user: {\n walletAddress: string;\n username?: string;\n avatar?: string | null;\n createdAt?: string;\n };\n onAvatarUpdated?: (newAvatarUrl: string) => void;\n onDisconnect?: () => void;\n}\n\nexport function UserProfileSheet({\n visible,\n onDismiss,\n user,\n onAvatarUpdated,\n onDisconnect,\n}: UserProfileSheetProps) {\n const t = useDubsTheme();\n const { client } = useDubs();\n const push = usePushNotifications();\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n const parsed = useMemo(() => parseAvatarUrl(user.avatar), [user.avatar]);\n const [avatarStyle, setAvatarStyle] = useState(parsed.style);\n const [avatarSeed, setAvatarSeed] = useState(parsed.seed);\n const [bgColor, setBgColor] = useState(parsed.bg);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Re-sync when user prop changes\n useEffect(() => {\n const p = parseAvatarUrl(user.avatar);\n setAvatarStyle(p.style);\n setAvatarSeed(p.seed);\n setBgColor(p.bg);\n }, [user.avatar]);\n\n // Animate overlay\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset error when sheet opens\n useEffect(() => {\n if (visible) setError(null);\n }, [visible]);\n\n const currentAvatarUrl = getAvatarUrl(avatarStyle, avatarSeed, bgColor);\n\n const saveAvatar = useCallback(async (newUrl: string) => {\n setSaving(true);\n setError(null);\n try {\n await client.updateProfile({ avatar: newUrl });\n onAvatarUpdated?.(newUrl);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update avatar');\n } finally {\n setSaving(false);\n }\n }, [client, onAvatarUpdated]);\n\n const handleSelectStyle = useCallback(\n (style: string) => {\n setAvatarStyle(style);\n saveAvatar(getAvatarUrl(style, avatarSeed, bgColor));\n },\n [avatarSeed, bgColor, saveAvatar],\n );\n\n const handleShuffle = useCallback(() => {\n const newSeed = generateSeed();\n setAvatarSeed(newSeed);\n saveAvatar(getAvatarUrl(avatarStyle, newSeed, bgColor));\n }, [avatarStyle, bgColor, saveAvatar]);\n\n const handleSelectBgColor = useCallback(\n (color: string) => {\n setBgColor(color);\n saveAvatar(getAvatarUrl(avatarStyle, avatarSeed, color));\n },\n [avatarStyle, avatarSeed, saveAvatar],\n );\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>Profile</Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n <ScrollView\n style={styles.scrollContent}\n contentContainerStyle={styles.scrollContentInner}\n showsVerticalScrollIndicator={false}\n bounces={false}\n >\n {/* Avatar section */}\n <View style={styles.avatarSection}>\n <View style={[styles.avatarContainer, { borderColor: t.border }]}>\n <Image\n source={{ uri: currentAvatarUrl }}\n style={styles.avatar}\n />\n {saving && (\n <View style={styles.avatarLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n </View>\n )}\n </View>\n {user.username ? (\n <Text style={[styles.username, { color: t.text }]}>{user.username}</Text>\n ) : null}\n <Text style={[styles.walletAddress, { color: t.textMuted }]}>\n {truncateAddress(user.walletAddress, 6)}\n </Text>\n </View>\n\n {/* Change Avatar */}\n <View style={styles.section}>\n <View style={styles.sectionHeaderRow}>\n <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>\n Change Avatar\n </Text>\n <TouchableOpacity\n style={[styles.shuffleButton, { borderColor: t.border }]}\n onPress={handleShuffle}\n activeOpacity={0.7}\n disabled={saving}\n >\n <Text style={[styles.shuffleText, { color: t.accent }]}>Shuffle</Text>\n </TouchableOpacity>\n </View>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.stylePickerContent}\n >\n {DICEBEAR_STYLES.map((style) => {\n const isSelected = style === avatarStyle;\n return (\n <TouchableOpacity\n key={style}\n onPress={() => handleSelectStyle(style)}\n activeOpacity={0.7}\n disabled={saving}\n style={[\n styles.styleTile,\n {\n borderColor: isSelected ? t.accent : t.border,\n borderWidth: isSelected ? 2 : 1,\n },\n ]}\n >\n <Image\n source={{ uri: getAvatarUrl(style, avatarSeed, bgColor, 80) }}\n style={styles.styleTileImage}\n />\n </TouchableOpacity>\n );\n })}\n </ScrollView>\n\n {/* Background color picker */}\n <Text style={[styles.sectionLabel, { color: t.textSecondary, marginTop: 4 }]}>\n Background Color\n </Text>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.colorPickerContent}\n >\n {BG_COLORS.map((color) => {\n const isSelected = color === bgColor;\n return (\n <TouchableOpacity\n key={color}\n onPress={() => handleSelectBgColor(color)}\n activeOpacity={0.7}\n disabled={saving}\n style={[\n styles.colorSwatch,\n { backgroundColor: `#${color}` },\n isSelected && { borderColor: t.accent, borderWidth: 2.5 },\n ]}\n />\n );\n })}\n </ScrollView>\n </View>\n\n {/* Error */}\n {error ? (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{error}</Text>\n </View>\n ) : null}\n\n {/* Push Notifications */}\n {push.enabled && (\n <View style={[styles.notifRow, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.notifLeft}>\n <Text style={[styles.notifLabel, { color: t.text }]}>Push Notifications</Text>\n <Text\n style={[\n styles.notifStatus,\n { color: push.hasPermission ? t.success : t.textMuted },\n ]}\n >\n {push.hasPermission ? 'Enabled' : 'Disabled'}\n </Text>\n </View>\n {!push.hasPermission && (\n <TouchableOpacity\n style={[styles.enableButton, { backgroundColor: t.accent }]}\n onPress={push.register}\n disabled={push.loading}\n activeOpacity={0.8}\n >\n {push.loading ? (\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n ) : (\n <Text style={styles.enableText}>Enable</Text>\n )}\n </TouchableOpacity>\n )}\n </View>\n )}\n\n {/* Push error */}\n {push.enabled && push.error ? (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{push.error.message}</Text>\n </View>\n ) : null}\n\n {/* Disconnect */}\n {onDisconnect ? (\n <TouchableOpacity\n style={[styles.disconnectButton, { borderColor: t.live }]}\n onPress={onDisconnect}\n activeOpacity={0.7}\n >\n <Text style={[styles.disconnectText, { color: t.live }]}>Disconnect Wallet</Text>\n </TouchableOpacity>\n ) : null}\n </ScrollView>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 0,\n height: Dimensions.get('window').height * 0.7,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n scrollContent: {\n flexGrow: 0,\n },\n scrollContentInner: {\n paddingBottom: 8,\n },\n // Avatar\n avatarSection: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 20,\n gap: 8,\n },\n avatarContainer: {\n width: 120,\n height: 120,\n borderRadius: 60,\n borderWidth: 2,\n overflow: 'hidden',\n },\n avatar: {\n width: '100%',\n height: '100%',\n backgroundColor: '#1a1a2e',\n },\n avatarLoading: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n username: {\n fontSize: 18,\n fontWeight: '700',\n },\n walletAddress: {\n fontSize: 13,\n fontFamily: 'monospace',\n },\n // Change Avatar\n section: {\n marginBottom: 20,\n gap: 12,\n },\n sectionHeaderRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n sectionLabel: {\n fontSize: 14,\n fontWeight: '600',\n },\n shuffleButton: {\n paddingHorizontal: 14,\n paddingVertical: 6,\n borderRadius: 12,\n borderWidth: 1,\n },\n shuffleText: {\n fontSize: 13,\n fontWeight: '600',\n },\n stylePickerContent: {\n gap: 10,\n },\n colorPickerContent: {\n gap: 8,\n },\n colorSwatch: {\n width: 32,\n height: 32,\n borderRadius: 16,\n borderWidth: 1.5,\n borderColor: 'rgba(255,255,255,0.15)',\n },\n styleTile: {\n width: 72,\n height: 72,\n borderRadius: 16,\n overflow: 'hidden',\n },\n styleTileImage: {\n width: '100%',\n height: '100%',\n backgroundColor: '#1a1a2e',\n },\n // Error\n errorBox: {\n marginBottom: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n // Push Notifications\n notifRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderRadius: 16,\n borderWidth: 1,\n paddingHorizontal: 16,\n paddingVertical: 14,\n marginBottom: 16,\n },\n notifLeft: {\n gap: 2,\n },\n notifLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n notifStatus: {\n fontSize: 13,\n },\n enableButton: {\n paddingHorizontal: 18,\n paddingVertical: 10,\n borderRadius: 12,\n },\n enableText: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: '700',\n },\n // Disconnect\n disconnectButton: {\n height: 52,\n borderRadius: 16,\n borderWidth: 1.5,\n justifyContent: 'center',\n alignItems: 'center',\n },\n disconnectText: {\n fontSize: 16,\n fontWeight: '700',\n },\n});\n","import { useState } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface GamePosterProps {\n game: GameDetail;\n /** Optional Image component — pass expo-image or RN Image. Defaults to RN Image. */\n ImageComponent?: React.ComponentType<any>;\n}\n\nfunction computeCountdown(lockTimestamp: number | string | null): string {\n if (!lockTimestamp) return '';\n const ts = typeof lockTimestamp === 'string' ? parseInt(lockTimestamp) : lockTimestamp;\n const diff = ts * 1000 - Date.now();\n if (diff <= 0) return 'LIVE';\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n if (days > 0) return `${days}d ${hours}h`;\n if (hours > 0) return `${hours}h ${mins}m`;\n return `${mins}m`;\n}\n\n/**\n * Matchup poster hero widget.\n * Shows the game poster image (or team logo fallback), countdown pill, and pool total.\n */\nexport function GamePoster({ game, ImageComponent }: GamePosterProps) {\n const t = useDubsTheme();\n const Img = ImageComponent || require('react-native').Image;\n\n const opponents = game.opponents || [];\n const home = opponents[0];\n const away = opponents[1];\n const countdown = computeCountdown(game.lockTimestamp);\n const isLive = countdown === 'LIVE';\n\n return (\n <View style={styles.container}>\n {game.media?.poster ? (\n <Img\n source={{ uri: game.media.poster }}\n style={styles.image}\n resizeMode=\"cover\"\n />\n ) : (\n <View style={[styles.image, { backgroundColor: t.surface }]}>\n <View style={styles.fallback}>\n <TeamLogoInternal url={home?.imageUrl} size={56} Img={Img} />\n <Text style={styles.vs}>VS</Text>\n <TeamLogoInternal url={away?.imageUrl} size={56} Img={Img} />\n </View>\n </View>\n )}\n <View style={styles.overlay} />\n\n <View style={styles.teamNames}>\n <Text style={styles.teamNameText} numberOfLines={1}>\n {home?.name || 'Home'}\n </Text>\n <Text style={styles.teamNameVs}>vs</Text>\n <Text style={styles.teamNameText} numberOfLines={1}>\n {away?.name || 'Away'}\n </Text>\n </View>\n\n {countdown ? (\n <View style={styles.countdownPill}>\n <Text style={[styles.countdownText, isLive && styles.countdownLive]}>\n {countdown}\n </Text>\n </View>\n ) : null}\n\n <View style={styles.poolPill}>\n <Text style={styles.poolText}>{game.totalPool || 0} SOL</Text>\n </View>\n </View>\n );\n}\n\nfunction TeamLogoInternal({ url, size, Img }: { url: string | null | undefined; size: number; Img: any }) {\n const [failed, setFailed] = useState(false);\n if (!url || failed) {\n return <View style={[styles.logoPlaceholder, { width: size, height: size, borderRadius: size / 2 }]} />;\n }\n return (\n <Img\n source={{ uri: url }}\n style={{ width: size, height: size, borderRadius: size / 2 }}\n resizeMode=\"contain\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n height: 200,\n borderRadius: 16,\n overflow: 'hidden',\n position: 'relative',\n },\n image: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: 'center',\n alignItems: 'center',\n },\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.35)',\n },\n fallback: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 24,\n zIndex: 2,\n },\n vs: {\n color: '#FFF',\n fontSize: 24,\n fontWeight: '900',\n zIndex: 2,\n },\n logoPlaceholder: {\n backgroundColor: 'rgba(255,255,255,0.15)',\n zIndex: 2,\n },\n teamNames: {\n position: 'absolute',\n top: 12,\n left: 12,\n right: 12,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n },\n teamNameText: {\n color: '#FFF',\n fontSize: 14,\n fontWeight: '700',\n maxWidth: '40%',\n },\n teamNameVs: {\n color: 'rgba(255,255,255,0.6)',\n fontSize: 12,\n fontWeight: '600',\n },\n countdownPill: {\n position: 'absolute',\n bottom: 12,\n left: 12,\n backgroundColor: 'rgba(0,0,0,0.65)',\n borderRadius: 8,\n paddingHorizontal: 10,\n paddingVertical: 5,\n },\n countdownText: {\n color: '#FFF',\n fontSize: 13,\n fontWeight: '700',\n },\n countdownLive: {\n color: '#EF4444',\n },\n poolPill: {\n position: 'absolute',\n bottom: 12,\n right: 12,\n backgroundColor: '#7C3AED',\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 5,\n },\n poolText: {\n color: '#FFF',\n fontSize: 13,\n fontWeight: '800',\n },\n});\n","import { useMemo } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface LivePoolsCardProps {\n game: GameDetail;\n /** Custom short-name function for team labels. Defaults to full name. */\n shortName?: (name: string | null) => string;\n /** Override bar colors. Defaults to blue/red. */\n homeColor?: string;\n awayColor?: string;\n}\n\n/**\n * Pool breakdown card showing each side's SOL amount, bar chart, and implied odds.\n */\nexport function LivePoolsCard({\n game,\n shortName,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n}: LivePoolsCardProps) {\n const t = useDubsTheme();\n\n const opponents = game.opponents || [];\n const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n const homePool = game.homePool || 0;\n const awayPool = game.awayPool || 0;\n const totalPool = game.totalPool || 0;\n\n const { homePercent, awayPercent, homeOdds, awayOdds } = useMemo(() => {\n return {\n homePercent: totalPool > 0 ? (homePool / totalPool) * 100 : 50,\n awayPercent: totalPool > 0 ? (awayPool / totalPool) * 100 : 50,\n homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n };\n }, [homePool, awayPool, totalPool]);\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.title, { color: t.text }]}>Live Pools</Text>\n <Text style={[styles.total, { color: t.accent }]}>{totalPool} SOL total</Text>\n\n <View style={styles.bars}>\n <PoolBar name={homeName} amount={homePool} percent={homePercent} color={homeColor} t={t} />\n <PoolBar name={awayName} amount={awayPool} percent={awayPercent} color={awayColor} t={t} />\n </View>\n\n <View style={styles.oddsRow}>\n <Text style={[styles.oddsText, { color: t.textMuted }]}>\n {homeName}: <Text style={{ color: t.text, fontWeight: '700' }}>{homeOdds}x</Text>\n </Text>\n <Text style={[styles.oddsText, { color: t.textMuted }]}>\n {awayName}: <Text style={{ color: t.text, fontWeight: '700' }}>{awayOdds}x</Text>\n </Text>\n </View>\n </View>\n );\n}\n\nfunction PoolBar({ name, amount, percent, color, t }: { name: string; amount: number; percent: number; color: string; t: any }) {\n return (\n <View style={styles.barRow}>\n <Text style={[styles.barLabel, { color: t.textSecondary }]} numberOfLines={1}>{name}</Text>\n <View style={[styles.barTrack, { backgroundColor: t.border }]}>\n <View style={[styles.barFill, { width: `${Math.max(percent, 2)}%`, backgroundColor: color }]} />\n </View>\n <Text style={[styles.barAmount, { color: t.text }]}>{amount} SOL</Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n title: { fontSize: 17, fontWeight: '700', marginBottom: 4 },\n total: { fontSize: 14, fontWeight: '600', marginBottom: 14 },\n bars: { gap: 10 },\n barRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n barLabel: { width: 80, fontSize: 13, fontWeight: '600' },\n barTrack: { flex: 1, height: 10, borderRadius: 5, overflow: 'hidden' },\n barFill: { height: '100%', borderRadius: 5 },\n barAmount: { width: 70, textAlign: 'right', fontSize: 13, fontWeight: '700' },\n oddsRow: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 12 },\n oddsText: { fontSize: 12 },\n});\n","import { useState, useMemo } from 'react';\nimport { StyleSheet, View, Text, TouchableOpacity } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface PickWinnerCardProps {\n game: GameDetail;\n selectedTeam: 'home' | 'away' | null;\n onSelect: (team: 'home' | 'away') => void;\n /** Custom short-name function for team labels. Defaults to full name. */\n shortName?: (name: string | null) => string;\n /** Override colors. Defaults to blue/red. */\n homeColor?: string;\n awayColor?: string;\n /** Optional Image component (expo-image, etc.). */\n ImageComponent?: React.ComponentType<any>;\n}\n\n/**\n * Team selection card for picking which side to bet on.\n */\nexport function PickWinnerCard({\n game,\n selectedTeam,\n onSelect,\n shortName,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n ImageComponent,\n}: PickWinnerCardProps) {\n const t = useDubsTheme();\n\n const opponents = game.opponents || [];\n const bettors = game.bettors || [];\n const totalPool = game.totalPool || 0;\n const homePool = game.homePool || 0;\n const awayPool = game.awayPool || 0;\n\n const { homeOdds, awayOdds, homeBets, awayBets } = useMemo(() => ({\n homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n homeBets: bettors.filter(b => b.team === 'home').length,\n awayBets: bettors.filter(b => b.team === 'away').length,\n }), [totalPool, homePool, awayPool, bettors]);\n\n const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.title, { color: t.text }]}>Pick Your Winner</Text>\n <View style={styles.row}>\n <TeamOption\n name={homeName}\n imageUrl={opponents[0]?.imageUrl}\n odds={homeOdds}\n bets={homeBets}\n color={homeColor}\n selected={selectedTeam === 'home'}\n onPress={() => onSelect('home')}\n ImageComponent={ImageComponent}\n t={t}\n />\n <TeamOption\n name={awayName}\n imageUrl={opponents[1]?.imageUrl}\n odds={awayOdds}\n bets={awayBets}\n color={awayColor}\n selected={selectedTeam === 'away'}\n onPress={() => onSelect('away')}\n ImageComponent={ImageComponent}\n t={t}\n />\n </View>\n </View>\n );\n}\n\nfunction TeamOption({\n name, imageUrl, odds, bets, color, selected, onPress, ImageComponent, t,\n}: {\n name: string; imageUrl?: string | null; odds: string; bets: number;\n color: string; selected: boolean; onPress: () => void;\n ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n const [imgFailed, setImgFailed] = useState(false);\n const Img = ImageComponent || require('react-native').Image;\n const showImage = imageUrl && !imgFailed;\n\n return (\n <TouchableOpacity\n style={[styles.option, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + '15' : t.background }]}\n onPress={onPress}\n activeOpacity={0.7}\n >\n {showImage ? (\n <Img source={{ uri: imageUrl }} style={styles.logo} resizeMode=\"contain\" onError={() => setImgFailed(true)} />\n ) : (\n <View style={[styles.logo, styles.logoPlaceholder]} />\n )}\n <Text style={[styles.name, { color: t.text }]} numberOfLines={1}>{name}</Text>\n <Text style={[styles.odds, { color }]}>{odds}x</Text>\n <Text style={[styles.bets, { color: t.textMuted }]}>{bets} {bets === 1 ? 'bet' : 'bets'}</Text>\n {selected && (\n <View style={[styles.badge, { backgroundColor: color }]}>\n <Text style={styles.badgeText}>Selected</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n title: { fontSize: 17, fontWeight: '700', marginBottom: 12 },\n row: { flexDirection: 'row', gap: 12 },\n option: { flex: 1, borderWidth: 2, borderRadius: 16, padding: 16, alignItems: 'center', gap: 8 },\n logo: { width: 48, height: 48, borderRadius: 24 },\n logoPlaceholder: { backgroundColor: 'rgba(128,128,128,0.2)' },\n name: { fontSize: 15, fontWeight: '700' },\n odds: { fontSize: 20, fontWeight: '800' },\n bets: { fontSize: 12 },\n badge: { borderRadius: 8, paddingHorizontal: 12, paddingVertical: 4, marginTop: 4 },\n badgeText: { color: '#FFF', fontSize: 12, fontWeight: '700' },\n});\n","import { useState } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { ensurePngAvatar } from '../../utils/avatarUrl';\nimport type { GameDetail } from '../../types';\n\nexport interface PlayersCardProps {\n game: GameDetail;\n /** How many chars to show on each side of a truncated wallet. Default 4. */\n truncateChars?: number;\n /** Override team dot colors. */\n homeColor?: string;\n awayColor?: string;\n drawColor?: string;\n /** Optional Image component (expo-image, etc.). */\n ImageComponent?: React.ComponentType<any>;\n}\n\nfunction truncateWallet(addr: string, chars: number): string {\n if (addr.length <= chars * 2 + 3) return addr;\n return `${addr.slice(0, chars)}...${addr.slice(-chars)}`;\n}\n\n/**\n * Card showing all bettors in a game with their avatar, username, team, and wager amount.\n */\nexport function PlayersCard({\n game,\n truncateChars = 4,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n drawColor = '#A855F7',\n ImageComponent,\n}: PlayersCardProps) {\n const t = useDubsTheme();\n const bettors = game.bettors || [];\n\n const dotColor = (team: 'home' | 'away' | 'draw') => {\n if (team === 'home') return homeColor;\n if (team === 'away') return awayColor;\n return drawColor;\n };\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.title, { color: t.text }]}>\n Players{bettors.length > 0 ? ` (${bettors.length})` : ''}\n </Text>\n\n {bettors.length === 0 ? (\n <Text style={[styles.empty, { color: t.textMuted }]}>No players yet — be the first!</Text>\n ) : (\n bettors.map((b, i) => (\n <BettorRow\n key={`${b.wallet}-${i}`}\n bettor={b}\n dotColor={dotColor(b.team)}\n truncateChars={truncateChars}\n isFirst={i === 0}\n ImageComponent={ImageComponent}\n t={t}\n />\n ))\n )}\n </View>\n );\n}\n\nfunction BettorRow({\n bettor, dotColor, truncateChars, isFirst, ImageComponent, t,\n}: {\n bettor: { wallet: string; username: string | null; avatar: string | null; team: 'home' | 'away' | 'draw'; amount: number };\n dotColor: string; truncateChars: number; isFirst: boolean;\n ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n const [imgFailed, setImgFailed] = useState(false);\n const Img = ImageComponent || require('react-native').Image;\n const showAvatar = bettor.avatar && !imgFailed;\n\n return (\n <View style={[styles.row, !isFirst && { borderTopColor: t.border, borderTopWidth: 1 }]}>\n <View style={[styles.dot, { backgroundColor: dotColor }]} />\n {showAvatar ? (\n <Img source={{ uri: ensurePngAvatar(bettor.avatar) }} style={styles.avatar} resizeMode=\"cover\" onError={() => setImgFailed(true)} />\n ) : (\n <View style={[styles.avatar, styles.avatarPlaceholder]} />\n )}\n <View style={styles.nameCol}>\n <Text style={[styles.username, { color: t.text }]} numberOfLines={1}>\n {bettor.username || truncateWallet(bettor.wallet, truncateChars)}\n </Text>\n </View>\n <Text style={[styles.amount, { color: t.textSecondary }]}>{bettor.amount} SOL</Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n title: { fontSize: 17, fontWeight: '700', marginBottom: 12 },\n empty: { fontSize: 14, textAlign: 'center', paddingVertical: 16 },\n row: { flexDirection: 'row', alignItems: 'center', paddingVertical: 10, gap: 10 },\n dot: { width: 8, height: 8, borderRadius: 4 },\n avatar: { width: 28, height: 28, borderRadius: 14 },\n avatarPlaceholder: { backgroundColor: 'rgba(128,128,128,0.2)' },\n nameCol: { flex: 1 },\n username: { fontSize: 14, fontWeight: '600' },\n amount: { fontSize: 13, fontWeight: '700' },\n});\n","import { useMemo } from 'react';\nimport { StyleSheet, View, Text, TouchableOpacity, ActivityIndicator } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail, MutationStatus } from '../../types';\n\nexport interface JoinGameButtonProps {\n game: GameDetail;\n walletAddress: string;\n selectedTeam: 'home' | 'away' | null;\n status: MutationStatus;\n onJoin: () => void;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming on-chain...',\n saving: 'Saving...',\n};\n\n/**\n * Fixed bottom bar with buy-in info and join button.\n * Renders nothing if the user already joined, or the game is locked/resolved.\n */\nexport function JoinGameButton({ game, walletAddress, selectedTeam, status, onJoin }: JoinGameButtonProps) {\n const t = useDubsTheme();\n\n const alreadyJoined = useMemo(() => {\n if (!walletAddress) return false;\n return (game.bettors || []).some(b => b.wallet === walletAddress);\n }, [game.bettors, walletAddress]);\n\n if (alreadyJoined || game.isLocked || game.isResolved) return null;\n\n const isJoining = status !== 'idle' && status !== 'success' && status !== 'error';\n const statusLabel = STATUS_LABELS[status] || '';\n\n return (\n <View style={[styles.bar, { backgroundColor: t.background, borderTopColor: t.border }]}>\n <View style={styles.buyInRow}>\n <Text style={[styles.buyInLabel, { color: t.textMuted }]}>Buy-in</Text>\n <Text style={[styles.buyInValue, { color: t.text }]}>{game.buyIn} SOL</Text>\n </View>\n <TouchableOpacity\n style={[styles.button, { backgroundColor: selectedTeam ? t.accent : t.border }]}\n disabled={!selectedTeam || isJoining}\n onPress={onJoin}\n activeOpacity={0.8}\n >\n {isJoining ? (\n <View style={styles.joiningRow}>\n <ActivityIndicator size=\"small\" color=\"#000\" />\n <Text style={styles.buttonText}>{statusLabel}</Text>\n </View>\n ) : (\n <Text style={[styles.buttonText, !selectedTeam && { color: t.textMuted }]}>\n {selectedTeam ? `Join Bet — ${game.buyIn} SOL` : 'Pick a team to bet'}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n bar: { position: 'absolute', bottom: 0, left: 0, right: 0, paddingHorizontal: 16, paddingTop: 12, paddingBottom: 36, borderTopWidth: 1 },\n buyInRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 },\n buyInLabel: { fontSize: 13 },\n buyInValue: { fontSize: 15, fontWeight: '800' },\n button: { borderRadius: 14, paddingVertical: 16, alignItems: 'center' },\n buttonText: { color: '#000', fontSize: 16, fontWeight: '800' },\n joiningRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useCreateCustomGame } from '../../hooks/useCreateCustomGame';\nimport type { CreateCustomGameMutationResult } from '../../hooks/useCreateCustomGame';\n\nexport interface CreateCustomGameSheetProps {\n visible: boolean;\n onDismiss: () => void;\n title?: string;\n maxPlayers?: number;\n fee?: number;\n presetAmounts?: number[];\n defaultAmount?: number;\n metadata?: Record<string, unknown>;\n onAmountChange?: (amount: number | null) => void;\n onSuccess?: (result: CreateCustomGameMutationResult) => void;\n onError?: (error: Error) => void;\n /** Pool mode: hides buy-in selection, uses defaultAmount, auto-assigns team, shows \"Create Pool\" labels */\n isPoolModeEnabled?: boolean;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming...',\n success: 'Game Created!',\n};\n\nexport function CreateCustomGameSheet({\n visible,\n onDismiss,\n title,\n maxPlayers = 2,\n fee = 5,\n presetAmounts = [0.01, 0.1, 0.5, 1],\n defaultAmount = 0.01,\n metadata,\n onAmountChange,\n onSuccess,\n onError,\n isPoolModeEnabled = false,\n}: CreateCustomGameSheetProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const mutation = useCreateCustomGame();\n\n const [selectedAmount, setSelectedAmount] = useState<number | null>(null);\n const [customAmount, setCustomAmount] = useState('');\n const [isCustom, setIsCustom] = useState(false);\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n // Animate overlay on visibility change\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset state when sheet opens\n useEffect(() => {\n if (visible) {\n setSelectedAmount(defaultAmount ?? null);\n setCustomAmount('');\n setIsCustom(false);\n mutation.reset();\n }\n }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-dismiss on success\n useEffect(() => {\n if (mutation.status === 'success' && mutation.data) {\n onSuccess?.(mutation.data);\n const timer = setTimeout(() => {\n onDismiss();\n }, 1500);\n return () => clearTimeout(timer);\n }\n }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Report errors\n useEffect(() => {\n if (mutation.status === 'error' && mutation.error) {\n onError?.(mutation.error);\n }\n }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handlePresetSelect = useCallback((amount: number) => {\n setSelectedAmount(amount);\n setIsCustom(false);\n setCustomAmount('');\n onAmountChange?.(amount);\n }, [onAmountChange]);\n\n const handleCustomSelect = useCallback(() => {\n setIsCustom(true);\n setSelectedAmount(null);\n onAmountChange?.(null);\n }, [onAmountChange]);\n\n const handleCustomAmountChange = useCallback((text: string) => {\n // Allow only numbers and single decimal point\n const cleaned = text.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');\n setCustomAmount(cleaned);\n const parsed = parseFloat(cleaned);\n const amount = parsed > 0 ? parsed : null;\n setSelectedAmount(amount);\n onAmountChange?.(amount);\n }, [onAmountChange]);\n\n const effectiveAmount = selectedAmount;\n const playerCount = maxPlayers || 2;\n\n // In pool mode, always use defaultAmount\n const finalAmount = isPoolModeEnabled ? (defaultAmount ?? 0.1) : effectiveAmount;\n\n const pot = finalAmount ? finalAmount * playerCount : 0;\n const winnerTakes = pot * (1 - fee / 100);\n\n const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n const canCreate = finalAmount !== null && finalAmount > 0 && !isMutating && mutation.status !== 'success';\n\n const handleCreate = useCallback(async () => {\n if (!finalAmount || !wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n teamChoice: 'home',\n wagerAmount: finalAmount,\n title,\n maxPlayers,\n metadata,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [finalAmount, wallet.publicKey, mutation.execute, title, maxPlayers, metadata]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n const playersLabel = playerCount === 2 ? '2 (1v1)' : `${playerCount} players`;\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>{isPoolModeEnabled ? 'Create Pool' : 'New Game'}</Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n {/* Buy-In Section — hidden in pool mode (uses defaultAmount) */}\n {!isPoolModeEnabled && (\n <View style={styles.section}>\n <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Buy-In Amount</Text>\n <View style={styles.chipsRow}>\n {presetAmounts.map((amount) => {\n const active = !isCustom && selectedAmount === amount;\n return (\n <TouchableOpacity\n key={amount}\n style={[\n styles.chip,\n { borderColor: active ? t.accent : t.border },\n active && { backgroundColor: t.accent },\n ]}\n onPress={() => handlePresetSelect(amount)}\n activeOpacity={0.8}\n >\n <Text style={[styles.chipText, { color: active ? '#FFFFFF' : t.text }]}>\n {amount} SOL\n </Text>\n </TouchableOpacity>\n );\n })}\n <TouchableOpacity\n style={[\n styles.chip,\n { borderColor: isCustom ? t.accent : t.border },\n isCustom && { backgroundColor: t.accent },\n ]}\n onPress={handleCustomSelect}\n activeOpacity={0.8}\n >\n <Text style={[styles.chipText, { color: isCustom ? '#FFFFFF' : t.text }]}>\n Custom\n </Text>\n </TouchableOpacity>\n </View>\n\n {isCustom && (\n <TextInput\n style={[styles.input, { backgroundColor: t.surface, color: t.text, borderColor: t.accent }]}\n placeholder=\"Enter amount in SOL\"\n placeholderTextColor={t.textDim}\n keyboardType=\"decimal-pad\"\n value={customAmount}\n onChangeText={handleCustomAmountChange}\n autoFocus\n />\n )}\n </View>\n )}\n\n {/* Summary Card */}\n <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Buy-in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>\n {finalAmount ? `${finalAmount} SOL` : '—'}\n </Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isPoolModeEnabled ? 'Max players' : 'Players'}</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{isPoolModeEnabled ? playerCount : playersLabel}</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isPoolModeEnabled ? 'Max pot' : 'Winner Takes'}</Text>\n <View style={styles.winnerCol}>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {finalAmount ? `${(finalAmount * playerCount * (1 - fee / 100)).toFixed(4)} SOL` : '—'}\n </Text>\n {finalAmount ? (\n <Text style={[styles.feeNote, { color: t.textDim }]}>{fee}% platform fee</Text>\n ) : null}\n </View>\n </View>\n </View>\n\n {/* Error Display */}\n {mutation.error && (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n </View>\n )}\n\n {/* CTA Button */}\n <TouchableOpacity\n style={[\n styles.ctaButton,\n { backgroundColor: canCreate ? t.accent : t.border },\n ]}\n disabled={!canCreate}\n onPress={handleCreate}\n activeOpacity={0.8}\n >\n {isMutating ? (\n <View style={styles.ctaLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n <Text style={styles.ctaText}>{statusLabel}</Text>\n </View>\n ) : mutation.status === 'success' ? (\n <Text style={styles.ctaText}>{isPoolModeEnabled ? 'Pool Created!' : STATUS_LABELS.success}</Text>\n ) : (\n <Text style={[styles.ctaText, !canCreate && { opacity: 0.5 }]}>\n {isPoolModeEnabled\n ? `Create Pool \\u2014 ${finalAmount} SOL`\n : effectiveAmount ? `Create Game \\u2014 ${effectiveAmount} SOL` : 'Select buy-in amount'}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 40,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n section: {\n gap: 12,\n paddingTop: 8,\n },\n sectionLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n chipsRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 10,\n },\n chip: {\n paddingHorizontal: 18,\n paddingVertical: 10,\n borderRadius: 14,\n borderWidth: 1.5,\n },\n chipText: {\n fontSize: 15,\n fontWeight: '600',\n },\n input: {\n height: 56,\n borderRadius: 16,\n borderWidth: 1.5,\n paddingHorizontal: 16,\n fontSize: 16,\n },\n summaryCard: {\n marginTop: 20,\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n summaryRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n summaryLabel: {\n fontSize: 14,\n },\n summaryValue: {\n fontSize: 15,\n fontWeight: '700',\n },\n summarySep: {\n height: 1,\n marginHorizontal: 16,\n },\n winnerCol: {\n alignItems: 'flex-end',\n gap: 2,\n },\n feeNote: {\n fontSize: 11,\n },\n errorBox: {\n marginTop: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n ctaButton: {\n marginTop: 20,\n height: 56,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n ctaText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n ctaLoading: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n },\n});\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useJoinGame } from '../../hooks/useJoinGame';\nimport type { JoinGameMutationResult } from '../../hooks/useJoinGame';\nimport type { GameDetail } from '../../types';\n\nexport interface JoinGameSheetProps {\n visible: boolean;\n onDismiss: () => void;\n game: GameDetail;\n /** Optional Image component (expo-image, etc.) for team logos */\n ImageComponent?: React.ComponentType<any>;\n /** Custom short-name function for team labels */\n shortName?: (name: string | null) => string;\n /** Override team colors (default blue/red) */\n homeColor?: string;\n awayColor?: string;\n /** Callbacks */\n onSuccess?: (result: JoinGameMutationResult) => void;\n onError?: (error: Error) => void;\n /** Pool mode: hides team selection, auto-assigns team, shows \"Join Pool\" labels */\n isPoolModeEnabled?: boolean;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming...',\n success: 'Joined!',\n};\n\nconst CUSTOM_GAME_MODE = 6;\n\nexport function JoinGameSheet({\n visible,\n onDismiss,\n game,\n ImageComponent,\n shortName,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n onSuccess,\n onError,\n isPoolModeEnabled = false,\n}: JoinGameSheetProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const mutation = useJoinGame();\n\n const isCustomGame = game.gameMode === CUSTOM_GAME_MODE;\n\n // Pool mode and custom games auto-assign team — no team selection needed.\n // For sports/esports games the user picks a team.\n const [selectedTeam, setSelectedTeam] = useState<'home' | 'away' | null>(null);\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n // Animate overlay on visibility change\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset state when sheet opens\n useEffect(() => {\n if (visible) {\n setSelectedTeam(isPoolModeEnabled ? 'home' : isCustomGame ? 'away' : null);\n mutation.reset();\n }\n }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-dismiss on success\n useEffect(() => {\n if (mutation.status === 'success' && mutation.data) {\n onSuccess?.(mutation.data);\n const timer = setTimeout(() => {\n onDismiss();\n }, 1500);\n return () => clearTimeout(timer);\n }\n }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Report errors\n useEffect(() => {\n if (mutation.status === 'error' && mutation.error) {\n onError?.(mutation.error);\n }\n }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // --- Derived values ---\n\n const opponents = game.opponents || [];\n const bettors = game.bettors || [];\n const totalPool = game.totalPool || 0;\n const homePool = game.homePool || 0;\n const awayPool = game.awayPool || 0;\n const buyIn = game.buyIn;\n\n const { homeOdds, awayOdds, homeBets, awayBets } = useMemo(() => ({\n homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n homeBets: bettors.filter(b => b.team === 'home').length,\n awayBets: bettors.filter(b => b.team === 'away').length,\n }), [totalPool, homePool, awayPool, bettors]);\n\n const poolAfterJoin = totalPool + buyIn;\n const selectedOdds = selectedTeam === 'home' ? homeOdds : selectedTeam === 'away' ? awayOdds : '—';\n const potentialWinnings = selectedOdds !== '—' ? (parseFloat(selectedOdds) * buyIn).toFixed(4) : '—';\n\n const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n const selectedName = selectedTeam === 'home' ? homeName : selectedTeam === 'away' ? awayName : '—';\n\n const alreadyJoined = useMemo(() => {\n if (!wallet.publicKey) return false;\n const addr = wallet.publicKey.toBase58();\n return bettors.some(b => b.wallet === addr);\n }, [bettors, wallet.publicKey]);\n\n const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n const canJoin = selectedTeam !== null && !isMutating && mutation.status !== 'success' && !alreadyJoined;\n\n const handleJoin = useCallback(async () => {\n if (!selectedTeam || !wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n gameId: game.gameId,\n teamChoice: selectedTeam,\n amount: buyIn,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [selectedTeam, wallet.publicKey, mutation.execute, game.gameId, buyIn]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>{isPoolModeEnabled ? 'Join Pool' : 'Join Game'}</Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n {/* Team Selection — hidden in pool mode and custom games */}\n {!isCustomGame && !isPoolModeEnabled && (\n <View style={styles.section}>\n <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Pick Your Side</Text>\n <View style={styles.teamsRow}>\n <TeamButton\n name={homeName}\n imageUrl={opponents[0]?.imageUrl}\n odds={homeOdds}\n bets={homeBets}\n color={homeColor}\n selected={selectedTeam === 'home'}\n onPress={() => setSelectedTeam('home')}\n ImageComponent={ImageComponent}\n t={t}\n />\n <TeamButton\n name={awayName}\n imageUrl={opponents[1]?.imageUrl}\n odds={awayOdds}\n bets={awayBets}\n color={awayColor}\n selected={selectedTeam === 'away'}\n onPress={() => setSelectedTeam('away')}\n ImageComponent={ImageComponent}\n t={t}\n />\n </View>\n </View>\n )}\n\n {/* Summary Card */}\n <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Buy-in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{buyIn} SOL</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n {isPoolModeEnabled ? (\n <>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Players in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{bettors.length}</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Current pot</Text>\n <Text style={[styles.summaryValue, { color: t.success }]}>{totalPool} SOL</Text>\n </View>\n </>\n ) : (\n <>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Your side</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{selectedName}</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Total pool</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{poolAfterJoin} SOL</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Potential winnings</Text>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {potentialWinnings !== '—' ? `${potentialWinnings} SOL` : '—'}\n </Text>\n </View>\n </>\n )}\n </View>\n\n {/* Already Joined Notice */}\n {alreadyJoined && (\n <View style={[styles.errorBox, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.errorText, { color: t.textMuted }]}>{isPoolModeEnabled ? \"You've already joined this pool.\" : \"You've already joined this game.\"}</Text>\n </View>\n )}\n\n {/* Error Display */}\n {mutation.error && (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n </View>\n )}\n\n {/* CTA Button */}\n <TouchableOpacity\n style={[\n styles.ctaButton,\n { backgroundColor: canJoin ? t.accent : t.border },\n ]}\n disabled={!canJoin}\n onPress={handleJoin}\n activeOpacity={0.8}\n >\n {isMutating ? (\n <View style={styles.ctaLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n <Text style={styles.ctaText}>{statusLabel}</Text>\n </View>\n ) : mutation.status === 'success' ? (\n <Text style={styles.ctaText}>{isPoolModeEnabled ? 'Joined!' : STATUS_LABELS.success}</Text>\n ) : (\n <Text style={[styles.ctaText, !canJoin && { opacity: 0.5 }]}>\n {alreadyJoined\n ? 'Already Joined'\n : isPoolModeEnabled\n ? `Join Pool \\u2014 ${buyIn} SOL`\n : selectedTeam\n ? `Join Game \\u2014 ${buyIn} SOL`\n : 'Pick a side to join'}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\n// ── TeamButton (internal, for sports/esports games) ──\n\nfunction TeamButton({\n name, imageUrl, odds, bets, color, selected, onPress, ImageComponent, t,\n}: {\n name: string; imageUrl?: string | null; odds: string; bets: number;\n color: string; selected: boolean; onPress: () => void;\n ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n const [imgFailed, setImgFailed] = useState(false);\n const Img = ImageComponent || require('react-native').Image;\n const showImage = imageUrl && !imgFailed;\n\n return (\n <TouchableOpacity\n style={[styles.teamOption, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + '15' : t.background }]}\n onPress={onPress}\n activeOpacity={0.7}\n >\n {showImage ? (\n <Img source={{ uri: imageUrl }} style={styles.teamLogo} resizeMode=\"contain\" onError={() => setImgFailed(true)} />\n ) : (\n <View style={[styles.teamLogo, styles.teamLogoPlaceholder]} />\n )}\n <Text style={[styles.teamName, { color: t.text }]} numberOfLines={1}>{name}</Text>\n <Text style={[styles.teamOdds, { color }]}>{odds}x</Text>\n <Text style={[styles.teamBets, { color: t.textMuted }]}>{bets} {bets === 1 ? 'bet' : 'bets'}</Text>\n {selected && (\n <View style={[styles.teamBadge, { backgroundColor: color }]}>\n <Text style={styles.teamBadgeText}>Selected</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 40,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n section: {\n gap: 12,\n paddingTop: 8,\n },\n sectionLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n teamsRow: {\n flexDirection: 'row',\n gap: 12,\n },\n summaryCard: {\n marginTop: 20,\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n summaryRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n summaryLabel: {\n fontSize: 14,\n },\n summaryValue: {\n fontSize: 15,\n fontWeight: '700',\n },\n summarySep: {\n height: 1,\n marginHorizontal: 16,\n },\n errorBox: {\n marginTop: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n ctaButton: {\n marginTop: 20,\n height: 56,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n ctaText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n ctaLoading: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n },\n // Team button styles\n teamOption: {\n flex: 1,\n borderWidth: 2,\n borderRadius: 16,\n padding: 16,\n alignItems: 'center',\n gap: 8,\n },\n teamLogo: {\n width: 48,\n height: 48,\n borderRadius: 24,\n },\n teamLogoPlaceholder: {\n backgroundColor: 'rgba(128,128,128,0.2)',\n },\n teamName: {\n fontSize: 15,\n fontWeight: '700',\n },\n teamOdds: {\n fontSize: 20,\n fontWeight: '800',\n },\n teamBets: {\n fontSize: 12,\n },\n teamBadge: {\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 4,\n marginTop: 4,\n },\n teamBadgeText: {\n color: '#FFF',\n fontSize: 12,\n fontWeight: '700',\n },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useClaim } from '../../hooks/useClaim';\nimport type { ClaimMutationResult } from '../../hooks/useClaim';\n\nexport interface ClaimPrizeSheetProps {\n visible: boolean;\n onDismiss: () => void;\n gameId: string;\n /** Prize amount in SOL */\n prizeAmount: number;\n /** When true, shows refund language instead of prize language */\n isRefund?: boolean;\n /** Callbacks */\n onSuccess?: (result: ClaimMutationResult) => void;\n onError?: (error: Error) => void;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming...',\n success: 'Claimed!',\n};\n\nexport function ClaimPrizeSheet({\n visible,\n onDismiss,\n gameId,\n prizeAmount,\n isRefund = false,\n onSuccess,\n onError,\n}: ClaimPrizeSheetProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const mutation = useClaim();\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n const celebrationScale = useRef(new Animated.Value(0)).current;\n const celebrationOpacity = useRef(new Animated.Value(0)).current;\n const [showCelebration, setShowCelebration] = useState(false);\n\n // Animate overlay on visibility change\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset state when sheet opens\n useEffect(() => {\n if (visible) {\n mutation.reset();\n setShowCelebration(false);\n celebrationScale.setValue(0);\n celebrationOpacity.setValue(0);\n }\n }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Celebration animation + auto-dismiss on success\n useEffect(() => {\n if (mutation.status === 'success' && mutation.data) {\n setShowCelebration(true);\n\n Animated.parallel([\n Animated.spring(celebrationScale, {\n toValue: 1,\n tension: 50,\n friction: 6,\n useNativeDriver: true,\n }),\n Animated.timing(celebrationOpacity, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n ]).start();\n\n onSuccess?.(mutation.data);\n\n const timer = setTimeout(() => {\n onDismiss();\n }, 2500);\n return () => clearTimeout(timer);\n }\n }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Report errors\n useEffect(() => {\n if (mutation.status === 'error' && mutation.error) {\n onError?.(mutation.error);\n }\n }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n const canClaim = !isMutating && mutation.status !== 'success' && !!wallet.publicKey;\n\n const handleClaim = useCallback(async () => {\n if (!wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n gameId,\n amountClaimed: prizeAmount,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [wallet.publicKey, mutation.execute, gameId, prizeAmount]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>\n {showCelebration\n ? (isRefund ? 'Refund Claimed!' : 'Prize Claimed!')\n : (isRefund ? 'Claim Refund' : 'Claim Prize')}\n </Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n {/* Celebration */}\n {showCelebration && (\n <Animated.View\n style={[\n styles.celebrationContainer,\n {\n opacity: celebrationOpacity,\n transform: [{ scale: celebrationScale }],\n },\n ]}\n >\n <Text style={styles.celebrationEmoji}>{'🏆'}</Text>\n <Text style={[styles.celebrationText, { color: t.success }]}>\n +{prizeAmount} SOL\n </Text>\n <Text style={[styles.celebrationSubtext, { color: t.textMuted }]}>\n {isRefund ? 'Refund sent to your wallet' : 'Winnings sent to your wallet'}\n </Text>\n </Animated.View>\n )}\n\n {/* Summary Card */}\n {!showCelebration && (\n <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isRefund ? 'Refund' : 'Prize'}</Text>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {prizeAmount} SOL\n </Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Game</Text>\n <Text\n style={[styles.summaryValue, { color: t.text }]}\n numberOfLines={1}\n >\n {gameId.slice(0, 8)}...{gameId.slice(-4)}\n </Text>\n </View>\n </View>\n )}\n\n {/* Error Display */}\n {mutation.error && (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n </View>\n )}\n\n {/* CTA Button */}\n {!showCelebration && (\n <TouchableOpacity\n style={[\n styles.ctaButton,\n { backgroundColor: canClaim ? t.accent : t.border },\n ]}\n disabled={!canClaim}\n onPress={handleClaim}\n activeOpacity={0.8}\n >\n {isMutating ? (\n <View style={styles.ctaLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n <Text style={styles.ctaText}>{statusLabel}</Text>\n </View>\n ) : (\n <Text style={[styles.ctaText, !canClaim && { opacity: 0.5 }]}>\n {isRefund ? 'Claim Refund' : 'Claim Prize'} — {prizeAmount} SOL\n </Text>\n )}\n </TouchableOpacity>\n )}\n\n {/* Explorer link on success */}\n {mutation.data?.explorerUrl && (\n <Text style={[styles.explorerHint, { color: t.textMuted }]}>\n View on Solscan\n </Text>\n )}\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 40,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n // Celebration\n celebrationContainer: {\n alignItems: 'center',\n paddingVertical: 32,\n gap: 8,\n },\n celebrationEmoji: {\n fontSize: 64,\n },\n celebrationText: {\n fontSize: 32,\n fontWeight: '800',\n },\n celebrationSubtext: {\n fontSize: 14,\n marginTop: 4,\n },\n // Summary\n summaryCard: {\n marginTop: 20,\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n summaryRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n summaryLabel: {\n fontSize: 14,\n },\n summaryValue: {\n fontSize: 15,\n fontWeight: '700',\n },\n summarySep: {\n height: 1,\n marginHorizontal: 16,\n },\n // Error\n errorBox: {\n marginTop: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n // CTA\n ctaButton: {\n marginTop: 20,\n height: 56,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n ctaText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n ctaLoading: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n },\n explorerHint: {\n textAlign: 'center',\n marginTop: 12,\n fontSize: 13,\n },\n});\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { StyleSheet, Text, TouchableOpacity, type ViewStyle } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useGame } from '../../hooks/useGame';\nimport { useHasClaimed } from '../../hooks/useHasClaimed';\nimport { ClaimPrizeSheet } from './ClaimPrizeSheet';\nimport type { ClaimMutationResult } from '../../hooks/useClaim';\n\nexport interface ClaimButtonProps {\n gameId: string;\n style?: ViewStyle;\n onSuccess?: (result: ClaimMutationResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Drop-in claim button that handles eligibility checks, prize/refund display,\n * and the claim sheet lifecycle internally.\n *\n * Renders nothing when the user is ineligible (lost, not resolved, not a bettor, etc.).\n */\nexport function ClaimButton({ gameId, style, onSuccess, onError }: ClaimButtonProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const game = useGame(gameId);\n const claimStatus = useHasClaimed(gameId);\n const [sheetVisible, setSheetVisible] = useState(false);\n\n const walletAddress = wallet.publicKey?.toBase58() ?? null;\n\n const myBet = useMemo(() => {\n if (!walletAddress || !game.data?.bettors) return null;\n return game.data.bettors.find(b => b.wallet === walletAddress) ?? null;\n }, [walletAddress, game.data?.bettors]);\n\n const isResolved = game.data?.isResolved ?? false;\n const isRefund = isResolved && game.data?.winnerSide === null;\n const isWinner = isResolved && myBet != null && myBet.team === game.data?.winnerSide;\n const isEligible = myBet != null && isResolved && (isWinner || isRefund);\n const prizeAmount = isRefund ? (myBet?.amount ?? 0) : (game.data?.totalPool ?? 0);\n\n const handleSuccess = useCallback(\n (result: ClaimMutationResult) => {\n claimStatus.refetch();\n onSuccess?.(result);\n },\n [claimStatus.refetch, onSuccess], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n // Don't render while loading or missing wallet/data\n if (game.loading || claimStatus.loading || !game.data || !walletAddress) {\n return null;\n }\n\n const label = isRefund ? 'Refund' : 'Prize';\n\n // Already claimed — always show badge regardless of eligibility computation\n if (claimStatus.hasClaimed) {\n return (\n <TouchableOpacity\n style={[styles.badge, { borderColor: t.accent }, style]}\n activeOpacity={1}\n disabled\n >\n <Text style={[styles.badgeText, { color: t.accent }]}>\n {label} Claimed!\n </Text>\n </TouchableOpacity>\n );\n }\n\n // Not eligible (lost, not resolved, not a bettor) — render nothing\n if (!isEligible) {\n return null;\n }\n\n return (\n <>\n <TouchableOpacity\n style={[styles.button, { backgroundColor: t.accent }, style]}\n activeOpacity={0.8}\n onPress={() => setSheetVisible(true)}\n >\n <Text style={styles.buttonText}>\n Claim {label} — {prizeAmount} SOL\n </Text>\n </TouchableOpacity>\n\n <ClaimPrizeSheet\n visible={sheetVisible}\n onDismiss={() => setSheetVisible(false)}\n gameId={gameId}\n prizeAmount={prizeAmount}\n isRefund={isRefund}\n onSuccess={handleSuccess}\n onError={onError}\n />\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n button: {\n height: 52,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 20,\n },\n buttonText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n badge: {\n height: 52,\n borderRadius: 14,\n borderWidth: 2,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 20,\n },\n badgeText: {\n fontSize: 16,\n fontWeight: '700',\n },\n});\n"],"mappings":"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","names":["createContext","useContext","useMemo","useCallback","useState","useEffect","Connection","createContext","useContext","PublicKey","Transaction","bs58","requestId","TAG","bs58","PublicKey","Transaction","jsx","TAG","createContext","useContext","React","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","StyleSheet","Platform","Image","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","Transaction","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useEffect","useState","useEffect","useState","useCallback","useRef","useContext","bs58","createContext","Platform","useContext","useState","useRef","useCallback","bs58","user","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","useRef","useEffect","Platform","useState","useRef","useCallback","Platform","useEffect","Fragment","jsx","jsxs","useState","useEffect","useCallback","View","Text","ActivityIndicator","TouchableOpacity","React","useRef","Image","Platform","StyleSheet","jsx","createContext","useMemo","useState","useEffect","Connection","useCallback","useContext","useMemo","View","Text","Image","StyleSheet","jsx","jsxs","useMemo","View","styles","Image","Text","StyleSheet","View","Text","ScrollView","TouchableOpacity","ActivityIndicator","StyleSheet","Fragment","jsx","jsxs","truncateAddress","ScrollView","styles","View","TouchableOpacity","Text","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","useMemo","View","Text","TouchableOpacity","ActivityIndicator","Animated","StyleSheet","KeyboardAvoidingView","Platform","Image","ScrollView","jsx","jsxs","DICEBEAR_STYLES","BG_COLORS","generateSeed","getAvatarUrl","truncateAddress","useRef","Animated","useMemo","useState","useEffect","useCallback","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ScrollView","Image","ActivityIndicator","StyleSheet","useState","StyleSheet","View","Text","jsx","jsxs","View","styles","Text","useState","StyleSheet","useMemo","StyleSheet","View","Text","jsx","jsxs","useMemo","View","styles","Text","StyleSheet","useState","useMemo","StyleSheet","View","Text","TouchableOpacity","jsx","jsxs","useMemo","View","styles","Text","useState","TouchableOpacity","StyleSheet","useState","StyleSheet","View","Text","jsx","jsxs","View","styles","Text","useState","StyleSheet","useMemo","StyleSheet","View","Text","TouchableOpacity","ActivityIndicator","jsx","jsxs","useMemo","View","styles","Text","TouchableOpacity","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","View","Text","TextInput","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","jsx","jsxs","STATUS_LABELS","useState","useRef","Animated","useEffect","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","TextInput","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","useMemo","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","Fragment","jsx","jsxs","STATUS_LABELS","useState","useRef","Animated","useEffect","useMemo","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","jsx","jsxs","STATUS_LABELS","useRef","Animated","useState","useEffect","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ActivityIndicator","StyleSheet","useState","useMemo","useCallback","StyleSheet","Text","TouchableOpacity","Fragment","jsx","jsxs","useState","useMemo","useCallback","TouchableOpacity","styles","Text","StyleSheet"]}
|
|
1
|
+
{"version":3,"sources":["../src/polyfill.ts","../src/constants.ts","../src/errors.ts","../src/client.ts","../src/storage.ts","../src/provider.tsx","../src/ui/theme.ts","../src/managed-wallet.tsx","../src/wallet/mwa-adapter.ts","../src/wallet/phantom-deeplink/phantom-deeplink-adapter.ts","../src/wallet/phantom-deeplink/crypto.ts","../src/wallet/phantom-deeplink/deeplink-handler.ts","../src/ui/ConnectWalletScreen.tsx","../src/ui/AuthGate.tsx","../src/hooks/useEvents.ts","../src/hooks/useGame.ts","../src/hooks/useGames.ts","../src/hooks/useNetworkGames.ts","../src/hooks/useCreateGame.ts","../src/utils/transaction.ts","../src/hooks/useJoinGame.ts","../src/hooks/useClaim.ts","../src/hooks/useCreateCustomGame.ts","../src/hooks/useHasClaimed.ts","../src/hooks/useAuth.ts","../src/auth-context.ts","../src/utils/device.ts","../src/utils/avatarUrl.ts","../src/hooks/useUFCFightCard.ts","../src/hooks/useUFCFighterDetail.ts","../src/hooks/usePushNotifications.ts","../src/ui/AvatarEditor.tsx","../src/ui/UserProfileCard.tsx","../src/ui/SettingsSheet.tsx","../src/ui/UserProfileSheet.tsx","../src/ui/game/GamePoster.tsx","../src/ui/game/LivePoolsCard.tsx","../src/ui/game/PickWinnerCard.tsx","../src/ui/game/PlayersCard.tsx","../src/ui/game/JoinGameButton.tsx","../src/ui/game/CreateCustomGameSheet.tsx","../src/ui/game/JoinGameSheet.tsx","../src/ui/game/ClaimPrizeSheet.tsx","../src/ui/game/ClaimButton.tsx"],"sourcesContent":["/**\n * Polyfill crypto.getRandomValues for React Native environments.\n *\n * This runs once at SDK import time, before tweetnacl, @solana/web3.js,\n * uuid, jayson, or any other dependency tries to use crypto.\n *\n * Must be imported as the very first line in src/index.ts.\n */\nimport { getRandomValues } from 'expo-crypto';\n\nif (typeof global !== 'undefined') {\n if (typeof global.crypto !== 'object') {\n (global as any).crypto = {};\n }\n if (typeof global.crypto.getRandomValues !== 'function') {\n (global.crypto as any).getRandomValues = getRandomValues;\n }\n}\n\n// Also polyfill `self` so tweetnacl's init finds crypto via self.crypto\nif (typeof self === 'undefined' && typeof globalThis !== 'undefined') {\n (globalThis as any).self = globalThis;\n}\n","export const DEFAULT_BASE_URL = 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1';\n\nexport const DEFAULT_RPC_URL = 'https://api.mainnet-beta.solana.com';\n\nexport type DubsNetwork = 'devnet' | 'mainnet-beta';\n\nexport const NETWORK_CONFIG: Record<DubsNetwork, { baseUrl: string; rpcUrl: string; cluster: string }> = {\n 'mainnet-beta': {\n baseUrl: DEFAULT_BASE_URL,\n rpcUrl: DEFAULT_RPC_URL,\n cluster: 'mainnet-beta',\n },\n devnet: {\n baseUrl: DEFAULT_BASE_URL,\n rpcUrl: 'https://api.devnet.solana.com',\n cluster: 'devnet',\n },\n};\n","import type { ParsedError, SolanaErrorCode } from './types';\n\nexport class DubsApiError extends Error {\n public readonly code: string;\n public readonly httpStatus: number;\n\n constructor(code: string, message: string, httpStatus: number) {\n super(message);\n this.name = 'DubsApiError';\n this.code = code;\n this.httpStatus = httpStatus;\n }\n}\n\n/** Custom error codes from dubs_solana_program (6000-6049) */\nexport const SOLANA_PROGRAM_ERRORS: Record<number, SolanaErrorCode> = {\n 6000: { code: 'invalid_amount', message: 'Amount must be greater than 0' },\n 6001: { code: 'invalid_max_players', message: 'Max players must be between 1 and 20' },\n 6002: { code: 'game_not_active', message: 'Game is not active' },\n 6003: { code: 'game_full', message: 'Game is full' },\n 6004: { code: 'player_already_joined', message: 'Player has already joined this game' },\n 6005: { code: 'insufficient_funds', message: 'Insufficient funds in pot' },\n 6006: { code: 'unauthorized', message: 'Only the game creator can perform this action' },\n 6007: { code: 'invalid_winner_index', message: 'Invalid winner index' },\n 6008: { code: 'game_still_active', message: 'Game is still active — must close before resetting' },\n 6009: { code: 'pot_not_empty', message: 'Pot must be empty before resetting — distribute winnings first' },\n 6010: { code: 'no_winners_specified', message: 'At least one winner must be specified' },\n 6011: { code: 'mismatched_winners_percentages', message: 'Number of winners must match number of percentages' },\n 6012: { code: 'percentages_invalid', message: 'Percentages must sum to exactly 100' },\n 6013: { code: 'winner_account_mismatch', message: 'Winner account does not match expected player' },\n 6014: { code: 'invalid_operator_fee', message: 'Operator fee must be between 0 and 100' },\n 6015: { code: 'operator_wallet_mismatch', message: 'Operator wallet does not match game settings' },\n 6016: { code: 'winner_not_in_game', message: 'Winner address is not a player in this game' },\n 6017: { code: 'voting_not_enabled', message: 'Voting is not enabled for this game' },\n 6018: { code: 'voter_not_in_game', message: 'Voter is not a player in this game' },\n 6019: { code: 'voted_for_not_in_game', message: 'Cannot vote for someone who is not in the game' },\n 6020: { code: 'voting_incomplete', message: 'Voting incomplete — need majority of players to vote' },\n 6021: { code: 'invalid_referee_commission', message: 'Referee commission must be between 0 and 100' },\n 6022: { code: 'total_fees_exceed_100', message: 'Total fees (operator + referee) cannot exceed 100%' },\n 6023: { code: 'referee_mode_requires_referee', message: 'Referee mode requires a referee address' },\n 6024: { code: 'referee_must_earn_commission', message: 'Referee must earn commission' },\n 6025: { code: 'referee_cannot_be_player', message: 'Referee cannot join as a player (conflict of interest)' },\n 6026: { code: 'only_referee_can_vote', message: 'Only the referee can vote in Referee mode' },\n 6027: { code: 'referee_account_mismatch', message: 'Referee account does not match game settings' },\n 6028: { code: 'invalid_lock_time', message: 'Lock time must be in the future' },\n 6029: { code: 'game_locked', message: 'Game is locked — no more players can join' },\n 6030: { code: 'lock_time_passed', message: 'Lock time has passed — game is now locked' },\n 6031: { code: 'unauthorized_oracle', message: 'Only authorized oracle can resolve this game' },\n 6032: { code: 'game_not_locked', message: 'Game must be locked before it can be resolved' },\n 6033: { code: 'already_resolved', message: 'Game has already been resolved' },\n 6034: { code: 'game_not_resolved', message: 'Game has not been resolved yet' },\n 6035: { code: 'player_not_in_game', message: 'Player is not in this game' },\n 6036: { code: 'not_a_winner', message: 'Player did not win this game' },\n 6037: { code: 'invalid_game_mode', message: 'Invalid game mode for this operation' },\n 6038: { code: 'already_claimed', message: 'Player has already claimed their winnings' },\n 6039: { code: 'lock_time_too_soon', message: 'Lock time must be at least 2 minutes in the future' },\n 6040: { code: 'operator_account_missing', message: 'Operator account must be provided' },\n 6041: { code: 'no_winners_to_distribute', message: 'No winners to distribute funds to' },\n 6042: { code: 'insufficient_funds_for_rent', message: 'Insufficient funds to maintain rent exemption' },\n 6043: { code: 'cannot_resolve_before_lock', message: 'Cannot resolve game before lock time has passed' },\n 6044: { code: 'emergency_refund_not_available', message: 'Emergency refund not available yet — must wait 7 days after lock time' },\n 6045: { code: 'sponsor_account_missing', message: 'Sponsor account must be provided for tie refund' },\n 6046: { code: 'sponsor_wallet_mismatch', message: 'Sponsor wallet does not match stored sponsor' },\n 6047: { code: 'invalid_bet_amount', message: 'Bet amount must be greater than zero' },\n 6048: { code: 'no_survivors_to_distribute', message: 'No survivors to distribute winnings to' },\n 6049: { code: 'too_many_survivors', message: 'Too many survivors (max 50 per batch)' },\n};\n\n/** Known Solana built-in instruction errors */\nconst SOLANA_BUILTIN_ERRORS: Record<number, SolanaErrorCode> = {\n 0: { code: 'generic_error', message: 'Generic instruction error' },\n 1: { code: 'invalid_argument', message: 'Invalid argument passed to program' },\n 2: { code: 'invalid_instruction_data', message: 'Invalid instruction data' },\n 3: { code: 'invalid_account_data', message: 'Invalid account data' },\n 4: { code: 'account_data_too_small', message: 'Account data too small' },\n 5: { code: 'insufficient_funds', message: 'Insufficient funds for transaction' },\n 6: { code: 'incorrect_program_id', message: 'Incorrect program ID' },\n 7: { code: 'missing_required_signature', message: 'Missing required signature' },\n 8: { code: 'account_already_initialized', message: 'Account already initialized' },\n 9: { code: 'uninitialized_account', message: 'Attempt to operate on uninitialized account' },\n};\n\n/**\n * Parse a raw Solana transaction error into a human-readable { code, message }.\n * Handles: { InstructionError: [idx, { Custom: N }] }, string errors, etc.\n */\nexport function parseSolanaError(err: unknown): ParsedError {\n if (!err) return { code: 'unknown_error', message: 'Unknown transaction error' };\n\n let parsed = err;\n\n if (typeof parsed === 'string') {\n try {\n const jsonMatch = parsed.match(/\\{.*\\}/s);\n if (jsonMatch) parsed = JSON.parse(jsonMatch[0]);\n else return { code: 'transaction_failed', message: parsed };\n } catch {\n return { code: 'transaction_failed', message: parsed as string };\n }\n }\n\n if (typeof parsed === 'object' && parsed !== null && 'InstructionError' in parsed) {\n const [ixIndex, details] = (parsed as { InstructionError: [number, unknown] }).InstructionError;\n\n if (details && typeof details === 'object' && 'Custom' in details) {\n const customCode = (details as { Custom: number }).Custom;\n const known = SOLANA_PROGRAM_ERRORS[customCode];\n if (known) return known;\n return { code: `program_error_${customCode}`, message: `Program error code ${customCode} (instruction ${ixIndex})` };\n }\n\n if (typeof details === 'string') {\n const snake = details.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n return { code: snake, message: details.replace(/([a-z])([A-Z])/g, '$1 $2') };\n }\n\n if (typeof details === 'number') {\n const known = SOLANA_BUILTIN_ERRORS[details];\n if (known) return known;\n return { code: `instruction_error_${details}`, message: `Instruction error ${details}` };\n }\n\n return { code: 'instruction_error', message: `Instruction ${ixIndex} failed: ${JSON.stringify(details)}` };\n }\n\n return { code: 'transaction_failed', message: typeof parsed === 'object' ? JSON.stringify(parsed) : String(parsed) };\n}\n","import { DEFAULT_BASE_URL } from './constants';\nimport { DubsApiError, parseSolanaError, SOLANA_PROGRAM_ERRORS } from './errors';\nimport type {\n UnifiedEvent,\n Pagination,\n EsportsMatchDetail,\n ValidateEventResult,\n CreateGameParams,\n CreateGameResult,\n CreateCustomGameParams,\n CreateCustomGameResult,\n JoinGameParams,\n JoinGameResult,\n ConfirmGameParams,\n ConfirmGameResult,\n BuildClaimParams,\n BuildClaimResult,\n ConfirmClaimParams,\n ConfirmClaimResult,\n GameDetail,\n GameListItem,\n GetGamesParams,\n GetNetworkGamesParams,\n GetUpcomingEventsParams,\n ParsedError,\n SolanaErrorCode,\n NonceResult,\n AuthenticateParams,\n AuthenticateResult,\n RegisterParams,\n RegisterResult,\n DubsUser,\n DubsPublicUser,\n DubsAppUser,\n CheckUsernameResult,\n LiveScore,\n UiConfig,\n UFCEvent,\n UFCFighterDetail,\n} from './types';\n\nexport interface DubsClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class DubsClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private _token: string | null = null;\n\n constructor(config: DubsClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, '');\n }\n\n /** Set the user JWT token for authenticated requests */\n setToken(token: string | null): void {\n this._token = token;\n }\n\n /** Get the current user JWT token */\n getToken(): string | null {\n return this._token;\n }\n\n // ── Private HTTP helper ──\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'X-API-Key': this.apiKey,\n 'Content-Type': 'application/json',\n };\n\n if (this._token) {\n headers['Authorization'] = `Bearer ${this._token}`;\n }\n\n console.log(`[DubsClient] ${method} ${url}`, body ? JSON.stringify(body).slice(0, 200) : '');\n\n const res = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const text = await res.text();\n console.log(`[DubsClient] ${method} ${path} → ${res.status}`, text.slice(0, 300));\n\n let json: any;\n try {\n json = JSON.parse(text);\n } catch {\n throw new DubsApiError('parse_error', `Invalid JSON response: ${text.slice(0, 100)}`, res.status);\n }\n\n if (!json.success) {\n const err = json.error;\n if (typeof err === 'object' && err !== null) {\n throw new DubsApiError(err.code || 'unknown', err.message || 'Unknown error', res.status);\n }\n throw new DubsApiError('unknown', typeof err === 'string' ? err : 'Request failed', res.status);\n }\n\n return json as T;\n }\n\n // ── Events ──\n\n async getUpcomingEvents(params?: GetUpcomingEventsParams): Promise<{ events: UnifiedEvent[]; pagination: Pagination }> {\n const qs = new URLSearchParams();\n if (params?.type) qs.set('type', params.type);\n if (params?.game) qs.set('game', params.game);\n if (params?.page) qs.set('page', String(params.page));\n if (params?.per_page) qs.set('per_page', String(params.per_page));\n const query = qs.toString();\n const res = await this.request<{ success: true; events: UnifiedEvent[]; pagination: Pagination }>(\n 'GET',\n `/events/upcoming${query ? `?${query}` : ''}`,\n );\n return { events: res.events, pagination: res.pagination };\n }\n\n async getSportsEvents(league: string): Promise<UnifiedEvent[]> {\n const res = await this.request<{ success: true; league: string; events: UnifiedEvent[] }>(\n 'GET',\n `/sports/events/${encodeURIComponent(league)}`,\n );\n return res.events;\n }\n\n async getEsportsMatches(videogame?: string): Promise<UnifiedEvent[]> {\n const qs = videogame ? `?videogame=${encodeURIComponent(videogame)}` : '';\n const res = await this.request<{ success: true; matches: UnifiedEvent[] }>(\n 'GET',\n `/esports/matches/upcoming${qs}`,\n );\n return res.matches;\n }\n\n async getEsportsMatchDetail(matchId: string | number): Promise<EsportsMatchDetail> {\n const res = await this.request<{ success: true; match: EsportsMatchDetail }>(\n 'GET',\n `/esports/matches/${encodeURIComponent(String(matchId))}`,\n );\n return res.match;\n }\n\n // ── UFC ──\n\n async getUFCFightCard(): Promise<UFCEvent[]> {\n const res = await this.request<{ success: true; events: UFCEvent[] }>(\n 'GET',\n '/ufc/fightcard',\n );\n return res.events;\n }\n\n async getUFCFighterDetail(athleteId: string): Promise<UFCFighterDetail> {\n const res = await this.request<{ success: true; fighter: UFCFighterDetail }>(\n 'GET',\n `/ufc/fighters/${encodeURIComponent(athleteId)}`,\n );\n return res.fighter;\n }\n\n // ── Game Lifecycle ──\n\n async validateEvent(id: string): Promise<ValidateEventResult> {\n const res = await this.request<{ success: true } & ValidateEventResult>(\n 'POST',\n '/games/validate',\n { id },\n );\n return {\n bettable: res.bettable,\n gameMode: res.gameMode,\n lockTimestamp: res.lockTimestamp,\n startTime: res.startTime,\n status: res.status,\n };\n }\n\n async createGame(params: CreateGameParams): Promise<CreateGameResult> {\n const res = await this.request<{ success: true } & CreateGameResult>(\n 'POST',\n '/games/create',\n params,\n );\n return {\n gameId: res.gameId,\n gameAddress: res.gameAddress,\n transaction: res.transaction,\n lockTimestamp: res.lockTimestamp,\n event: res.event,\n };\n }\n\n async joinGame(params: JoinGameParams): Promise<JoinGameResult> {\n const res = await this.request<{ success: true } & JoinGameResult>(\n 'POST',\n '/games/join',\n params,\n );\n return {\n gameId: res.gameId,\n transaction: res.transaction,\n gameAddress: res.gameAddress,\n };\n }\n\n async confirmGame(params: ConfirmGameParams): Promise<ConfirmGameResult> {\n const res = await this.request<{ success: true } & ConfirmGameResult>(\n 'POST',\n '/games/confirm',\n params,\n );\n return {\n gameId: res.gameId,\n signature: res.signature,\n explorerUrl: res.explorerUrl,\n message: res.message,\n };\n }\n\n // ── Custom Game Lifecycle (game_mode=6) ──\n\n async createCustomGame(params: CreateCustomGameParams): Promise<CreateCustomGameResult> {\n const res = await this.request<{ success: true } & CreateCustomGameResult>(\n 'POST',\n '/games/custom/create',\n params,\n );\n return {\n gameId: res.gameId,\n gameAddress: res.gameAddress,\n transaction: res.transaction,\n lockTimestamp: res.lockTimestamp,\n };\n }\n\n async confirmCustomGame(params: ConfirmGameParams): Promise<ConfirmGameResult> {\n const res = await this.request<{ success: true } & ConfirmGameResult>(\n 'POST',\n '/games/custom/confirm',\n params,\n );\n return {\n gameId: res.gameId,\n signature: res.signature,\n explorerUrl: res.explorerUrl,\n message: res.message,\n };\n }\n\n async buildClaimTransaction(params: BuildClaimParams): Promise<BuildClaimResult> {\n const res = await this.request<{ success: true } & BuildClaimResult>(\n 'POST',\n '/transactions/build/claim',\n params,\n );\n return {\n transaction: res.transaction,\n gameAddress: res.gameAddress,\n message: res.message,\n };\n }\n\n async confirmClaim(gameId: string, params: ConfirmClaimParams): Promise<ConfirmClaimResult> {\n const res = await this.request<{ success: true } & ConfirmClaimResult>(\n 'POST',\n `/games/${encodeURIComponent(gameId)}/claim/confirm`,\n params,\n );\n return {\n gameId: res.gameId,\n signature: res.signature,\n explorerUrl: res.explorerUrl,\n message: res.message,\n };\n }\n\n // ── Game Queries ──\n\n async getGame(gameId: string): Promise<GameDetail> {\n const res = await this.request<{ success: true; game: GameDetail }>(\n 'GET',\n `/games/${encodeURIComponent(gameId)}`,\n );\n return res.game;\n }\n\n async getLiveScore(gameId: string): Promise<LiveScore | null> {\n const res = await this.request<{ success: true; liveScore: LiveScore | null }>(\n 'GET',\n `/games/${encodeURIComponent(gameId)}/live-score`,\n );\n return res.liveScore;\n }\n\n async getGames(params?: GetGamesParams): Promise<GameListItem[]> {\n const qs = new URLSearchParams();\n if (params?.wallet) qs.set('wallet', params.wallet);\n if (params?.status) qs.set('status', params.status);\n if (params?.limit != null) qs.set('limit', String(params.limit));\n if (params?.offset != null) qs.set('offset', String(params.offset));\n const query = qs.toString();\n const res = await this.request<{ success: true; games: GameListItem[] }>(\n 'GET',\n `/games${query ? `?${query}` : ''}`,\n );\n return res.games;\n }\n\n // ── Network ──\n\n async getNetworkGames(params?: GetNetworkGamesParams): Promise<{ games: GameListItem[]; pagination: Pagination }> {\n const qs = new URLSearchParams();\n if (params?.league) qs.set('league', params.league);\n if (params?.exclude_wallet) qs.set('exclude_wallet', params.exclude_wallet);\n if (params?.limit != null) qs.set('limit', String(params.limit));\n if (params?.offset != null) qs.set('offset', String(params.offset));\n const query = qs.toString();\n const res = await this.request<{ success: true; games: GameListItem[]; pagination: Pagination }>(\n 'GET',\n `/network/games${query ? `?${query}` : ''}`,\n );\n return { games: res.games, pagination: res.pagination };\n }\n\n // ── User Auth ──\n\n async getNonce(walletAddress: string): Promise<NonceResult> {\n const res = await this.request<{ success: true; data: NonceResult }>(\n 'POST',\n '/auth/nonce',\n { walletAddress },\n );\n return res.data;\n }\n\n async authenticate(params: AuthenticateParams): Promise<AuthenticateResult> {\n const res = await this.request<{ success: true; data: AuthenticateResult }>(\n 'POST',\n '/auth/authenticate',\n params,\n );\n // Auto-store token on successful auth\n if (res.data.token) {\n this._token = res.data.token;\n }\n return res.data;\n }\n\n async register(params: RegisterParams): Promise<RegisterResult> {\n const res = await this.request<{ success: true; data: RegisterResult }>(\n 'POST',\n '/auth/register',\n params,\n );\n // Auto-store token on successful registration\n if (res.data.token) {\n this._token = res.data.token;\n }\n return res.data;\n }\n\n async getMe(): Promise<DubsUser> {\n const res = await this.request<{ success: true; data: { user: DubsUser } }>(\n 'GET',\n '/auth/me',\n );\n return res.data.user;\n }\n\n async getUser(walletAddress: string): Promise<DubsPublicUser | null> {\n const res = await this.request<{ success: true; data: { user: DubsPublicUser | null } }>(\n 'GET',\n `/users/${encodeURIComponent(walletAddress)}`,\n );\n return res.data.user;\n }\n\n async getAppUsers(params?: { limit?: number; offset?: number }): Promise<{ users: DubsAppUser[]; pagination: { total: number; limit: number; offset: number } }> {\n const qs = new URLSearchParams();\n if (params?.limit != null) qs.set('limit', String(params.limit));\n if (params?.offset != null) qs.set('offset', String(params.offset));\n const query = qs.toString();\n const res = await this.request<{ success: true; data: { users: DubsAppUser[]; pagination: { total: number; limit: number; offset: number } } }>(\n 'GET',\n `/users${query ? `?${query}` : ''}`,\n );\n return res.data;\n }\n\n async checkUsername(username: string): Promise<CheckUsernameResult> {\n const res = await this.request<{ success: true; data: CheckUsernameResult }>(\n 'GET',\n `/auth/check-username/${encodeURIComponent(username)}`,\n );\n return res.data;\n }\n\n async logout(): Promise<void> {\n await this.request<{ success: true; data: { message: string } }>(\n 'POST',\n '/auth/logout',\n );\n this._token = null;\n }\n\n // ── Push Notifications ──\n\n async registerPushToken(params: { token: string; platform: string; deviceName?: string }): Promise<void> {\n await this.request<{ success: true; data: { tokenId: number; token: string } }>(\n 'POST',\n '/push/expo-token',\n params,\n );\n }\n\n async unregisterPushToken(token: string): Promise<void> {\n await this.request<{ success: true; data: { message: string } }>(\n 'DELETE',\n '/push/expo-token',\n { token },\n );\n }\n\n // ── Profile ──\n\n async updateProfile(params: { avatar?: string }): Promise<DubsUser> {\n const res = await this.request<{ success: true; data: { user: DubsUser } }>(\n 'PATCH',\n '/auth/profile',\n params,\n );\n return res.data.user;\n }\n\n // ── Error Utilities ──\n\n async parseError(error: unknown): Promise<ParsedError> {\n const res = await this.request<{ success: true; error: ParsedError }>(\n 'POST',\n '/errors/parse',\n { error },\n );\n return res.error;\n }\n\n async getErrorCodes(): Promise<Record<number, SolanaErrorCode>> {\n const res = await this.request<{ success: true; errors: Record<number, SolanaErrorCode> }>(\n 'GET',\n '/errors/codes',\n );\n return res.errors;\n }\n\n /**\n * Parse a Solana error locally without an API call.\n * Useful for instant feedback in the UI.\n */\n parseErrorLocal(error: unknown): ParsedError {\n return parseSolanaError(error);\n }\n\n /** Get the full local error code map */\n getErrorCodesLocal(): Record<number, SolanaErrorCode> {\n return { ...SOLANA_PROGRAM_ERRORS };\n }\n\n // ── App Config ──\n\n /** Fetch the app's UI customization config (accent color, icon, tagline, environment) */\n async getAppConfig(): Promise<UiConfig> {\n const res = await this.request<{ data: { environment?: string; uiConfig: UiConfig } }>('GET', '/apps/config');\n const config = res.data?.uiConfig || {};\n if (res.data?.environment) {\n config.environment = res.data.environment as UiConfig['environment'];\n }\n return config;\n }\n}\n","export interface TokenStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n deleteItem(key: string): Promise<void>;\n}\n\nexport const STORAGE_KEYS = {\n MWA_AUTH_TOKEN: 'dubs_mwa_auth_token',\n MWA_WALLET_ADDRESS: 'dubs_mwa_wallet_address',\n JWT_TOKEN: 'dubs_jwt_token',\n PHANTOM_SESSION: 'dubs_phantom_session',\n PHANTOM_CONNECT_IN_FLIGHT: 'dubs_phantom_connect_in_flight',\n} as const;\n\n/**\n * Creates a TokenStorage backed by expo-secure-store.\n * Lazy-imports the module so it's only required at runtime when actually used.\n * Throws a clear error if expo-secure-store is not installed.\n */\nexport function createSecureStoreStorage(): TokenStorage {\n // Use `any` to avoid requiring expo-secure-store types at build time.\n // The module is lazy-imported at runtime only when this storage is actually used.\n let SecureStore: any = null;\n\n function getStore(): {\n getItemAsync: (key: string) => Promise<string | null>;\n setItemAsync: (key: string, value: string) => Promise<void>;\n deleteItemAsync: (key: string) => Promise<void>;\n } {\n if (!SecureStore) {\n try {\n // Use require() to keep the import opaque to TypeScript's DTS generation.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n SecureStore = require('expo-secure-store');\n } catch {\n throw new Error(\n '@dubsdotapp/expo: expo-secure-store is required for default token storage. ' +\n 'Install it with: npx expo install expo-secure-store — ' +\n 'or pass a custom tokenStorage prop to <DubsProvider>.',\n );\n }\n }\n return SecureStore;\n }\n\n return {\n async getItem(key: string): Promise<string | null> {\n const store = getStore();\n return store.getItemAsync(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const store = getStore();\n await store.setItemAsync(key, value);\n },\n async deleteItem(key: string): Promise<void> {\n const store = getStore();\n await store.deleteItemAsync(key);\n },\n };\n}\n","import React, { createContext, useContext, useMemo, useCallback, useState, useEffect } from 'react';\nimport { ThemeOverrideProvider } from './ui/theme';\nimport type { DubsTheme } from './ui/theme';\nimport { Connection } from '@solana/web3.js';\nimport { DubsClient } from './client';\nimport { NETWORK_CONFIG } from './constants';\nimport type { DubsNetwork } from './constants';\nimport type { WalletAdapter } from './wallet/types';\nimport type { TokenStorage } from './storage';\nimport { createSecureStoreStorage, STORAGE_KEYS } from './storage';\nimport { ManagedWalletProvider, useDisconnect } from './managed-wallet';\nimport { AuthGate } from './ui/AuthGate';\nimport type { RegistrationScreenProps } from './ui/AuthGate';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { AuthStatus, UiConfig } from './types';\n\n// ── Context ──\n\nexport interface DubsContextValue {\n client: DubsClient;\n wallet: WalletAdapter;\n connection: Connection;\n appName: string;\n network: DubsNetwork;\n disconnect: () => Promise<void>;\n uiConfig: UiConfig;\n pushEnabled: boolean;\n}\n\nconst DubsContext = createContext<DubsContextValue | null>(null);\n\n// ── Props ──\n\nexport interface DubsProviderProps {\n apiKey: string;\n children: React.ReactNode;\n appName?: string;\n network?: DubsNetwork;\n /** Escape hatch: bring your own wallet adapter. Disables managed MWA. */\n wallet?: WalletAdapter;\n /** Escape hatch: custom token persistence. Defaults to expo-secure-store. */\n tokenStorage?: TokenStorage;\n /** Escape hatch: override base URL (takes precedence over network). */\n baseUrl?: string;\n /** Escape hatch: override RPC URL (takes precedence over network). */\n rpcUrl?: string;\n /** Custom connect screen, or false to hide it entirely (headless mode). */\n renderConnectScreen?: ((props: ConnectWalletScreenProps) => React.ReactNode) | false;\n /** Custom loading screen shown during auth. */\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n /** Custom error screen shown on auth failure. */\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n /** Custom registration screen. */\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n /** Set to false to skip AuthGate and connect screen (headless/BYOA mode). Default: true. */\n managed?: boolean;\n /** Deeplink redirect URI for Phantom wallet (required for iOS support). */\n redirectUri?: string;\n /** App URL shown in Phantom's connect screen. */\n appUrl?: string;\n /** Enable Dubs push notifications. Default: true. Set false if your app manages its own Firebase/push. */\n pushEnabled?: boolean;\n}\n\n// ── Provider ──\n\nexport function DubsProvider({\n apiKey,\n children,\n appName = 'Dubs',\n network = 'mainnet-beta',\n wallet: externalWallet,\n tokenStorage,\n baseUrl: baseUrlOverride,\n rpcUrl: rpcUrlOverride,\n renderConnectScreen,\n renderLoading,\n renderError,\n renderRegistration,\n managed = true,\n redirectUri,\n appUrl,\n pushEnabled = true,\n}: DubsProviderProps) {\n // Resolve network config — explicit props override network defaults\n const config = NETWORK_CONFIG[network];\n const baseUrl = baseUrlOverride || config.baseUrl;\n const rpcUrl = rpcUrlOverride || config.rpcUrl;\n\n // Create stable instances\n const client = useMemo(() => new DubsClient({ apiKey, baseUrl }), [apiKey, baseUrl]);\n const storage = useMemo(() => tokenStorage || createSecureStoreStorage(), [tokenStorage]);\n\n // Fetch developer UI config on mount (silent fail = default theme)\n // Also auto-detects sandbox/production environment from the API key\n const [uiConfig, setUiConfig] = useState<UiConfig | null>(null);\n const [resolvedNetwork, setResolvedNetwork] = useState<DubsNetwork>(network);\n useEffect(() => {\n client.getAppConfig()\n .then((cfg) => {\n console.log('[DubsProvider] UI config loaded:', JSON.stringify(cfg));\n setUiConfig(cfg);\n // Auto-detect network from API key environment (sandbox → devnet)\n // Only override if the user didn't explicitly set network or rpcUrl\n if (cfg.environment === 'sandbox' && network === 'mainnet-beta' && !rpcUrlOverride) {\n console.log('[DubsProvider] Sandbox API key detected — auto-switching to devnet');\n setResolvedNetwork('devnet');\n }\n })\n .catch((err) => {\n console.log('[DubsProvider] UI config fetch failed, using defaults:', err?.message);\n setUiConfig({});\n });\n }, [client]);\n\n // Use resolved network (may differ from prop if sandbox was auto-detected)\n const resolvedConfig = NETWORK_CONFIG[resolvedNetwork];\n const resolvedRpcUrl = rpcUrlOverride || resolvedConfig.rpcUrl;\n const cluster = resolvedConfig.cluster;\n\n // Connection uses the resolved RPC (auto-switched to devnet for sandbox keys)\n const connection = useMemo(() => new Connection(resolvedRpcUrl, { commitment: 'confirmed' }), [resolvedRpcUrl]);\n\n // Wait for config before rendering so accent color is applied on first paint\n if (uiConfig === null) return null;\n\n // Build theme overrides from server config so all SDK components respect the tint\n const themeOverrides: Partial<DubsTheme> = {};\n if (uiConfig.accentColor) {\n themeOverrides.accent = uiConfig.accentColor;\n }\n\n // ── Path A: External wallet provided (BYOA) ──\n if (externalWallet) {\n return (\n <ThemeOverrideProvider value={themeOverrides}>\n <ExternalWalletProvider\n client={client}\n connection={connection}\n wallet={externalWallet}\n appName={uiConfig.appName || appName}\n network={resolvedNetwork}\n storage={storage}\n managed={managed}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n pushEnabled={pushEnabled}\n >\n {children}\n </ExternalWalletProvider>\n </ThemeOverrideProvider>\n );\n }\n\n // ── Path B: Managed MWA wallet ──\n return (\n <ThemeOverrideProvider value={themeOverrides}>\n <ManagedWalletProvider\n appName={uiConfig.appName || appName}\n cluster={cluster}\n storage={storage}\n renderConnectScreen={renderConnectScreen}\n accentColor={uiConfig.accentColor}\n appIcon={uiConfig.appIcon}\n tagline={uiConfig.tagline}\n redirectUri={redirectUri}\n appUrl={appUrl || uiConfig.appUrl}\n >\n {(adapter) => (\n <ManagedInner\n client={client}\n connection={connection}\n wallet={adapter}\n appName={uiConfig.appName || appName}\n network={resolvedNetwork}\n storage={storage}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n pushEnabled={pushEnabled}\n >\n {children}\n </ManagedInner>\n )}\n </ManagedWalletProvider>\n </ThemeOverrideProvider>\n );\n}\n\n// ── ManagedInner: context + AuthGate for managed wallet path ──\n\nfunction ManagedInner({\n client,\n connection,\n wallet,\n appName,\n network,\n storage,\n renderLoading,\n renderError,\n renderRegistration,\n accentColor,\n uiConfig,\n pushEnabled,\n children,\n}: {\n client: DubsClient;\n connection: Connection;\n wallet: WalletAdapter;\n appName: string;\n network: DubsNetwork;\n storage: TokenStorage;\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n accentColor?: string;\n uiConfig: UiConfig;\n pushEnabled: boolean;\n children: React.ReactNode;\n}) {\n const managedDisconnect = useDisconnect();\n\n const disconnect = useCallback(async () => {\n // Clear client JWT\n client.setToken(null);\n // Delegate to managed wallet (clears adapter + storage)\n await managedDisconnect?.();\n }, [client, managedDisconnect]);\n\n const value = useMemo<DubsContextValue>(\n () => ({ client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled }),\n [client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled],\n );\n\n return (\n <DubsContext.Provider value={value}>\n <AuthGate\n onSaveToken={(token) => {\n if (token) return storage.setItem(STORAGE_KEYS.JWT_TOKEN, token);\n return storage.deleteItem(STORAGE_KEYS.JWT_TOKEN);\n }}\n onLoadToken={() => storage.getItem(STORAGE_KEYS.JWT_TOKEN)}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n appName={appName}\n accentColor={accentColor}\n >\n {children}\n </AuthGate>\n </DubsContext.Provider>\n );\n}\n\n// ── ExternalWalletProvider: for BYOA path ──\n\nfunction ExternalWalletProvider({\n client,\n connection,\n wallet,\n appName,\n network,\n storage,\n managed,\n renderLoading,\n renderError,\n renderRegistration,\n accentColor,\n uiConfig,\n pushEnabled,\n children,\n}: {\n client: DubsClient;\n connection: Connection;\n wallet: WalletAdapter;\n appName: string;\n network: DubsNetwork;\n storage: TokenStorage;\n managed: boolean;\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n accentColor?: string;\n uiConfig: UiConfig;\n pushEnabled: boolean;\n children: React.ReactNode;\n}) {\n const disconnect = useCallback(async () => {\n client.setToken(null);\n await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n await wallet.disconnect?.();\n }, [client, storage, wallet]);\n\n const value = useMemo<DubsContextValue>(\n () => ({ client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled }),\n [client, wallet, connection, appName, network, disconnect, uiConfig, pushEnabled],\n );\n\n if (!managed) {\n // Headless mode — just context, no AuthGate\n return <DubsContext.Provider value={value}>{children}</DubsContext.Provider>;\n }\n\n return (\n <DubsContext.Provider value={value}>\n <AuthGate\n onSaveToken={(token) => {\n if (token) return storage.setItem(STORAGE_KEYS.JWT_TOKEN, token);\n return storage.deleteItem(STORAGE_KEYS.JWT_TOKEN);\n }}\n onLoadToken={() => storage.getItem(STORAGE_KEYS.JWT_TOKEN)}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n appName={appName}\n accentColor={accentColor}\n >\n {children}\n </AuthGate>\n </DubsContext.Provider>\n );\n}\n\n// ── Hooks ──\n\nexport function useDubs(): DubsContextValue {\n const ctx = useContext(DubsContext);\n if (!ctx) {\n throw new Error('useDubs must be used within a <DubsProvider>');\n }\n return ctx;\n}\n\nexport function useAppConfig(): UiConfig {\n const ctx = useContext(DubsContext);\n return ctx?.uiConfig || {};\n}\n","import { createContext, useContext } from 'react';\nimport { useColorScheme } from 'react-native';\n\nexport interface DubsTheme {\n background: string;\n surface: string;\n surfaceActive: string;\n border: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n textDim: string;\n accent: string;\n success: string;\n live: string;\n errorText: string;\n errorBg: string;\n errorBorder: string;\n}\n\nconst dark: DubsTheme = {\n background: '#08080D',\n surface: '#111118',\n surfaceActive: '#7C3AED',\n border: '#1A1A24',\n text: '#FFFFFF',\n textSecondary: '#E0E0EE',\n textMuted: '#666666',\n textDim: '#555555',\n accent: '#7C3AED',\n success: '#22C55E',\n live: '#EF4444',\n errorText: '#F87171',\n errorBg: '#1A0A0A',\n errorBorder: '#3A1515',\n};\n\nconst light: DubsTheme = {\n background: '#FFFFFF',\n surface: '#F0F0F5',\n surfaceActive: '#7C3AED',\n border: '#E0E0E8',\n text: '#111118',\n textSecondary: '#333333',\n textMuted: '#888888',\n textDim: '#999999',\n accent: '#7C3AED',\n success: '#16A34A',\n live: '#DC2626',\n errorText: '#DC2626',\n errorBg: '#FEF2F2',\n errorBorder: '#FECACA',\n};\n\n/** Context for provider-level theme overrides (e.g. accent color from developer config). */\nconst ThemeOverrideContext = createContext<Partial<DubsTheme>>({});\nexport const ThemeOverrideProvider = ThemeOverrideContext.Provider;\n\nexport function useDubsTheme(): DubsTheme {\n const scheme = useColorScheme();\n const base = scheme === 'light' ? light : dark;\n const overrides = useContext(ThemeOverrideContext);\n if (Object.keys(overrides).length === 0) return base;\n return { ...base, ...overrides };\n}\n\n/** Merge overrides into a base theme (e.g. custom accent color from developer config) */\nexport function mergeTheme(base: DubsTheme, overrides: Partial<DubsTheme>): DubsTheme {\n return { ...base, ...overrides };\n}\n","import React, { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';\nimport { Platform } from 'react-native';\nimport { MwaWalletAdapter } from './wallet/mwa-adapter';\nimport { PhantomDeeplinkAdapter } from './wallet/phantom-deeplink';\nimport type { PhantomSession } from './wallet/phantom-deeplink';\nimport type { WalletAdapter } from './wallet/types';\nimport { ConnectWalletScreen } from './ui/ConnectWalletScreen';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { TokenStorage } from './storage';\nimport { STORAGE_KEYS } from './storage';\n\nconst TAG = '[Dubs:ManagedWallet]';\n\n/** Auto-detect redirect URI on iOS using the app's scheme from expo-linking. */\nfunction getDefaultRedirectUri(): string | undefined {\n if (Platform.OS !== 'ios') return undefined;\n try {\n const expoLinking = require('expo-linking');\n if (expoLinking.createURL) {\n const uri = expoLinking.createURL('phantom-callback');\n console.log(TAG, 'Auto-detected redirect URI via expo-linking:', uri);\n return uri;\n }\n } catch {}\n try {\n const Constants = require('expo-constants').default;\n const scheme = Constants.expoConfig?.scheme;\n if (scheme) {\n const uri = `${scheme}://phantom-callback`;\n console.log(TAG, 'Auto-detected redirect URI via expo-constants:', uri);\n return uri;\n }\n } catch {}\n return undefined;\n}\n\n// ── Module-level Phantom adapter singleton ──\n// Persists across React remounts (e.g. when the app backgrounds to open Phantom).\n// This prevents the Linking listener from being torn down mid-flow.\nlet phantomSingleton: PhantomDeeplinkAdapter | null = null;\n\nfunction getOrCreatePhantomAdapter(config: {\n redirectUri: string;\n appUrl?: string;\n cluster: string;\n storage: TokenStorage;\n}): PhantomDeeplinkAdapter {\n if (!phantomSingleton) {\n console.log(TAG, 'Creating PhantomDeeplinkAdapter (singleton)');\n phantomSingleton = new PhantomDeeplinkAdapter({\n redirectUri: config.redirectUri,\n appUrl: config.appUrl,\n cluster: config.cluster,\n storage: config.storage,\n onSessionChange: (session) => {\n if (session) {\n console.log(TAG, 'Phantom session changed — saving to storage, wallet:', session.walletPublicKey);\n config.storage.setItem(STORAGE_KEYS.PHANTOM_SESSION, JSON.stringify(session)).catch((err) => {\n console.log(TAG, 'Failed to save Phantom session:', err);\n });\n } else {\n console.log(TAG, 'Phantom session cleared — removing from storage');\n config.storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch((err) => {\n console.log(TAG, 'Failed to delete Phantom session:', err);\n });\n }\n },\n });\n }\n return phantomSingleton;\n}\n\n// ── Disconnect Context (internal) ──\n\ntype DisconnectFn = () => Promise<void>;\n\nexport const DisconnectContext = createContext<DisconnectFn | null>(null);\n\nexport function useDisconnect(): DisconnectFn | null {\n return useContext(DisconnectContext);\n}\n\n// ── Props ──\n\ninterface ManagedWalletProviderProps {\n appName: string;\n cluster: string;\n storage: TokenStorage;\n renderConnectScreen?: ((props: ConnectWalletScreenProps) => React.ReactNode) | false;\n /** Developer UI config overrides for the connect screen */\n accentColor?: string;\n appIcon?: string;\n tagline?: string;\n /** Deeplink redirect URI for Phantom (required on iOS, optional on Android) */\n redirectUri?: string;\n /** App URL shown in Phantom's connect screen */\n appUrl?: string;\n children: (adapter: WalletAdapter) => React.ReactNode;\n}\n\n// ── Component ──\n\nexport function ManagedWalletProvider({\n appName,\n cluster,\n storage,\n renderConnectScreen,\n accentColor,\n appIcon,\n tagline,\n redirectUri,\n appUrl,\n children,\n}: ManagedWalletProviderProps) {\n const [connected, setConnected] = useState(false);\n const [connecting, setConnecting] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Determine which adapter to use:\n // - Android → MWA (Phantom + other wallets support Mobile Wallet Adapter natively)\n // - iOS → Phantom deeplinks (MWA not available on iOS)\n const resolvedRedirectUri = redirectUri || getDefaultRedirectUri();\n const usePhantom = Platform.OS === 'ios' && !!resolvedRedirectUri;\n\n console.log(TAG, `Platform: ${Platform.OS}, redirectUri: ${resolvedRedirectUri ?? 'none'} (explicit: ${!!redirectUri}), usePhantom: ${usePhantom}`);\n\n const adapterRef = useRef<WalletAdapter | null>(null);\n const transactRef = useRef<any>(null);\n\n // Lazily create adapter — Phantom uses a module-level singleton to survive remounts\n if (!adapterRef.current) {\n if (usePhantom) {\n adapterRef.current = getOrCreatePhantomAdapter({\n redirectUri: resolvedRedirectUri!,\n appUrl,\n cluster,\n storage,\n });\n } else {\n console.log(TAG, 'Creating MwaWalletAdapter');\n adapterRef.current = new MwaWalletAdapter({\n transact: (...args: any[]) => {\n if (!transactRef.current) {\n throw new Error(\n '@dubsdotapp/expo: @solana-mobile/mobile-wallet-adapter-protocol-web3js is required. ' +\n 'Install it with: npm install @solana-mobile/mobile-wallet-adapter-protocol-web3js',\n );\n }\n return transactRef.current(...args);\n },\n appIdentity: { name: appName, uri: appUrl },\n cluster,\n onAuthTokenChange: (token) => {\n if (token) {\n storage.setItem(STORAGE_KEYS.MWA_AUTH_TOKEN, token).catch(() => {});\n } else {\n storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n }\n },\n });\n }\n }\n const adapter = adapterRef.current;\n\n // Restore session / dynamic-import on mount\n useEffect(() => {\n let cancelled = false;\n\n (async () => {\n if (usePhantom) {\n const phantom = adapter as PhantomDeeplinkAdapter;\n\n // If the singleton is already connected (e.g. after returning from Phantom), skip restore\n if (phantom.connected) {\n console.log(TAG, 'Phantom adapter already connected, skipping restore');\n if (!cancelled) {\n setConnected(true);\n setIsReady(true);\n }\n return;\n }\n\n // Check for cold-start recovery (Android killed the app during connect)\n const coldStartUrl = phantom.consumeColdStartUrl();\n if (coldStartUrl) {\n try {\n console.log(TAG, 'Cold-start URL detected, attempting recovery');\n await phantom.completeConnectFromColdStart(coldStartUrl);\n if (!cancelled) {\n console.log(TAG, 'Cold-start recovery succeeded');\n setConnected(true);\n setIsReady(true);\n }\n return;\n } catch (err) {\n console.log(TAG, 'Cold-start recovery failed:', err instanceof Error ? err.message : err);\n // Fall through to normal session restore\n }\n }\n\n try {\n const savedSession = await storage.getItem(STORAGE_KEYS.PHANTOM_SESSION);\n if (savedSession && !cancelled) {\n const session: PhantomSession = JSON.parse(savedSession);\n console.log(TAG, 'Found saved Phantom session, restoring for wallet:', session.walletPublicKey);\n phantom.restoreSession(session);\n if (!cancelled) {\n console.log(TAG, 'Phantom reconnected from saved session');\n setConnected(true);\n }\n } else {\n console.log(TAG, 'No saved Phantom session');\n }\n } catch (err) {\n console.log(TAG, 'Phantom session restore failed:', err instanceof Error ? err.message : err);\n await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {});\n } finally {\n if (!cancelled) {\n console.log(TAG, 'Phantom init complete, marking ready');\n setIsReady(true);\n }\n }\n } else {\n console.log(TAG, 'MWA path — dynamic-importing transact...');\n try {\n const mwa = await import('@solana-mobile/mobile-wallet-adapter-protocol-web3js');\n if (cancelled) return;\n transactRef.current = mwa.transact;\n console.log(TAG, 'MWA transact loaded');\n } catch {\n console.log(TAG, 'MWA not installed — transact will throw on use');\n }\n\n try {\n const savedToken = await storage.getItem(STORAGE_KEYS.MWA_AUTH_TOKEN);\n const savedAddress = await storage.getItem(STORAGE_KEYS.MWA_WALLET_ADDRESS);\n if (savedToken && savedAddress && !cancelled) {\n console.log(TAG, 'Found saved MWA session, restoring silently for wallet:', savedAddress);\n (adapter as MwaWalletAdapter).restoreSession(savedToken, savedAddress);\n setConnected(true);\n } else {\n console.log(TAG, 'No saved MWA session (token or address missing)');\n }\n } catch (err) {\n console.log(TAG, 'MWA session restore failed:', err instanceof Error ? err.message : err);\n await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.MWA_WALLET_ADDRESS).catch(() => {});\n } finally {\n if (!cancelled) {\n console.log(TAG, 'MWA init complete, marking ready');\n setIsReady(true);\n }\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [adapter, storage, usePhantom]);\n\n const handleConnect = useCallback(async () => {\n console.log(TAG, 'handleConnect() — user tapped connect');\n setConnecting(true);\n setError(null);\n try {\n await adapter.connect!();\n const walletAddress = adapter.publicKey?.toBase58();\n console.log(TAG, 'handleConnect() — success, wallet:', walletAddress);\n // Save wallet address for silent session restore on next launch (MWA only)\n if (!usePhantom && walletAddress) {\n storage.setItem(STORAGE_KEYS.MWA_WALLET_ADDRESS, walletAddress).catch(() => {});\n }\n setConnected(true);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Connection failed';\n console.log(TAG, 'handleConnect() — failed:', message);\n setError(message);\n } finally {\n setConnecting(false);\n }\n }, [adapter, storage, usePhantom]);\n\n const disconnect = useCallback(async () => {\n console.log(TAG, 'disconnect() — clearing all state');\n adapter.disconnect?.();\n // Destroy and reset the singleton so a fresh adapter is created on next connect\n if (usePhantom && phantomSingleton) {\n console.log(TAG, 'Destroying Phantom singleton');\n phantomSingleton.destroy();\n phantomSingleton = null;\n adapterRef.current = null;\n }\n await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.MWA_WALLET_ADDRESS).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.PHANTOM_SESSION).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n setConnected(false);\n console.log(TAG, 'disconnect() — done');\n }, [adapter, storage, usePhantom]);\n\n // Show nothing until we've attempted silent reconnect\n if (!isReady) {\n console.log(TAG, 'Not ready yet — rendering null');\n return null;\n }\n\n // Not connected — show connect screen\n if (!connected) {\n if (renderConnectScreen === false) {\n return null;\n }\n const connectProps: ConnectWalletScreenProps = {\n onConnect: handleConnect,\n connecting,\n error,\n appName,\n accentColor,\n appIcon,\n tagline,\n };\n if (renderConnectScreen) {\n return <>{renderConnectScreen(connectProps)}</>;\n }\n return <ConnectWalletScreen {...connectProps} />;\n }\n\n // Connected — render children with adapter + disconnect\n console.log(TAG, 'Rendering children — connected with wallet:', adapter.publicKey?.toBase58());\n return (\n <DisconnectContext.Provider value={disconnect}>\n {children(adapter)}\n </DisconnectContext.Provider>\n );\n}\n","import { PublicKey, Transaction } from '@solana/web3.js';\nimport type { WalletAdapter } from './types';\n\n/** Convert an MWA address (base64 string or Uint8Array) to a PublicKey */\nfunction toPublicKey(address: string | Uint8Array): PublicKey {\n if (address instanceof Uint8Array) {\n return new PublicKey(address);\n }\n // MWA protocol returns addresses as base64 — decode to bytes\n const bytes = Uint8Array.from(atob(address), (c) => c.charCodeAt(0));\n return new PublicKey(bytes);\n}\n\n/** The `transact` function signature from @solana-mobile/mobile-wallet-adapter-protocol-web3js */\nexport type MwaTransactFn = (\n callback: (wallet: any) => Promise<any>,\n) => Promise<any>;\n\nexport interface MwaAdapterConfig {\n /** The MWA `transact` function — import it from @solana-mobile/mobile-wallet-adapter-protocol-web3js */\n transact: MwaTransactFn;\n appIdentity: {\n name: string;\n uri?: string;\n icon?: string;\n };\n cluster?: string;\n onAuthTokenChange?: (token: string | null) => void;\n}\n\n/**\n * Mobile Wallet Adapter implementation.\n * Wraps @solana-mobile/mobile-wallet-adapter-protocol-web3js.\n */\nexport class MwaWalletAdapter implements WalletAdapter {\n private _publicKey: PublicKey | null = null;\n private _connected = false;\n private _authToken: string | null = null;\n /** The raw base64-encoded address from MWA authorize — needed for signMessages */\n private _mwaAddress: string | null = null;\n private readonly config: MwaAdapterConfig;\n private readonly transact: MwaTransactFn;\n\n constructor(config: MwaAdapterConfig) {\n this.config = config;\n this.transact = config.transact;\n }\n\n get publicKey(): PublicKey | null {\n return this._publicKey;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get authToken(): string | null {\n return this._authToken;\n }\n\n setAuthToken(token: string | null): void {\n this._authToken = token;\n }\n\n /**\n * Restore a previous session silently (no wallet interaction).\n * Sets the public key and auth token so the adapter appears connected.\n * The next signing operation will reauthorize with Phantom.\n */\n restoreSession(token: string, walletAddressBase58: string): void {\n this._authToken = token;\n this._publicKey = new PublicKey(walletAddressBase58);\n this._connected = true;\n }\n\n /**\n * Connect to a mobile wallet. Call this before any signing.\n * Tries reauthorize first (if we have a saved token), then falls back to\n * a fresh authorize in a SEPARATE transact session.\n */\n async connect(): Promise<void> {\n // Try reauthorize with saved token in its own transact session\n if (this._authToken) {\n try {\n await this.transact(async (wallet) => {\n const authResult = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(authResult);\n });\n return;\n } catch {\n // Stale token — clear it and do fresh authorize below\n console.log('[Dubs:MWA] reauthorize failed, clearing token and doing fresh authorize');\n this._authToken = null;\n this.config.onAuthTokenChange?.(null);\n }\n }\n\n // Fresh authorize in a new transact session\n await this.transact(async (wallet) => {\n const authResult = await wallet.authorize({\n identity: this.config.appIdentity,\n cluster: this.config.cluster || 'mainnet-beta',\n });\n this.applyAuthResult(authResult);\n });\n }\n\n /**\n * Disconnect and clear auth token.\n */\n disconnect(): void {\n this._publicKey = null;\n this._connected = false;\n this._authToken = null;\n this._mwaAddress = null;\n this.config.onAuthTokenChange?.(null);\n }\n\n async signTransaction(transaction: Transaction): Promise<Transaction> {\n if (!this._connected) throw new Error('Wallet not connected');\n\n const signed = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(reauth);\n\n const result = await wallet.signTransactions({\n transactions: [transaction],\n });\n return result[0];\n });\n\n return signed;\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n if (!this._connected || !this._publicKey) throw new Error('Wallet not connected');\n\n const sig = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(reauth);\n\n const result = await wallet.signMessages({\n addresses: [reauth.accounts[0].address],\n payloads: [message],\n });\n return result[0];\n });\n\n return sig instanceof Uint8Array ? sig : new Uint8Array(sig);\n }\n\n async signAndSendTransaction(transaction: Transaction): Promise<string> {\n if (!this._connected) throw new Error('Wallet not connected');\n\n let signature: any;\n try {\n signature = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this.applyAuthResult(reauth);\n\n const result = await wallet.signAndSendTransactions({\n transactions: [transaction],\n });\n return result[0];\n });\n } catch (err: any) {\n console.error('[Dubs:MWA] ===== signAndSendTransaction ERROR DUMP =====');\n console.error('[Dubs:MWA] typeof:', typeof err);\n console.error('[Dubs:MWA] value:', err);\n console.error('[Dubs:MWA] message:', err?.message);\n console.error('[Dubs:MWA] name:', err?.name);\n console.error('[Dubs:MWA] code:', err?.code);\n console.error('[Dubs:MWA] cause:', err?.cause);\n console.error('[Dubs:MWA] stack:', err?.stack);\n console.error('[Dubs:MWA] JSON:', (() => { try { return JSON.stringify(err, Object.getOwnPropertyNames(err ?? {})); } catch { return 'unstringifiable'; } })());\n console.error('[Dubs:MWA] ===== END DUMP =====');\n throw err;\n }\n\n // MWA returns Uint8Array signature — convert to base58 string\n if (signature instanceof Uint8Array) {\n return new PublicKey(signature).toBase58();\n }\n\n return String(signature);\n }\n\n private applyAuthResult(authResult: any): void {\n this._mwaAddress = authResult.accounts[0].address as string;\n this._publicKey = toPublicKey(this._mwaAddress);\n this._authToken = authResult.auth_token;\n this._connected = true;\n this.config.onAuthTokenChange?.(this._authToken);\n }\n}\n","import { PublicKey, Transaction } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport type { WalletAdapter } from '../types';\nimport type { TokenStorage } from '../../storage';\nimport { STORAGE_KEYS } from '../../storage';\nimport {\n generateKeyPair,\n deriveSharedSecret,\n encryptPayload,\n decryptPayload,\n} from './crypto';\nimport { DeeplinkHandler } from './deeplink-handler';\n\nconst TAG = '[Dubs:PhantomAdapter]';\n\n/** Serializable session state — save this to restore without a deeplink round-trip. */\nexport interface PhantomSession {\n /** Our x25519 public key (base58) */\n dappPublicKey: string;\n /** Our x25519 secret key (base58) */\n dappSecretKey: string;\n /** Phantom's x25519 public key (base58) */\n phantomPublicKey: string;\n /** Shared secret (base58) */\n sharedSecret: string;\n /** Phantom session token (opaque string) */\n sessionToken: string;\n /** User's wallet public key (base58) */\n walletPublicKey: string;\n}\n\nexport interface PhantomDeeplinkAdapterConfig {\n /** The deeplink redirect URI, e.g. \"myapp://phantom-callback\" */\n redirectUri: string;\n /** Shown in Phantom's connect screen */\n appUrl?: string;\n /** Solana cluster: 'devnet' | 'mainnet-beta' */\n cluster?: string;\n /** Deeplink round-trip timeout in ms (default 120000) */\n timeout?: number;\n /** Called when the Phantom session changes (save/clear for persistence) */\n onSessionChange?: (session: PhantomSession | null) => void;\n /** Storage for persisting in-flight connect state (cold-start recovery on Android) */\n storage?: TokenStorage;\n}\n\nlet requestCounter = 0;\nfunction nextRequestId(): string {\n return `req${Date.now()}_${++requestCounter}`;\n}\n\n/**\n * Phantom wallet adapter using deeplinks (works on iOS and Android).\n * Uses x25519 encrypted communication per Phantom's deeplink protocol.\n */\nexport class PhantomDeeplinkAdapter implements WalletAdapter {\n private _publicKey: PublicKey | null = null;\n private _connected = false;\n private _dappKeyPair: { publicKey: Uint8Array; secretKey: Uint8Array } | null = null;\n private _sharedSecret: Uint8Array | null = null;\n private _sessionToken: string | null = null;\n private _phantomPublicKey: Uint8Array | null = null;\n\n private readonly config: PhantomDeeplinkAdapterConfig;\n private readonly handler: DeeplinkHandler;\n private readonly timeout: number;\n\n constructor(config: PhantomDeeplinkAdapterConfig) {\n console.log(TAG, 'Creating adapter with config:', {\n redirectUri: config.redirectUri,\n appUrl: config.appUrl,\n cluster: config.cluster,\n timeout: config.timeout,\n });\n this.config = config;\n this.timeout = config.timeout ?? 120_000;\n this.handler = new DeeplinkHandler(config.redirectUri);\n this.handler.start();\n console.log(TAG, 'Adapter created and deeplink listener started');\n }\n\n get publicKey(): PublicKey | null {\n return this._publicKey;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n /**\n * Restore a previously saved session without opening Phantom.\n * Call this before connect() if you have persisted session state.\n */\n restoreSession(saved: PhantomSession): void {\n console.log(TAG, 'Restoring session for wallet:', saved.walletPublicKey);\n this._dappKeyPair = {\n publicKey: bs58.decode(saved.dappPublicKey),\n secretKey: bs58.decode(saved.dappSecretKey),\n };\n this._phantomPublicKey = bs58.decode(saved.phantomPublicKey);\n this._sharedSecret = bs58.decode(saved.sharedSecret);\n this._sessionToken = saved.sessionToken;\n this._publicKey = new PublicKey(saved.walletPublicKey);\n this._connected = true;\n console.log(TAG, 'Session restored successfully — connected:', this._publicKey.toBase58());\n }\n\n /** Serialize the current session for persistence. Returns null if not connected. */\n getSession(): PhantomSession | null {\n if (\n !this._connected ||\n !this._dappKeyPair ||\n !this._phantomPublicKey ||\n !this._sharedSecret ||\n !this._sessionToken ||\n !this._publicKey\n ) {\n return null;\n }\n return {\n dappPublicKey: bs58.encode(this._dappKeyPair.publicKey),\n dappSecretKey: bs58.encode(this._dappKeyPair.secretKey),\n phantomPublicKey: bs58.encode(this._phantomPublicKey),\n sharedSecret: bs58.encode(this._sharedSecret),\n sessionToken: this._sessionToken,\n walletPublicKey: this._publicKey.toBase58(),\n };\n }\n\n async connect(): Promise<void> {\n console.log(TAG, 'connect() — generating x25519 keypair');\n // Generate a fresh keypair for this connection\n this._dappKeyPair = generateKeyPair();\n const dappPubBase58 = bs58.encode(this._dappKeyPair.publicKey);\n console.log(TAG, 'Dapp public key:', dappPubBase58);\n\n const requestId = nextRequestId();\n // Use clean redirect_link without query params — Phantom appends its own params\n const redirectLink = this.config.redirectUri;\n console.log(TAG, `connect() requestId=${requestId} redirectLink=${redirectLink}`);\n\n // app_url is required by Phantom — default to redirectUri if not provided\n const appUrl = this.config.appUrl || this.config.redirectUri;\n console.log(TAG, 'Using app_url:', appUrl);\n\n const params = new URLSearchParams({\n dapp_encryption_public_key: dappPubBase58,\n // Force mainnet-beta for deeplink session — devnet sessions cause -32603 on signMessage\n cluster: 'mainnet-beta',\n redirect_link: redirectLink,\n app_url: appUrl,\n });\n\n // Persist in-flight state so we can recover if the OS kills the app (Android cold-start)\n if (this.config.storage) {\n console.log(TAG, 'Saving in-flight connect state to storage');\n await this.config.storage.setItem(\n STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT,\n JSON.stringify({\n dappPublicKey: dappPubBase58,\n dappSecretKey: bs58.encode(this._dappKeyPair.secretKey),\n requestId,\n createdAt: Date.now(),\n }),\n );\n }\n\n const url = `https://phantom.app/ul/v1/connect?${params.toString()}`;\n console.log(TAG, 'Opening Phantom connect deeplink...');\n const response = await this.handler.send(url, requestId, this.timeout);\n console.log(TAG, 'Received connect response, param keys:', Object.keys(response.params).join(', '));\n\n // Extract Phantom's public key and derive shared secret\n const phantomPubBase58 = response.params.phantom_encryption_public_key;\n if (!phantomPubBase58) {\n console.log(TAG, 'ERROR: No phantom_encryption_public_key in response');\n throw new Error('Phantom did not return an encryption public key');\n }\n console.log(TAG, 'Phantom public key:', phantomPubBase58);\n\n this._phantomPublicKey = bs58.decode(phantomPubBase58);\n this._sharedSecret = deriveSharedSecret(\n this._dappKeyPair.secretKey,\n this._phantomPublicKey,\n );\n console.log(TAG, 'Shared secret derived, decrypting response...');\n\n // Decrypt the connect response data\n const data = decryptPayload(\n response.params.data,\n response.params.nonce,\n this._sharedSecret,\n );\n console.log(TAG, 'Decrypted connect data — public_key:', data.public_key, 'session length:', data.session?.length);\n\n this._sessionToken = data.session;\n this._publicKey = new PublicKey(data.public_key);\n this._connected = true;\n\n console.log(TAG, 'Connected! Wallet:', this._publicKey.toBase58());\n\n // Notify consumer of new session\n this.config.onSessionChange?.(this.getSession());\n\n // Clear in-flight state now that connect succeeded\n this.config.storage?.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n }\n\n disconnect(): void {\n console.log(TAG, 'disconnect() — clearing state, was connected:', this._connected, 'wallet:', this._publicKey?.toBase58());\n this._publicKey = null;\n this._connected = false;\n this._dappKeyPair = null;\n this._sharedSecret = null;\n this._sessionToken = null;\n this._phantomPublicKey = null;\n this.config.onSessionChange?.(null);\n console.log(TAG, 'Disconnected');\n }\n\n /**\n * Return and clear the stashed cold-start URL from the deeplink handler.\n * Used by ManagedWalletProvider to detect an in-flight connect on cold start.\n */\n consumeColdStartUrl(): string | null {\n return this.handler.getColdStartUrl();\n }\n\n /**\n * Complete a connect flow that was interrupted by the OS killing the app (Android).\n * Loads the saved in-flight keypair from storage, decrypts the Phantom response\n * from the cold-start URL, and restores the session.\n */\n async completeConnectFromColdStart(url: string): Promise<void> {\n if (!this.config.storage) {\n throw new Error('Cannot recover cold-start connect: no storage configured');\n }\n\n console.log(TAG, 'completeConnectFromColdStart() — attempting recovery');\n\n const raw = await this.config.storage.getItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT);\n if (!raw) {\n throw new Error('No in-flight connect state found in storage');\n }\n\n const inFlight = JSON.parse(raw) as {\n dappPublicKey: string;\n dappSecretKey: string;\n requestId: string;\n createdAt: number;\n };\n\n // Check expiry (120s)\n const age = Date.now() - inFlight.createdAt;\n if (age > 120_000) {\n console.log(TAG, `In-flight state expired (${Math.round(age / 1000)}s old), clearing`);\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n throw new Error('In-flight connect state expired');\n }\n\n console.log(TAG, `In-flight state age: ${Math.round(age / 1000)}s, requestId: ${inFlight.requestId}`);\n\n // Restore keypair from storage\n this._dappKeyPair = {\n publicKey: bs58.decode(inFlight.dappPublicKey),\n secretKey: bs58.decode(inFlight.dappSecretKey),\n };\n\n // Parse the Phantom callback URL\n const parsed = new URL(url);\n const params: Record<string, string> = {};\n parsed.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n // Check for Phantom error\n if (params.errorCode) {\n const errorMessage = params.errorMessage\n ? decodeURIComponent(params.errorMessage)\n : `Phantom error code: ${params.errorCode}`;\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n throw new Error(errorMessage);\n }\n\n const phantomPubBase58 = params.phantom_encryption_public_key;\n if (!phantomPubBase58) {\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n throw new Error('Phantom did not return an encryption public key');\n }\n\n console.log(TAG, 'Cold-start: Phantom public key:', phantomPubBase58);\n\n this._phantomPublicKey = bs58.decode(phantomPubBase58);\n this._sharedSecret = deriveSharedSecret(\n this._dappKeyPair.secretKey,\n this._phantomPublicKey,\n );\n\n const data = decryptPayload(params.data, params.nonce, this._sharedSecret);\n console.log(TAG, 'Cold-start: Decrypted connect data — public_key:', data.public_key);\n\n this._sessionToken = data.session;\n this._publicKey = new PublicKey(data.public_key);\n this._connected = true;\n\n console.log(TAG, 'Cold-start recovery complete! Wallet:', this._publicKey.toBase58());\n\n // Notify consumer of new session\n this.config.onSessionChange?.(this.getSession());\n\n // Clear in-flight state\n await this.config.storage.deleteItem(STORAGE_KEYS.PHANTOM_CONNECT_IN_FLIGHT).catch(() => {});\n }\n\n async signTransaction(transaction: Transaction): Promise<Transaction> {\n this.assertConnected();\n console.log(TAG, 'signTransaction() — serializing transaction');\n\n const serializedTx = bs58.encode(\n transaction.serialize({ requireAllSignatures: false, verifySignatures: false }),\n );\n console.log(TAG, 'Transaction serialized, length:', serializedTx.length);\n\n const { nonce, ciphertext } = encryptPayload(\n { transaction: serializedTx, session: this._sessionToken },\n this._sharedSecret!,\n );\n\n const requestId = nextRequestId();\n const redirectLink = this.config.redirectUri;\n console.log(TAG, `signTransaction() requestId=${requestId}`);\n\n const params = new URLSearchParams({\n dapp_encryption_public_key: bs58.encode(this._dappKeyPair!.publicKey),\n nonce,\n payload: ciphertext,\n redirect_link: redirectLink,\n });\n\n const url = `https://phantom.app/ul/v1/signTransaction?${params.toString()}`;\n console.log(TAG, 'Opening Phantom signTransaction deeplink...');\n const response = await this.handler.send(url, requestId, this.timeout);\n console.log(TAG, 'Received signTransaction response');\n\n const data = decryptPayload(\n response.params.data,\n response.params.nonce,\n this._sharedSecret!,\n );\n console.log(TAG, 'Decrypted signed transaction, length:', data.transaction?.length);\n\n return Transaction.from(bs58.decode(data.transaction));\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n this.assertConnected();\n console.log(TAG, 'signMessage() — message length:', message.length);\n\n const encodedMessage = bs58.encode(message);\n // Match Phantom demo app exactly: { session, message } — no display field\n const payload = {\n session: this._sessionToken,\n message: encodedMessage,\n };\n console.log(TAG, 'signMessage() payload keys:', Object.keys(payload).join(', '));\n console.log(TAG, 'signMessage() message (first 40 chars):', encodedMessage.substring(0, 40) + '...');\n console.log(TAG, 'signMessage() session (first 20 chars):', this._sessionToken?.substring(0, 20) + '...');\n console.log(TAG, 'signMessage() sharedSecret length:', this._sharedSecret!.length);\n console.log(TAG, 'signMessage() dappPubKey:', bs58.encode(this._dappKeyPair!.publicKey));\n\n // Verify encryption round-trip before sending\n const { nonce, ciphertext } = encryptPayload(payload, this._sharedSecret!);\n console.log(TAG, 'signMessage() encrypted — nonce length:', bs58.decode(nonce).length, 'ciphertext length:', bs58.decode(ciphertext).length);\n\n // Self-test: verify we can decrypt our own payload\n try {\n const selfTest = decryptPayload(ciphertext, nonce, this._sharedSecret!);\n console.log(TAG, 'signMessage() self-test decrypt OK — keys:', Object.keys(selfTest).join(', '));\n } catch (err) {\n console.log(TAG, 'signMessage() SELF-TEST FAILED:', err instanceof Error ? err.message : err);\n }\n\n const requestId = nextRequestId();\n // Clean redirect_link — no query params. Phantom appends its own response params.\n const redirectLink = this.config.redirectUri;\n console.log(TAG, `signMessage() requestId=${requestId} redirectLink=${redirectLink}`);\n\n const params = new URLSearchParams({\n dapp_encryption_public_key: bs58.encode(this._dappKeyPair!.publicKey),\n nonce,\n payload: ciphertext,\n redirect_link: redirectLink,\n });\n\n const url = `https://phantom.app/ul/v1/signMessage?${params.toString()}`;\n console.log(TAG, 'signMessage() full URL length:', url.length);\n console.log(TAG, 'Opening Phantom signMessage deeplink...');\n const response = await this.handler.send(url, requestId, this.timeout);\n console.log(TAG, 'Received signMessage response');\n\n const data = decryptPayload(\n response.params.data,\n response.params.nonce,\n this._sharedSecret!,\n );\n console.log(TAG, 'Message signed, signature:', data.signature?.substring(0, 20) + '...');\n\n return bs58.decode(data.signature);\n }\n\n /** Remove the Linking event listener. Call when the adapter is no longer needed. */\n destroy(): void {\n console.log(TAG, 'destroy() — cleaning up');\n this.handler.destroy();\n }\n\n private assertConnected(): void {\n if (!this._connected || !this._sharedSecret || !this._sessionToken) {\n console.log(TAG, 'assertConnected FAILED — connected:', this._connected, 'hasSecret:', !!this._sharedSecret, 'hasSession:', !!this._sessionToken);\n throw new Error('Wallet not connected');\n }\n }\n}\n","import nacl from 'tweetnacl';\nimport bs58 from 'bs58';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n}\n\n/** Generate an x25519 keypair for Diffie-Hellman key exchange with Phantom. */\nexport function generateKeyPair(): KeyPair {\n const kp = nacl.box.keyPair();\n return { publicKey: kp.publicKey, secretKey: kp.secretKey };\n}\n\n/** Derive a shared secret from our secret key and Phantom's public key. */\nexport function deriveSharedSecret(\n ourSecretKey: Uint8Array,\n theirPublicKey: Uint8Array,\n): Uint8Array {\n return nacl.box.before(theirPublicKey, ourSecretKey);\n}\n\n/** Encrypt a payload for Phantom using the shared secret. */\nexport function encryptPayload(\n payload: object,\n sharedSecret: Uint8Array,\n): { nonce: string; ciphertext: string } {\n const nonce = nacl.randomBytes(24);\n const message = new TextEncoder().encode(JSON.stringify(payload));\n const encrypted = nacl.box.after(message, nonce, sharedSecret);\n if (!encrypted) throw new Error('Encryption failed');\n return {\n nonce: bs58.encode(nonce),\n ciphertext: bs58.encode(encrypted),\n };\n}\n\n/** Decrypt a payload returned by Phantom using the shared secret. */\nexport function decryptPayload(\n ciphertextBase58: string,\n nonceBase58: string,\n sharedSecret: Uint8Array,\n): Record<string, any> {\n const ciphertext = bs58.decode(ciphertextBase58);\n const nonce = bs58.decode(nonceBase58);\n const decrypted = nacl.box.open.after(ciphertext, nonce, sharedSecret);\n if (!decrypted) throw new Error('Decryption failed — invalid shared secret or corrupted data');\n return JSON.parse(new TextDecoder().decode(decrypted));\n}\n","import { Linking } from 'react-native';\n\nconst TAG = '[Dubs:DeeplinkHandler]';\n\nexport interface DeeplinkResponse {\n /** All query parameters from the redirect URL */\n params: Record<string, string>;\n}\n\ninterface PendingRequest {\n resolve: (response: DeeplinkResponse) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Manages the deeplink round-trip with Phantom:\n * 1. Opens a Phantom deeplink URL\n * 2. Waits for Phantom to redirect back to our `redirectBase`\n * 3. Routes the response to the correct pending promise via request ID\n */\nexport class DeeplinkHandler {\n private readonly redirectBase: string;\n private readonly pending = new Map<string, PendingRequest>();\n private subscription: ReturnType<typeof Linking.addEventListener> | null = null;\n private _coldStartUrl: string | null = null;\n\n constructor(redirectBase: string) {\n // Strip trailing slashes for consistent matching\n this.redirectBase = redirectBase.replace(/\\/+$/, '');\n console.log(TAG, 'Created with redirectBase:', this.redirectBase);\n }\n\n /** Start listening for incoming deeplinks. Call once on adapter init. */\n start(): void {\n if (this.subscription) {\n console.log(TAG, 'Already listening, skipping start()');\n return;\n }\n\n console.log(TAG, 'Starting URL listener');\n this.subscription = Linking.addEventListener('url', ({ url }) => {\n console.log(TAG, 'Received URL event:', url);\n this.handleUrl(url);\n });\n\n // Check for cold-start URL (app was launched via deeplink)\n Linking.getInitialURL().then((url) => {\n if (url) {\n console.log(TAG, 'Cold-start URL found:', url);\n this.handleUrl(url);\n } else {\n console.log(TAG, 'No cold-start URL');\n }\n });\n }\n\n /** Stop listening and reject all pending requests. */\n destroy(): void {\n console.log(TAG, 'Destroying — pending requests:', this.pending.size);\n this.subscription?.remove();\n this.subscription = null;\n\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error('DeeplinkHandler destroyed'));\n this.pending.delete(id);\n }\n }\n\n /**\n * Open a Phantom deeplink and wait for the redirect response.\n * @param url The full Phantom deeplink URL to open\n * @param requestId Unique ID embedded in the redirect_link param\n * @param timeoutMs How long to wait before rejecting (default 120s)\n */\n async send(url: string, requestId: string, timeoutMs = 120_000): Promise<DeeplinkResponse> {\n console.log(TAG, `send() requestId=${requestId} timeout=${timeoutMs}ms`);\n console.log(TAG, 'Opening URL:', url.substring(0, 120) + (url.length > 120 ? '...' : ''));\n\n return new Promise<DeeplinkResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n console.log(TAG, `Timeout reached for requestId=${requestId}`);\n this.pending.delete(requestId);\n reject(new Error(`Phantom deeplink timed out after ${timeoutMs / 1000}s`));\n }, timeoutMs);\n\n this.pending.set(requestId, { resolve, reject, timer });\n\n Linking.openURL(url).catch((err) => {\n console.log(TAG, `Failed to open URL: ${err.message}`);\n this.pending.delete(requestId);\n clearTimeout(timer);\n reject(new Error(`Failed to open Phantom: ${err.message}`));\n });\n });\n }\n\n private handleUrl(url: string): void {\n // Only process URLs that match our redirect base\n if (!url.startsWith(this.redirectBase)) {\n console.log(TAG, 'Ignoring URL (not our redirect base):', url.substring(0, 80));\n return;\n }\n\n console.log(TAG, 'Processing redirect URL:', url.substring(0, 120) + (url.length > 120 ? '...' : ''));\n\n const parsed = new URL(url);\n const params: Record<string, string> = {};\n parsed.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n const paramKeys = Object.keys(params);\n console.log(TAG, 'Parsed params keys:', paramKeys.join(', '));\n\n // Check for Phantom error\n if (params.errorCode) {\n const errorMessage = params.errorMessage\n ? decodeURIComponent(params.errorMessage)\n : `Phantom error code: ${params.errorCode}`;\n console.log(TAG, `Phantom returned error: code=${params.errorCode} message=\"${errorMessage}\"`);\n\n // Route error to the pending request if we can identify it\n const requestId = this.extractRequestId(url);\n if (requestId && this.pending.has(requestId)) {\n console.log(TAG, `Routing error to requestId=${requestId}`);\n const req = this.pending.get(requestId)!;\n clearTimeout(req.timer);\n this.pending.delete(requestId);\n req.reject(new Error(errorMessage));\n return;\n }\n\n // If we can't route it, reject all pending (only one is typically active)\n console.log(TAG, `Cannot route error to specific request, rejecting all ${this.pending.size} pending`);\n for (const [id, req] of this.pending) {\n clearTimeout(req.timer);\n req.reject(new Error(errorMessage));\n this.pending.delete(id);\n }\n return;\n }\n\n // Route success to the correct pending request\n const requestId = this.extractRequestId(url);\n console.log(TAG, `Extracted requestId=${requestId}, pending requests: [${[...this.pending.keys()].join(', ')}]`);\n\n if (requestId && this.pending.has(requestId)) {\n console.log(TAG, `Resolving requestId=${requestId}`);\n const req = this.pending.get(requestId)!;\n clearTimeout(req.timer);\n this.pending.delete(requestId);\n req.resolve({ params });\n return;\n }\n\n // Fallback: resolve the first (and usually only) pending request\n const first = this.pending.entries().next().value;\n if (first) {\n const [id, req] = first;\n console.log(TAG, `Fallback: resolving first pending requestId=${id}`);\n clearTimeout(req.timer);\n this.pending.delete(id);\n req.resolve({ params });\n } else {\n console.log(TAG, 'No pending requests to resolve — stashing as cold-start URL');\n this._coldStartUrl = url;\n }\n }\n\n /** Return and clear the stashed cold-start URL (if any). */\n getColdStartUrl(): string | null {\n const url = this._coldStartUrl;\n this._coldStartUrl = null;\n return url;\n }\n\n /** Extract the request ID from the dubs_rid query parameter. */\n private extractRequestId(url: string): string | null {\n try {\n const parsed = new URL(url);\n return parsed.searchParams.get('dubs_rid');\n } catch {\n return null;\n }\n }\n}\n","import React from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n Image,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\n\nexport interface ConnectWalletScreenProps {\n /** Called when the user taps Connect Wallet */\n onConnect: () => void | Promise<void>;\n /** Show a loading spinner on the button while connecting */\n connecting?: boolean;\n /** Error message to display (e.g. \"User rejected the request\") */\n error?: string | null;\n /** App name shown in the header. Defaults to \"Dubs\" */\n appName?: string;\n /** Override accent color (e.g. from developer UI config) */\n accentColor?: string;\n /** URL to app icon — renders as Image instead of the default letter circle */\n appIcon?: string;\n /** Override subtitle text below app name */\n tagline?: string;\n}\n\nexport function ConnectWalletScreen({\n onConnect,\n connecting = false,\n error = null,\n appName = 'Dubs',\n accentColor,\n appIcon,\n tagline,\n}: ConnectWalletScreenProps) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n\n return (\n <View style={[styles.container, { backgroundColor: t.background }]}>\n <View style={styles.content}>\n {/* Branding */}\n <View style={styles.brandingSection}>\n {appIcon ? (\n <Image\n source={{ uri: appIcon }}\n style={styles.logoImage}\n />\n ) : (\n <View style={[styles.logoCircle, { backgroundColor: accent }]}>\n <Text style={styles.logoText}>\n {appName.charAt(0).toUpperCase()}\n </Text>\n </View>\n )}\n <Text style={[styles.appName, { color: t.text }]}>{appName}</Text>\n <Text style={[styles.subtitle, { color: t.textMuted }]}>\n {tagline || 'Connect your Solana wallet to get started'}\n </Text>\n </View>\n\n {/* Action */}\n <View style={styles.actionSection}>\n {error ? (\n <View\n style={[\n styles.errorBox,\n { backgroundColor: t.errorBg, borderColor: t.errorBorder },\n ]}\n >\n <Text style={[styles.errorText, { color: t.errorText }]}>{error}</Text>\n </View>\n ) : null}\n\n <TouchableOpacity\n style={[styles.connectButton, { backgroundColor: accent }]}\n onPress={onConnect}\n disabled={connecting}\n activeOpacity={0.8}\n >\n {connecting ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : (\n <Text style={styles.connectButtonText}>Connect Wallet</Text>\n )}\n </TouchableOpacity>\n\n <Text style={[styles.hint, { color: t.textDim }]}>\n Phantom, Solflare, or any Solana wallet\n </Text>\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n },\n content: {\n flex: 1,\n justifyContent: 'space-between',\n paddingHorizontal: 32,\n paddingTop: 120,\n paddingBottom: 80,\n },\n brandingSection: {\n alignItems: 'center',\n gap: 12,\n },\n logoCircle: {\n width: 80,\n height: 80,\n borderRadius: 40,\n justifyContent: 'center',\n alignItems: 'center',\n marginBottom: 8,\n },\n logoImage: {\n width: 80,\n height: 80,\n borderRadius: 16,\n marginBottom: 8,\n },\n logoText: {\n fontSize: 36,\n fontWeight: '800',\n color: '#FFFFFF',\n },\n appName: {\n fontSize: 32,\n fontWeight: '800',\n },\n subtitle: {\n fontSize: 16,\n textAlign: 'center',\n lineHeight: 22,\n },\n actionSection: {\n gap: 16,\n },\n errorBox: {\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n errorText: {\n fontSize: 14,\n textAlign: 'center',\n },\n connectButton: {\n height: 56,\n borderRadius: 16,\n justifyContent: 'center',\n alignItems: 'center',\n },\n connectButtonText: {\n color: '#FFFFFF',\n fontSize: 18,\n fontWeight: '700',\n },\n hint: {\n fontSize: 13,\n textAlign: 'center',\n },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n Keyboard,\n KeyboardAvoidingView,\n Platform,\n Image,\n Animated,\n ScrollView,\n} from 'react-native';\nimport { useAuth } from '../hooks';\nimport { usePushNotifications } from '../hooks/usePushNotifications';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport { useDubsTheme } from './theme';\nimport { AvatarEditor, generateSeed, getAvatarUrl } from './AvatarEditor';\nimport type { AuthStatus } from '../types';\nimport type { DubsClient } from '../client';\n\n// ── Public Types ──\n\nexport interface RegistrationScreenProps {\n onRegister: (username: string, referralCode?: string, avatarUrl?: string) => void;\n registering: boolean;\n error: Error | null;\n client: DubsClient;\n}\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n onSaveToken: (token: string | null) => void | Promise<void>;\n onLoadToken: () => string | null | Promise<string | null>;\n renderLoading?: (status: AuthStatus) => React.ReactNode;\n renderError?: (error: Error, retry: () => void) => React.ReactNode;\n renderRegistration?: (props: RegistrationScreenProps) => React.ReactNode;\n appName?: string;\n /** Override accent color for registration screens (from developer UI config) */\n accentColor?: string;\n}\n\n// ── AuthGate Component ──\n\nexport function AuthGate({\n children,\n onSaveToken,\n onLoadToken,\n renderLoading,\n renderError,\n renderRegistration,\n appName = 'Dubs',\n accentColor,\n}: AuthGateProps) {\n const { client, pushEnabled } = useDubs();\n const auth = useAuth();\n const [phase, setPhase] = useState<'init' | 'active'>('init');\n const [registrationPhase, setRegistrationPhase] = useState(false);\n const [showPushSetup, setShowPushSetup] = useState(false);\n const [isRestoredSession, setIsRestoredSession] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const savedToken = await onLoadToken();\n if (cancelled) return;\n if (savedToken) {\n const restored = await auth.restoreSession(savedToken);\n if (cancelled) return;\n if (restored) { setIsRestoredSession(true); setPhase('active'); return; }\n await onSaveToken(null);\n }\n if (cancelled) return;\n setPhase('active');\n await auth.authenticate();\n } catch {\n if (!cancelled) setPhase('active');\n }\n })();\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (auth.status === 'needsRegistration') setRegistrationPhase(true);\n }, [auth.status]);\n\n // Show push setup after new registration completes (not restored sessions)\n useEffect(() => {\n if (pushEnabled && auth.status === 'authenticated' && registrationPhase && !isRestoredSession) {\n setShowPushSetup(true);\n }\n }, [pushEnabled, auth.status, registrationPhase, isRestoredSession]);\n\n useEffect(() => {\n if (auth.token) onSaveToken(auth.token);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [auth.token]);\n\n const retry = useCallback(() => {\n setRegistrationPhase(false);\n auth.reset();\n auth.authenticate();\n }, [auth]);\n\n const handleRegister = useCallback(\n (username: string, referralCode?: string, avatarUrl?: string) => {\n auth.register(username, referralCode, avatarUrl);\n },\n [auth],\n );\n\n // ── Render ──\n\n if (phase === 'init') {\n if (renderLoading) return <>{renderLoading('authenticating')}</>;\n return <DefaultLoadingScreen status=\"authenticating\" appName={appName} accentColor={accentColor} />;\n }\n\n if (auth.status === 'authenticated') {\n if (showPushSetup) {\n return (\n <PushSetupScreen\n accentColor={accentColor}\n appName={appName}\n onComplete={() => setShowPushSetup(false)}\n />\n );\n }\n return (\n <AuthContext.Provider value={auth}>\n {pushEnabled && <PushTokenRestorer />}\n {children}\n </AuthContext.Provider>\n );\n }\n\n if (registrationPhase) {\n const isRegistering = auth.status === 'registering';\n const regError = auth.status === 'error' ? auth.error : null;\n if (renderRegistration) {\n return <>{renderRegistration({ onRegister: handleRegister, registering: isRegistering, error: regError, client })}</>;\n }\n return (\n <DefaultRegistrationScreen\n onRegister={handleRegister}\n registering={isRegistering}\n error={regError}\n client={client}\n appName={appName}\n accentColor={accentColor}\n />\n );\n }\n\n if (auth.status === 'error' && auth.error) {\n if (renderError) return <>{renderError(auth.error, retry)}</>;\n return <DefaultErrorScreen error={auth.error} onRetry={retry} appName={appName} accentColor={accentColor} />;\n }\n\n if (renderLoading) return <>{renderLoading(auth.status)}</>;\n return <DefaultLoadingScreen status={auth.status} appName={appName} accentColor={accentColor} />;\n}\n\n// ── Default Loading Screen ──\n\nfunction DefaultLoadingScreen({ status, appName, accentColor }: { status: AuthStatus; appName: string; accentColor?: string }) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n const statusText: Record<AuthStatus, string> = {\n idle: 'Initializing...',\n authenticating: 'Connecting...',\n signing: 'Approve in your wallet...',\n verifying: 'Verifying...',\n registering: 'Creating account...',\n needsRegistration: 'Almost there...',\n authenticated: 'Ready!',\n error: 'Something went wrong',\n };\n return (\n <View style={[s.container, { backgroundColor: t.background }]}>\n <View style={s.centerContent}>\n <View style={s.brandingSection}>\n <View style={[s.logoCircle, { backgroundColor: accent }]}>\n <Text style={s.logoText}>D</Text>\n </View>\n <Text style={[s.appNameText, { color: t.text }]}>{appName}</Text>\n </View>\n <View style={s.loadingSection}>\n <ActivityIndicator size=\"large\" color={accent} />\n <Text style={[s.statusText, { color: t.textMuted }]}>{statusText[status] || 'Loading...'}</Text>\n </View>\n </View>\n </View>\n );\n}\n\n// ── Default Error Screen ──\n\nfunction DefaultErrorScreen({ error, onRetry, appName, accentColor }: { error: Error; onRetry: () => void; appName: string; accentColor?: string }) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n return (\n <View style={[s.container, { backgroundColor: t.background }]}>\n <View style={s.spreadContent}>\n <View style={s.brandingSection}>\n <View style={[s.logoCircle, { backgroundColor: accent }]}>\n <Text style={s.logoText}>D</Text>\n </View>\n <Text style={[s.appNameText, { color: t.text }]}>{appName}</Text>\n </View>\n <View style={{ gap: 16 }}>\n <View style={[s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[s.errorText, { color: t.errorText }]}>{error.message}</Text>\n </View>\n <TouchableOpacity style={[s.primaryBtn, { backgroundColor: accent }]} onPress={onRetry} activeOpacity={0.8}>\n <Text style={s.primaryBtnText}>Try Again</Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n );\n}\n\n// ── Step Indicator ──\n\nfunction StepIndicator({ currentStep }: { currentStep: number }) {\n const t = useDubsTheme();\n const steps = [0, 1, 2, 3];\n return (\n <View style={s.stepRow}>\n {steps.map((i) => (\n <React.Fragment key={i}>\n {i > 0 && (\n <View style={[s.stepLine, { backgroundColor: i <= currentStep ? t.success : t.border }]} />\n )}\n <View\n style={[\n s.stepCircle,\n i < currentStep\n ? { backgroundColor: t.success }\n : i === currentStep\n ? { backgroundColor: t.accent }\n : { backgroundColor: 'transparent', borderWidth: 2, borderColor: t.border },\n ]}\n >\n {i < currentStep ? (\n <Text style={s.stepCheck}>✓</Text>\n ) : (\n <Text style={[s.stepNum, { color: i === currentStep ? '#FFF' : t.textMuted }]}>{i + 1}</Text>\n )}\n </View>\n </React.Fragment>\n ))}\n </View>\n );\n}\n\n// ── Default Registration Screen (3-Step Onboarding) ──\n\nfunction DefaultRegistrationScreen({\n onRegister,\n registering,\n error,\n client,\n appName,\n accentColor,\n}: RegistrationScreenProps & { appName: string; accentColor?: string }) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n\n // ── Shared state ──\n const [step, setStep] = useState(0);\n const [avatarSeed, setAvatarSeed] = useState(generateSeed);\n const [avatarStyle, setAvatarStyle] = useState('adventurer');\n const [avatarBg, setAvatarBg] = useState('1a1a2e');\n const [showStyles, setShowStyles] = useState(false);\n const [username, setUsername] = useState('');\n const [referralCode, setReferralCode] = useState('');\n const [checking, setChecking] = useState(false);\n const [availability, setAvailability] = useState<{ available: boolean; reason?: string } | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // ── Animation ──\n const fadeAnim = useRef(new Animated.Value(1)).current;\n const slideAnim = useRef(new Animated.Value(0)).current;\n\n const avatarUrl = getAvatarUrl(avatarStyle, avatarSeed, avatarBg);\n\n // Debounced username check\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const trimmed = username.trim();\n if (trimmed.length < 3) { setAvailability(null); setChecking(false); return; }\n setChecking(true);\n debounceRef.current = setTimeout(async () => {\n try {\n const result = await client.checkUsername(trimmed);\n setAvailability(result);\n } catch { setAvailability(null); }\n finally { setChecking(false); }\n }, 500);\n return () => { if (debounceRef.current) clearTimeout(debounceRef.current); };\n }, [username, client]);\n\n const animateToStep = useCallback((newStep: number) => {\n const dir = newStep > step ? 1 : -1;\n Keyboard.dismiss();\n Animated.parallel([\n Animated.timing(fadeAnim, { toValue: 0, duration: 120, useNativeDriver: true }),\n Animated.timing(slideAnim, { toValue: -dir * 40, duration: 120, useNativeDriver: true }),\n ]).start(() => {\n setStep(newStep);\n slideAnim.setValue(dir * 40);\n Animated.parallel([\n Animated.timing(fadeAnim, { toValue: 1, duration: 200, useNativeDriver: true }),\n Animated.timing(slideAnim, { toValue: 0, duration: 200, useNativeDriver: true }),\n ]).start();\n });\n }, [step, fadeAnim, slideAnim]);\n\n const canContinueUsername =\n username.trim().length >= 3 && availability?.available === true && !checking;\n\n const handleSubmit = () => {\n Keyboard.dismiss();\n onRegister(username.trim(), referralCode.trim() || undefined, avatarUrl);\n };\n\n // ── Step 1: Avatar ──\n const renderAvatarStep = () => (\n <View style={s.stepContainer}>\n <View style={s.stepTop}>\n <Text style={[s.title, { color: t.text }]}>Choose Your Avatar</Text>\n <Text style={[s.subtitle, { color: t.textMuted }]}>Pick a look that represents you</Text>\n <StepIndicator currentStep={0} />\n\n <View style={s.avatarCenter}>\n <View style={[s.avatarFrame, { borderColor: accent }]}>\n <Image source={{ uri: avatarUrl }} style={s.avatarLarge} />\n <View style={[s.checkBadge, { backgroundColor: t.success }]}>\n <Text style={s.checkBadgeText}>✓</Text>\n </View>\n </View>\n </View>\n\n <View style={s.avatarActions}>\n <TouchableOpacity\n style={[s.outlineBtn, { borderColor: t.border }]}\n onPress={() => setAvatarSeed(generateSeed())}\n activeOpacity={0.7}\n >\n <Text style={[s.outlineBtnText, { color: t.text }]}>↻ Shuffle</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.outlineBtn, { borderColor: accent, backgroundColor: accent + '15' }]}\n onPress={() => setShowStyles(!showStyles)}\n activeOpacity={0.7}\n >\n <Text style={[s.outlineBtnText, { color: accent }]}>☺ Customize</Text>\n </TouchableOpacity>\n </View>\n\n {showStyles && (\n <View style={s.styleScroll}>\n <AvatarEditor\n style={avatarStyle}\n seed={avatarSeed}\n bg={avatarBg}\n onStyleChange={setAvatarStyle}\n onSeedChange={setAvatarSeed}\n onBgChange={setAvatarBg}\n accentColor={accent}\n />\n </View>\n )}\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1 }]}\n onPress={() => animateToStep(1)}\n activeOpacity={0.8}\n >\n <Text style={s.primaryBtnText}>Continue ›</Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n\n // ── Step 2: Username ──\n const renderUsernameStep = () => (\n <View style={s.stepContainer}>\n <View style={s.stepTop}>\n <View style={s.headerRow}>\n <TouchableOpacity onPress={() => animateToStep(0)} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}>\n <Text style={[s.backChevron, { color: t.text }]}>‹</Text>\n </TouchableOpacity>\n <Text style={[s.titleInline, { color: t.text }]}>Pick a Username</Text>\n </View>\n <Text style={[s.subtitle, { color: t.textMuted }]}>This is how others will see you</Text>\n <StepIndicator currentStep={1} />\n\n <View style={s.avatarCenter}>\n <View style={[s.avatarFrameSmall, { borderColor: accent }]}>\n <Image source={{ uri: avatarUrl }} style={s.avatarSmall} />\n <View style={[s.checkBadgeSm, { backgroundColor: t.success }]}>\n <Text style={s.checkBadgeTextSm}>✓</Text>\n </View>\n </View>\n </View>\n\n <View style={s.inputGroup}>\n <Text style={[s.inputLabel, { color: t.text }]}>\n Username <Text style={{ color: t.errorText }}>*</Text>\n </Text>\n <TextInput\n style={[s.input, { backgroundColor: t.surface, color: t.text, borderColor: accent }]}\n placeholder=\"Enter username\"\n placeholderTextColor={t.textDim}\n value={username}\n onChangeText={setUsername}\n autoCapitalize=\"none\"\n autoCorrect={false}\n autoFocus\n />\n {checking ? (\n <Text style={[s.hint, { color: t.textDim }]}>Checking...</Text>\n ) : availability ? (\n <Text style={[s.hint, { color: availability.available ? t.success : t.errorText }]}>\n {availability.available ? '\\u2713 Available!' : (availability.reason || 'Username taken')}\n </Text>\n ) : username.trim().length > 0 && username.trim().length < 3 ? (\n <Text style={[s.hint, { color: t.textDim }]}>At least 3 characters</Text>\n ) : null}\n </View>\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.secondaryBtn, { borderColor: t.border }]}\n onPress={() => animateToStep(0)}\n activeOpacity={0.7}\n >\n <Text style={[s.secondaryBtnText, { color: t.text }]}>‹ Back</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: canContinueUsername ? 1 : 0.4 }]}\n onPress={() => animateToStep(2)}\n disabled={!canContinueUsername}\n activeOpacity={0.8}\n >\n <Text style={s.primaryBtnText}>Continue ›</Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n\n // ── Step 3: Referral + Create ──\n const renderReferralStep = () => (\n <View style={s.stepContainer}>\n <View style={s.stepTop}>\n <View style={s.headerRow}>\n <TouchableOpacity onPress={() => animateToStep(1)} hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}>\n <Text style={[s.backChevron, { color: t.text }]}>‹</Text>\n </TouchableOpacity>\n <Text style={[s.titleInline, { color: t.text }]}>Almost There!</Text>\n </View>\n <Text style={[s.subtitle, { color: t.textMuted }]}>Got a referral code? (optional)</Text>\n <StepIndicator currentStep={2} />\n\n {/* Profile preview card */}\n <View style={[s.profileCard, { borderColor: t.border }]}>\n <Text style={[s.profileLabel, { color: t.textMuted }]}>Your Profile</Text>\n <View style={s.profileRow}>\n <Image source={{ uri: avatarUrl }} style={s.profileAvatar} />\n <View style={{ gap: 4 }}>\n <Text style={[s.profileUsername, { color: t.text }]}>@{username}</Text>\n <Text style={[s.profileReady, { color: t.success }]}>{'\\u2713'} Ready to go!</Text>\n </View>\n </View>\n </View>\n\n {error ? (\n <View style={[s.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[s.errorText, { color: t.errorText }]}>{error.message}</Text>\n </View>\n ) : null}\n\n <View style={s.inputGroup}>\n <Text style={[s.inputLabel, { color: t.text }]}>\n Referral Code <Text style={{ color: t.textMuted }}>(optional)</Text>\n </Text>\n <TextInput\n style={[s.input, { backgroundColor: t.surface, color: t.text, borderColor: t.border }]}\n placeholder=\"Enter referral code\"\n placeholderTextColor={t.textDim}\n value={referralCode}\n onChangeText={setReferralCode}\n autoCapitalize=\"none\"\n autoCorrect={false}\n editable={!registering}\n />\n <Text style={[s.hint, { color: t.textMuted }]}>\n {'\\uD83C\\uDF81'} If a friend invited you, enter their code to give them credit!\n </Text>\n </View>\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.secondaryBtn, { borderColor: t.border }]}\n onPress={() => animateToStep(1)}\n disabled={registering}\n activeOpacity={0.7}\n >\n <Text style={[s.secondaryBtnText, { color: t.text }]}>‹ Back</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: registering ? 0.7 : 1 }]}\n onPress={handleSubmit}\n disabled={registering}\n activeOpacity={0.8}\n >\n {registering ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : (\n <Text style={s.primaryBtnText}>Create Account</Text>\n )}\n </TouchableOpacity>\n </View>\n </View>\n );\n\n const renderStep = () => {\n switch (step) {\n case 0: return renderAvatarStep();\n case 1: return renderUsernameStep();\n case 2: return renderReferralStep();\n default: return null;\n }\n };\n\n return (\n <KeyboardAvoidingView\n style={[s.container, { backgroundColor: t.background }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <ScrollView\n contentContainerStyle={{ flexGrow: 1 }}\n keyboardShouldPersistTaps=\"handled\"\n bounces={false}\n >\n <Animated.View\n style={[\n { flex: 1 },\n { opacity: fadeAnim, transform: [{ translateX: slideAnim }] },\n ]}\n >\n {renderStep()}\n </Animated.View>\n </ScrollView>\n </KeyboardAvoidingView>\n );\n}\n\n// ── Push Token Restorer (silent, zero UI) ──\n// Runs inside DubsContext + AuthGate when user is authenticated.\n// Silently re-registers the push token for returning users who already granted permission.\n// Does NOT prompt — the prompt only happens in PushSetupScreen during onboarding.\n\nfunction PushTokenRestorer() {\n const push = usePushNotifications();\n const restored = useRef(false);\n\n useEffect(() => {\n if (restored.current) return;\n restored.current = true;\n push.restoreIfGranted();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return null;\n}\n\n// ── Push Setup Screen (Step 3 of onboarding) ──\n\nfunction PushSetupScreen({\n accentColor,\n appName,\n onComplete,\n}: {\n accentColor?: string;\n appName: string;\n onComplete: () => void;\n}) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n const push = usePushNotifications();\n const fadeAnim = useRef(new Animated.Value(0)).current;\n const slideAnim = useRef(new Animated.Value(30)).current;\n\n useEffect(() => {\n Animated.parallel([\n Animated.timing(fadeAnim, { toValue: 1, duration: 300, useNativeDriver: true }),\n Animated.timing(slideAnim, { toValue: 0, duration: 300, useNativeDriver: true }),\n ]).start();\n }, [fadeAnim, slideAnim]);\n\n const handleEnable = async () => {\n await push.register();\n onComplete();\n };\n\n const benefits = [\n 'A fight you picked on goes LIVE',\n 'Your pick wins or loses',\n 'Final results and rankings',\n ];\n\n return (\n <View style={[s.container, { backgroundColor: t.background }]}>\n <Animated.View\n style={[\n s.stepContainer,\n { opacity: fadeAnim, transform: [{ translateY: slideAnim }] },\n ]}\n >\n <View style={s.stepTop}>\n <Text style={[s.title, { color: t.text }]}>Enable Notifications</Text>\n <Text style={[s.subtitle, { color: t.textMuted }]}>\n Stay in the loop with real-time updates\n </Text>\n <StepIndicator currentStep={3} />\n\n <View style={pushStyles.iconContainer}>\n <View style={[pushStyles.bellCircle, { backgroundColor: accent + '20' }]}>\n <Text style={[pushStyles.bellIcon, { color: accent }]}>{'\\uD83D\\uDD14'}</Text>\n </View>\n </View>\n\n <View style={pushStyles.benefitsList}>\n <Text style={[pushStyles.benefitsHeader, { color: t.text }]}>\n Get real-time updates when:\n </Text>\n {benefits.map((item, i) => (\n <View key={i} style={pushStyles.benefitRow}>\n <View style={[pushStyles.bulletDot, { backgroundColor: accent }]} />\n <Text style={[pushStyles.benefitText, { color: t.textMuted }]}>{item}</Text>\n </View>\n ))}\n </View>\n </View>\n\n <View style={s.bottomRow}>\n <TouchableOpacity\n style={[s.secondaryBtn, { borderColor: t.border }]}\n onPress={onComplete}\n activeOpacity={0.7}\n >\n <Text style={[s.secondaryBtnText, { color: t.textMuted }]}>Maybe Later</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[s.primaryBtn, { backgroundColor: accent, flex: 1, opacity: push.loading ? 0.7 : 1 }]}\n onPress={handleEnable}\n disabled={push.loading}\n activeOpacity={0.8}\n >\n {push.loading ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : (\n <Text style={s.primaryBtnText}>Enable Notifications</Text>\n )}\n </TouchableOpacity>\n </View>\n </Animated.View>\n </View>\n );\n}\n\nconst pushStyles = StyleSheet.create({\n iconContainer: { alignItems: 'center', marginVertical: 24 },\n bellCircle: { width: 100, height: 100, borderRadius: 50, justifyContent: 'center', alignItems: 'center' },\n bellIcon: { fontSize: 48 },\n benefitsList: { paddingHorizontal: 24, gap: 12, marginTop: 8 },\n benefitsHeader: { fontSize: 17, fontWeight: '700', marginBottom: 4 },\n benefitRow: { flexDirection: 'row', alignItems: 'center', gap: 12 },\n bulletDot: { width: 8, height: 8, borderRadius: 4 },\n benefitText: { fontSize: 16, flex: 1 },\n});\n\n// ── Styles ──\n\nconst s = StyleSheet.create({\n container: { flex: 1 },\n // Loading / Error\n centerContent: { flex: 1, justifyContent: 'center', alignItems: 'center', paddingHorizontal: 32, gap: 48 },\n spreadContent: { flex: 1, justifyContent: 'space-between', paddingHorizontal: 32, paddingTop: 120, paddingBottom: 80 },\n brandingSection: { alignItems: 'center', gap: 12 },\n logoCircle: { width: 80, height: 80, borderRadius: 40, justifyContent: 'center', alignItems: 'center', marginBottom: 8 },\n logoText: { fontSize: 36, fontWeight: '800', color: '#FFFFFF' },\n appNameText: { fontSize: 32, fontWeight: '800' },\n loadingSection: { alignItems: 'center', gap: 16 },\n statusText: { fontSize: 16, textAlign: 'center' },\n errorBox: { borderWidth: 1, borderRadius: 12, paddingHorizontal: 16, paddingVertical: 12 },\n errorText: { fontSize: 14, textAlign: 'center' },\n // Step indicator\n stepRow: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 24, marginVertical: 16 },\n stepLine: { flex: 1, height: 2 },\n stepCircle: { width: 36, height: 36, borderRadius: 18, justifyContent: 'center', alignItems: 'center' },\n stepCheck: { color: '#FFF', fontSize: 16, fontWeight: '700' },\n stepNum: { fontSize: 14, fontWeight: '700' },\n // Onboarding layout\n stepContainer: { flex: 1, justifyContent: 'space-between', paddingBottom: 40 },\n stepTop: { gap: 8, paddingTop: 64 },\n headerRow: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 24 },\n backChevron: { fontSize: 32, fontWeight: '300', lineHeight: 36, marginTop: -2 },\n title: { fontSize: 28, fontWeight: '800', paddingHorizontal: 24 },\n titleInline: { fontSize: 28, fontWeight: '800' },\n subtitle: { fontSize: 15, paddingHorizontal: 24, lineHeight: 20 },\n // Avatar\n avatarCenter: { alignItems: 'center', marginVertical: 12 },\n avatarFrame: { borderWidth: 3, borderRadius: 20, padding: 4 },\n avatarLarge: { width: 160, height: 160, borderRadius: 16, backgroundColor: '#E5E5EA' },\n checkBadge: { position: 'absolute', bottom: -6, right: -6, width: 28, height: 28, borderRadius: 14, justifyContent: 'center', alignItems: 'center' },\n checkBadgeText: { color: '#FFF', fontSize: 15, fontWeight: '700' },\n avatarFrameSmall: { borderWidth: 3, borderRadius: 14, padding: 3 },\n avatarSmall: { width: 100, height: 100, borderRadius: 12, backgroundColor: '#E5E5EA' },\n checkBadgeSm: { position: 'absolute', bottom: -4, right: -4, width: 22, height: 22, borderRadius: 11, justifyContent: 'center', alignItems: 'center' },\n checkBadgeTextSm: { color: '#FFF', fontSize: 12, fontWeight: '700' },\n avatarActions: { flexDirection: 'row', justifyContent: 'center', gap: 12, paddingHorizontal: 24 },\n outlineBtn: { borderWidth: 1.5, borderRadius: 12, paddingHorizontal: 20, paddingVertical: 12 },\n outlineBtnText: { fontSize: 15, fontWeight: '600' },\n styleScroll: { paddingHorizontal: 24, marginTop: 4 },\n styleThumbWrap: { borderWidth: 2, borderRadius: 12, padding: 3, marginRight: 10 },\n styleThumb: { width: 52, height: 52, borderRadius: 10, backgroundColor: '#E5E5EA' },\n // Input\n inputGroup: { paddingHorizontal: 24, gap: 6 },\n inputLabel: { fontSize: 15, fontWeight: '600' },\n input: { height: 56, borderRadius: 16, borderWidth: 1.5, paddingHorizontal: 16, fontSize: 16 },\n hint: { fontSize: 13, paddingLeft: 4 },\n // Profile card\n profileCard: { marginHorizontal: 24, borderWidth: 1, borderRadius: 16, padding: 16, gap: 12 },\n profileLabel: { fontSize: 13 },\n profileRow: { flexDirection: 'row', alignItems: 'center', gap: 14 },\n profileAvatar: { width: 56, height: 56, borderRadius: 12, backgroundColor: '#E5E5EA' },\n profileUsername: { fontSize: 20, fontWeight: '800' },\n profileReady: { fontSize: 14, fontWeight: '600' },\n // Buttons\n bottomRow: { flexDirection: 'row', gap: 12, paddingHorizontal: 24 },\n primaryBtn: { height: 56, borderRadius: 16, justifyContent: 'center', alignItems: 'center' },\n primaryBtnText: { color: '#FFFFFF', fontSize: 18, fontWeight: '700' },\n secondaryBtn: { height: 56, borderRadius: 16, borderWidth: 1.5, justifyContent: 'center', alignItems: 'center', paddingHorizontal: 24 },\n secondaryBtnText: { fontSize: 16, fontWeight: '600' },\n});\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UnifiedEvent, Pagination, GetUpcomingEventsParams, QueryResult } from '../types';\n\nexport function useEvents(\n params?: GetUpcomingEventsParams,\n): QueryResult<{ events: UnifiedEvent[]; pagination: Pagination }> {\n const { client } = useDubs();\n const [data, setData] = useState<{ events: UnifiedEvent[]; pagination: Pagination } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Serialize params for dependency comparison\n const paramKey = JSON.stringify(params ?? {});\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.getUpcomingEvents(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameDetail, QueryResult } from '../types';\n\nexport function useGame(gameId: string | null): QueryResult<GameDetail> {\n const { client } = useDubs();\n const [data, setData] = useState<GameDetail | null>(null);\n const [loading, setLoading] = useState(!!gameId);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!gameId) return;\n setLoading(true);\n setError(null);\n try {\n const game = await client.getGame(gameId);\n setData(game);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, gameId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameListItem, GetGamesParams, QueryResult } from '../types';\n\nexport function useGames(params?: GetGamesParams): QueryResult<GameListItem[]> {\n const { client } = useDubs();\n const [data, setData] = useState<GameListItem[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const paramKey = JSON.stringify(params ?? {});\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const games = await client.getGames(params);\n setData(games);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { GameListItem, Pagination, GetNetworkGamesParams, QueryResult } from '../types';\n\nexport function useNetworkGames(params?: GetNetworkGamesParams): QueryResult<{ games: GameListItem[]; pagination: Pagination }> {\n const { client } = useDubs();\n const [data, setData] = useState<{ games: GameListItem[]; pagination: Pagination } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const paramKey = JSON.stringify(params ?? {});\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.getNetworkGames(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, paramKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { CreateGameParams, MutationStatus } from '../types';\n\nexport interface CreateGameMutationResult {\n gameId: string;\n gameAddress: string;\n signature: string;\n explorerUrl: string;\n}\n\nexport function useCreateGame() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<CreateGameMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: CreateGameParams): Promise<CreateGameMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned transaction\n console.log('[useCreateGame] Step 1: Building transaction...');\n const createResult = await client.createGame(params);\n console.log('[useCreateGame] Step 1 done:', { gameId: createResult.gameId, gameAddress: createResult.gameAddress });\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useCreateGame] Step 2: Signing and sending...');\n const signature = await signAndSendBase64Transaction(\n createResult.transaction,\n wallet,\n connection,\n );\n console.log('[useCreateGame] Step 2 done. Signature:', signature);\n\n // 3. Confirm with backend (server handles on-chain verification)\n setStatus('confirming');\n console.log('[useCreateGame] Step 3: Confirming with backend...');\n const confirmResult = await client.confirmGame({\n gameId: createResult.gameId,\n playerWallet: params.playerWallet,\n signature,\n teamChoice: params.teamChoice,\n wagerAmount: params.wagerAmount,\n role: 'creator',\n gameAddress: createResult.gameAddress,\n });\n console.log('[useCreateGame] Step 3 done.');\n\n const result: CreateGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useCreateGame] Complete!');\n return result;\n } catch (err) {\n console.error('[useCreateGame] FAILED:', err);\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { Transaction, Connection } from '@solana/web3.js';\nimport type { WalletAdapter } from '../wallet/types';\n\n/**\n * Deserialize a base64-encoded transaction, sign via wallet adapter, send to Solana.\n * Prefers signAndSendTransaction if available (MWA), otherwise falls back to\n * signTransaction + sendRawTransaction via RPC (Phantom deeplinks).\n * Returns the transaction signature.\n */\nexport async function signAndSendBase64Transaction(\n base64Tx: string,\n wallet: WalletAdapter,\n connection: Connection,\n): Promise<string> {\n if (!wallet.publicKey) throw new Error('Wallet not connected');\n\n const binaryStr = atob(base64Tx);\n const bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n const transaction = Transaction.from(bytes);\n\n // Prefer signAndSendTransaction if wallet supports it (e.g. MWA)\n if (wallet.signAndSendTransaction) {\n return wallet.signAndSendTransaction(transaction);\n }\n\n // Fallback: sign via wallet, then send via RPC\n const signed = await wallet.signTransaction(transaction);\n const signature = await connection.sendRawTransaction(signed.serialize());\n return signature;\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { JoinGameParams, MutationStatus } from '../types';\n\nexport interface JoinGameMutationResult {\n gameId: string;\n gameAddress: string;\n signature: string;\n explorerUrl: string;\n}\n\nexport function useJoinGame() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<JoinGameMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: JoinGameParams): Promise<JoinGameMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned transaction\n console.log('[useJoinGame] Step 1: Building transaction...', { gameId: params.gameId, playerWallet: params.playerWallet, teamChoice: params.teamChoice, amount: params.amount });\n const joinResult = await client.joinGame(params);\n console.log('[useJoinGame] Step 1 done:', { gameId: joinResult.gameId, gameAddress: joinResult.gameAddress, hasTx: !!joinResult.transaction });\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useJoinGame] Step 2: Signing and sending transaction...');\n const signature = await signAndSendBase64Transaction(\n joinResult.transaction,\n wallet,\n connection,\n );\n console.log('[useJoinGame] Step 2 done. Signature:', signature);\n\n // 3. Confirm with backend (server handles on-chain verification)\n setStatus('confirming');\n const confirmParams = {\n gameId: params.gameId,\n playerWallet: params.playerWallet,\n signature,\n teamChoice: params.teamChoice,\n wagerAmount: params.amount,\n role: 'joiner' as const,\n gameAddress: joinResult.gameAddress,\n };\n console.log('[useJoinGame] Step 3: Confirming with backend...', confirmParams);\n const confirmResult = await client.confirmGame(confirmParams);\n console.log('[useJoinGame] Step 3 done. Backend confirmed.');\n\n const result: JoinGameMutationResult = {\n gameId: params.gameId,\n gameAddress: joinResult.gameAddress,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useJoinGame] Complete!');\n return result;\n } catch (err) {\n console.error('[useJoinGame] FAILED at status:', status, err);\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { BuildClaimParams, MutationStatus } from '../types';\n\nexport interface ClaimMutationResult {\n gameId: string;\n signature: string;\n explorerUrl: string;\n}\n\nexport function useClaim() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<ClaimMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: BuildClaimParams & { amountClaimed?: number }): Promise<ClaimMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned claim transaction\n console.log('[useClaim] Step 1: Building claim transaction...');\n const claimResult = await client.buildClaimTransaction(params);\n console.log('[useClaim] Step 1 done.');\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useClaim] Step 2: Signing and sending...');\n const signature = await signAndSendBase64Transaction(\n claimResult.transaction,\n wallet,\n connection,\n );\n console.log('[useClaim] Step 2 done. Signature:', signature);\n\n // 3. Confirm claim with backend (records signature + amount in DB)\n setStatus('confirming');\n console.log('[useClaim] Step 3: Confirming claim...');\n const confirmResult = await client.confirmClaim(params.gameId, {\n playerWallet: params.playerWallet,\n signature,\n amountClaimed: params.amountClaimed,\n });\n console.log('[useClaim] Step 3 done.');\n\n const result: ClaimMutationResult = {\n gameId: params.gameId,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useClaim] Complete!');\n return result;\n } catch (err: any) {\n console.error('[useClaim] ===== CLAIM ERROR DUMP =====');\n console.error('[useClaim] typeof:', typeof err);\n console.error('[useClaim] value:', err);\n console.error('[useClaim] message:', err?.message);\n console.error('[useClaim] name:', err?.name);\n console.error('[useClaim] code:', err?.code);\n console.error('[useClaim] cause:', err?.cause);\n console.error('[useClaim] stack:', err?.stack);\n console.error('[useClaim] JSON:', (() => { try { return JSON.stringify(err, Object.getOwnPropertyNames(err ?? {})); } catch { return 'unstringifiable'; } })());\n console.error('[useClaim] ===== END DUMP =====');\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { useState, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport { signAndSendBase64Transaction } from '../utils/transaction';\nimport type { CreateCustomGameParams, MutationStatus } from '../types';\n\nexport interface CreateCustomGameMutationResult {\n gameId: string;\n gameAddress: string;\n signature: string;\n explorerUrl: string;\n buyIn: number;\n}\n\nexport function useCreateCustomGame() {\n const { client, wallet, connection } = useDubs();\n const [status, setStatus] = useState<MutationStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<CreateCustomGameMutationResult | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n }, []);\n\n const execute = useCallback(async (params: CreateCustomGameParams): Promise<CreateCustomGameMutationResult> => {\n setStatus('building');\n setError(null);\n setData(null);\n\n try {\n // 1. Build unsigned transaction\n console.log('[useCreateCustomGame] Step 1: Building transaction...');\n const createResult = await client.createCustomGame(params);\n console.log('[useCreateCustomGame] Step 1 done:', { gameId: createResult.gameId, gameAddress: createResult.gameAddress });\n\n // 2. Sign and send transaction\n setStatus('signing');\n console.log('[useCreateCustomGame] Step 2: Signing and sending...');\n const signature = await signAndSendBase64Transaction(\n createResult.transaction,\n wallet,\n connection,\n );\n console.log('[useCreateCustomGame] Step 2 done. Signature:', signature);\n\n // 3. Confirm with backend\n setStatus('confirming');\n console.log('[useCreateCustomGame] Step 3: Confirming with backend...');\n const confirmResult = await client.confirmCustomGame({\n gameId: createResult.gameId,\n playerWallet: params.playerWallet,\n signature,\n teamChoice: params.teamChoice,\n wagerAmount: params.wagerAmount,\n role: 'creator',\n gameAddress: createResult.gameAddress,\n });\n console.log('[useCreateCustomGame] Step 3 done.');\n\n const result: CreateCustomGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n explorerUrl: confirmResult.explorerUrl,\n buyIn: params.wagerAmount,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useCreateCustomGame] Complete!');\n return result;\n } catch (err) {\n console.error('[useCreateCustomGame] FAILED:', err);\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n }, [client, wallet]);\n\n return { execute, status, error, data, reset };\n}\n","import { useState, useEffect } from 'react';\nimport { useDubs } from '../provider';\n\nexport interface ClaimStatus {\n /** Whether the current wallet has claimed this game's prize */\n hasClaimed: boolean;\n /** Amount claimed (null if not claimed) */\n amountClaimed: number | null;\n /** Claim transaction signature (null if not claimed) */\n claimSignature: string | null;\n /** Whether the game has been resolved */\n isResolved: boolean;\n /** Loading state */\n loading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Re-fetch claim status */\n refetch: () => void;\n}\n\n/**\n * Check whether the current wallet has already claimed a prize for a game.\n *\n * Uses the game detail endpoint which includes per-bettor claim data.\n */\nexport function useHasClaimed(gameId: string | null): ClaimStatus {\n const { client, wallet } = useDubs();\n const [hasClaimed, setHasClaimed] = useState(false);\n const [amountClaimed, setAmountClaimed] = useState<number | null>(null);\n const [claimSignature, setClaimSignature] = useState<string | null>(null);\n const [isResolved, setIsResolved] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [trigger, setTrigger] = useState(0);\n\n const refetch = () => setTrigger(t => t + 1);\n\n useEffect(() => {\n if (!gameId || !wallet.publicKey) {\n setHasClaimed(false);\n setAmountClaimed(null);\n setClaimSignature(null);\n setIsResolved(false);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n client\n .getGame(gameId)\n .then(game => {\n if (cancelled) return;\n setIsResolved(game.isResolved);\n\n const myWallet = wallet.publicKey!.toBase58();\n const myBet = game.bettors?.find(b => b.wallet === myWallet);\n\n if (myBet?.amountClaimed != null && myBet.amountClaimed > 0) {\n setHasClaimed(true);\n setAmountClaimed(myBet.amountClaimed);\n setClaimSignature(myBet.claimSignature ?? null);\n } else {\n setHasClaimed(false);\n setAmountClaimed(null);\n setClaimSignature(null);\n }\n })\n .catch(err => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [gameId, wallet.publicKey, client, trigger]);\n\n return { hasClaimed, amountClaimed, claimSignature, isResolved, loading, error, refetch };\n}\n","import { useState, useCallback, useRef, useContext } from 'react';\nimport bs58 from 'bs58';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport { useDisconnect } from '../managed-wallet';\nimport { getDeviceInfo } from '../utils/device';\nimport type { AuthStatus, DubsUser } from '../types';\nimport { ensurePngAvatar } from '../utils/avatarUrl';\n\nexport interface UseAuthResult {\n /** Current auth status */\n status: AuthStatus;\n /** Authenticated user profile, or null */\n user: DubsUser | null;\n /** JWT token, or null */\n token: string | null;\n /** Convenience boolean */\n isAuthenticated: boolean;\n /** Error from the last operation, or null */\n error: Error | null;\n\n /**\n * Full nonce → sign → verify flow.\n * If the wallet is already registered, resolves to authenticated state.\n * If new wallet, resolves to needsRegistration state — call register() next.\n */\n authenticate: () => Promise<void>;\n\n /**\n * Register a new user after authenticate() returned needsRegistration.\n * Reuses the nonce+signature from authenticate() — no second signing prompt.\n */\n register: (username: string, referralCode?: string, avatarUrl?: string) => Promise<void>;\n\n /** Log out and clear state */\n logout: () => Promise<void>;\n\n /**\n * Restore a session from a saved token (e.g. AsyncStorage on app restart).\n * Calls GET /auth/me to validate. Returns true if valid, false otherwise.\n */\n restoreSession: (token: string) => Promise<boolean>;\n\n /** Re-fetch user profile from the server (e.g. after avatar change) */\n refreshUser: () => Promise<void>;\n\n /** Reset to idle state, clearing errors and user */\n reset: () => void;\n}\n\nexport function useAuth(): UseAuthResult {\n // If inside AuthGate, return the shared auth state\n const sharedAuth = useContext(AuthContext);\n\n const { client, wallet } = useDubs();\n const disconnect = useDisconnect();\n const [status, setStatus] = useState<AuthStatus>('idle');\n const [user, setUser] = useState<DubsUser | null>(null);\n const [token, setToken] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n // Stash nonce+signature+deviceInfo between authenticate → register (single-sign flow)\n const pendingAuth = useRef<{\n walletAddress: string;\n nonce: string;\n signature: string;\n deviceInfo?: import('../utils/device').DeviceInfo;\n } | null>(null);\n\n const normalizeUser = (u: DubsUser): DubsUser => ({\n ...u,\n avatar: ensurePngAvatar(u.avatar) ?? u.avatar,\n });\n\n const reset = useCallback(() => {\n setStatus('idle');\n setUser(null);\n setToken(null);\n setError(null);\n pendingAuth.current = null;\n client.setToken(null);\n }, [client]);\n\n const authenticate = useCallback(async () => {\n try {\n if (!wallet.publicKey) {\n throw new Error('Wallet not connected');\n }\n if (!wallet.signMessage) {\n throw new Error('Wallet does not support signMessage');\n }\n\n setStatus('authenticating');\n setError(null);\n\n const walletAddress = wallet.publicKey.toBase58();\n\n // 0. Collect device info\n const deviceInfo = await getDeviceInfo();\n console.log('[useAuth] Device info:', JSON.stringify(deviceInfo, null, 2));\n\n // 1. Get nonce\n const { nonce, message } = await client.getNonce(walletAddress);\n\n // 2. Sign message\n setStatus('signing');\n const messageBytes = new TextEncoder().encode(message);\n const signatureBytes = await wallet.signMessage!(messageBytes);\n\n const signature = bs58.encode(signatureBytes);\n\n // 3. Verify with server\n setStatus('verifying');\n const result = await client.authenticate({ walletAddress, signature, nonce, deviceInfo });\n\n if (result.needsRegistration) {\n // Stash credentials for register() — nonce is NOT consumed\n pendingAuth.current = { walletAddress, nonce, signature, deviceInfo };\n setStatus('needsRegistration');\n return;\n }\n\n // Existing user — fully authenticated\n setUser(normalizeUser(result.user!));\n setToken(result.token!);\n setStatus('authenticated');\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // Phantom 4100 = stale/revoked session — clear it and return to connect screen\n if (message.includes('4100') || message.includes('not been authorized')) {\n console.log('[useAuth] Stale Phantom session detected (4100), forcing disconnect');\n await disconnect?.();\n setStatus('idle');\n setError(null);\n return;\n }\n setError(err instanceof Error ? err : new Error(message));\n setStatus('error');\n }\n }, [client, wallet, disconnect]);\n\n const register = useCallback(async (username: string, referralCode?: string, avatarUrl?: string) => {\n try {\n const pending = pendingAuth.current;\n if (!pending) {\n throw new Error('No pending authentication — call authenticate() first');\n }\n\n setStatus('registering');\n setError(null);\n\n const result = await client.register({\n walletAddress: pending.walletAddress,\n signature: pending.signature,\n nonce: pending.nonce,\n username,\n referralCode,\n avatarUrl,\n deviceInfo: pending.deviceInfo,\n });\n\n pendingAuth.current = null;\n // Use the chosen avatar locally if the backend didn't store it\n const user = avatarUrl && !result.user.avatar\n ? { ...result.user, avatar: avatarUrl }\n : result.user;\n setUser(normalizeUser(user));\n setToken(result.token);\n setStatus('authenticated');\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setStatus('error');\n }\n }, [client]);\n\n const logout = useCallback(async () => {\n try {\n await client.logout();\n } catch {\n // Ignore logout errors — clear state regardless\n }\n setUser(null);\n setToken(null);\n setStatus('idle');\n setError(null);\n pendingAuth.current = null;\n }, [client]);\n\n const restoreSession = useCallback(async (savedToken: string): Promise<boolean> => {\n try {\n client.setToken(savedToken);\n const me = await client.getMe();\n setUser(normalizeUser(me));\n setToken(savedToken);\n setStatus('authenticated');\n return true;\n } catch {\n client.setToken(null);\n setUser(null);\n setToken(null);\n setStatus('idle');\n return false;\n }\n }, [client]);\n\n const refreshUser = useCallback(async () => {\n try {\n const me = await client.getMe();\n setUser(normalizeUser(me));\n } catch {\n // Silent failure — keep existing user state\n }\n }, [client]);\n\n // If shared context exists (inside AuthGate), prefer it over local state\n if (sharedAuth) return sharedAuth;\n\n return {\n status,\n user,\n token,\n isAuthenticated: status === 'authenticated',\n error,\n authenticate,\n register,\n logout,\n restoreSession,\n refreshUser,\n reset,\n };\n}\n","import { createContext } from 'react';\nimport type { UseAuthResult } from './hooks/useAuth';\n\n/**\n * Shared auth context provided by AuthGate.\n * When useAuth() is called inside an AuthGate, it reads from this context\n * so all components share the same auth state.\n */\nexport const AuthContext = createContext<UseAuthResult | null>(null);\n","import { Platform } from 'react-native';\n\nexport interface DeviceInfo {\n platform: string;\n modelName: string | null;\n brand: string | null;\n manufacturer: string | null;\n osName: string | null;\n osVersion: string | null;\n deviceType: number | null;\n deviceName: string | null;\n totalMemory: number | null;\n modelId: string | null;\n designName: string | null;\n productName: string | null;\n isDevice: boolean | null;\n}\n\n/**\n * Detect Solana Seeker device (synchronous — safe to call during render).\n * Checks brand from expo-device; returns false if expo-device isn't installed.\n */\nexport function isSolanaSeeker(): boolean {\n try {\n const Device = require('expo-device');\n return Device.brand?.toLowerCase() === 'solanamobile';\n } catch {\n return false;\n }\n}\n\nexport async function getDeviceInfo(): Promise<DeviceInfo> {\n try {\n const Device = require('expo-device');\n return {\n platform: Platform.OS,\n modelName: Device.modelName,\n brand: Device.brand,\n manufacturer: Device.manufacturer,\n osName: Device.osName,\n osVersion: Device.osVersion,\n deviceType: Device.deviceType,\n deviceName: Device.deviceName,\n totalMemory: Device.totalMemory,\n modelId: Device.modelId,\n designName: Device.designName,\n productName: Device.productName,\n isDevice: Device.isDevice,\n };\n } catch {\n // expo-device not installed — return minimal info\n return {\n platform: Platform.OS,\n modelName: null,\n brand: null,\n manufacturer: null,\n osName: null,\n osVersion: null,\n deviceType: null,\n deviceName: null,\n totalMemory: null,\n modelId: null,\n designName: null,\n productName: null,\n isDevice: null,\n };\n }\n}\n","/**\n * Ensure a DiceBear avatar URL uses PNG format for React Native compatibility.\n * React Native's Image component cannot render SVGs.\n * This converts at render time only — the stored URL in the DB is never modified.\n */\nexport function ensurePngAvatar(url: string | null | undefined): string | undefined {\n if (!url) return undefined;\n return url.replace('/svg?', '/png?');\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UFCEvent, QueryResult } from '../types';\n\nexport function useUFCFightCard(): QueryResult<UFCEvent[]> {\n const { client } = useDubs();\n const [data, setData] = useState<UFCEvent[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.getUFCFightCard();\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useDubs } from '../provider';\nimport type { UFCFighterDetail, QueryResult } from '../types';\n\nexport function useUFCFighterDetail(athleteId: string | null): QueryResult<UFCFighterDetail> {\n const { client } = useDubs();\n const [data, setData] = useState<UFCFighterDetail | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!athleteId) {\n setData(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await client.getUFCFighterDetail(athleteId);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [client, athleteId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch: fetchData };\n}\n","import { useState, useCallback, useRef, useMemo, useEffect } from 'react';\nimport { Platform } from 'react-native';\nimport { useDubs } from '../provider';\n\nexport interface PushNotificationStatus {\n /** Whether push notifications are enabled in the SDK configuration */\n enabled: boolean;\n /** Whether notification permission has been granted */\n hasPermission: boolean;\n /** The push token (native FCM/APNs), if registered */\n pushToken: string | null;\n /**\n * @deprecated Use pushToken instead. Kept for backwards compatibility.\n */\n expoPushToken: string | null;\n /** Whether a registration operation is in progress */\n loading: boolean;\n /** The last error encountered */\n error: Error | null;\n /**\n * Request notification permission and register the push token.\n * Does NOT auto-prompt — must be called explicitly (e.g. from an onboarding screen).\n */\n register: () => Promise<boolean>;\n /** Unregister the current push token */\n unregister: () => Promise<void>;\n /**\n * Silently re-register if permission was already granted (no prompt).\n * Safe to call on app startup for returning users.\n */\n restoreIfGranted: () => Promise<void>;\n}\n\nexport function usePushNotifications(): PushNotificationStatus {\n const { client, appName, pushEnabled } = useDubs();\n const channelId = useMemo(() => appName.toLowerCase().replace(/[^a-z0-9-]/g, ''), [appName]);\n const [hasPermission, setHasPermission] = useState(false);\n const [pushToken, setPushToken] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const registering = useRef(false);\n\n const getNotificationsModule = useCallback(() => {\n try {\n return require('expo-notifications');\n } catch {\n return null;\n }\n }, []);\n\n const getDeviceName = useCallback((): string | null => {\n try {\n const Device = require('expo-device');\n return Device.deviceName || null;\n } catch {\n return null;\n }\n }, []);\n\n const setupAndroidChannels = useCallback((Notifications: any) => {\n if (Platform.OS === 'android') {\n Notifications.setNotificationChannelAsync(channelId || 'default', {\n name: appName || 'Default',\n importance: Notifications.AndroidImportance?.MAX ?? 4,\n vibrationPattern: [0, 250, 250, 250],\n }).catch(() => {});\n }\n }, [channelId, appName]);\n\n const registerTokenWithServer = useCallback(async (token: string) => {\n const deviceName = getDeviceName();\n await client.registerPushToken({\n token,\n platform: Platform.OS,\n deviceName: deviceName || undefined,\n });\n }, [client, getDeviceName]);\n\n const register = useCallback(async (): Promise<boolean> => {\n if (!pushEnabled) return false;\n if (registering.current) return false;\n registering.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const Notifications = getNotificationsModule();\n if (!Notifications) {\n throw new Error('expo-notifications is not installed');\n }\n\n // Request permission\n const { status: existingStatus } = await Notifications.getPermissionsAsync();\n let finalStatus = existingStatus;\n\n if (existingStatus !== 'granted') {\n const { status } = await Notifications.requestPermissionsAsync();\n finalStatus = status;\n }\n\n if (finalStatus !== 'granted') {\n setHasPermission(false);\n setLoading(false);\n registering.current = false;\n return false;\n }\n\n setHasPermission(true);\n\n // Get native device push token (FCM on Android, APNs on iOS)\n const tokenResult = await Notifications.getDevicePushTokenAsync();\n const token = tokenResult.data;\n setPushToken(token);\n\n // Register with server\n await registerTokenWithServer(token);\n\n // Setup Android channels\n setupAndroidChannels(Notifications);\n\n setLoading(false);\n registering.current = false;\n return true;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setLoading(false);\n registering.current = false;\n console.error('[usePushNotifications] Registration error:', e.message);\n return false;\n }\n }, [getNotificationsModule, registerTokenWithServer, setupAndroidChannels]);\n\n const unregister = useCallback(async () => {\n if (!pushToken) return;\n try {\n await client.unregisterPushToken(pushToken);\n setPushToken(null);\n } catch (err) {\n console.error('[usePushNotifications] Unregister error:', err);\n }\n }, [client, pushToken]);\n\n const restoreIfGranted = useCallback(async () => {\n if (!pushEnabled) return;\n try {\n const Notifications = getNotificationsModule();\n if (!Notifications) return;\n\n const { status } = await Notifications.getPermissionsAsync();\n if (status !== 'granted') return;\n\n // Get native device push token (FCM on Android, APNs on iOS)\n const tokenResult = await Notifications.getDevicePushTokenAsync();\n const token = tokenResult.data;\n\n // Register with server — only mark as enabled if this succeeds\n await registerTokenWithServer(token);\n setPushToken(token);\n setHasPermission(true);\n setupAndroidChannels(Notifications);\n } catch (err) {\n // Server registration failed — don't show as enabled\n setHasPermission(false);\n console.log('[usePushNotifications] Restore skipped:', err instanceof Error ? err.message : err);\n }\n }, [getNotificationsModule, registerTokenWithServer, setupAndroidChannels]);\n\n // On mount, set up foreground notification handler and restore push state\n const didMount = useRef(false);\n useEffect(() => {\n if (didMount.current) return;\n didMount.current = true;\n\n const Notifications = getNotificationsModule();\n if (Notifications) {\n // Show notifications even when app is in the foreground\n Notifications.setNotificationHandler({\n handleNotification: async () => ({\n shouldShowAlert: true,\n shouldPlaySound: true,\n shouldSetBadge: false,\n }),\n });\n }\n\n restoreIfGranted();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n enabled: pushEnabled,\n hasPermission,\n pushToken,\n expoPushToken: pushToken, // backwards compat\n loading,\n error,\n register,\n unregister,\n restoreIfGranted,\n };\n}\n","import React, { useState, useCallback } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n Image,\n ScrollView,\n StyleSheet,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\n\nconst DICEBEAR_STYLES = [\n 'adventurer',\n 'avataaars',\n 'fun-emoji',\n 'bottts',\n 'big-smile',\n 'thumbs',\n];\n\nconst BG_COLORS = [\n '1a1a2e', 'f43f5e', 'f97316', 'eab308', '22c55e',\n '3b82f6', '8b5cf6', 'ec4899', '06b6d4', '64748b',\n];\n\nexport function generateSeed(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport function getAvatarUrl(style: string, seed: string, bg = '1a1a2e', size = 256): string {\n return `https://api.dicebear.com/9.x/${style}/png?seed=${seed}&backgroundColor=${bg}&size=${size}`;\n}\n\nexport function parseAvatarUrl(url?: string | null): { style: string; seed: string; bg: string } {\n if (!url) return { style: 'adventurer', seed: generateSeed(), bg: '1a1a2e' };\n try {\n const match = url.match(/\\/\\d+\\.x\\/([^/]+)\\/(?:png|svg)\\?seed=([^&]+)/);\n if (match) {\n const bgMatch = url.match(/backgroundColor=([^&]+)/);\n return { style: match[1], seed: match[2], bg: bgMatch?.[1] || '1a1a2e' };\n }\n } catch {}\n return { style: 'adventurer', seed: generateSeed(), bg: '1a1a2e' };\n}\n\nexport interface AvatarEditorProps {\n style: string;\n seed: string;\n bg: string;\n onStyleChange: (style: string) => void;\n onSeedChange: (seed: string) => void;\n onBgChange: (bg: string) => void;\n disabled?: boolean;\n accentColor?: string;\n}\n\nexport function AvatarEditor({\n style: avatarStyle,\n seed: avatarSeed,\n bg: bgColor,\n onStyleChange,\n onSeedChange,\n onBgChange,\n disabled = false,\n accentColor,\n}: AvatarEditorProps) {\n const t = useDubsTheme();\n const accent = accentColor || t.accent;\n\n return (\n <View style={styles.container}>\n {/* Style picker */}\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.row}\n >\n {DICEBEAR_STYLES.map((st) => {\n const isSelected = st === avatarStyle;\n return (\n <TouchableOpacity\n key={st}\n onPress={() => onStyleChange(st)}\n activeOpacity={0.7}\n disabled={disabled}\n style={[\n styles.styleTile,\n {\n borderColor: isSelected ? accent : t.border,\n borderWidth: isSelected ? 2 : 1,\n },\n ]}\n >\n <Image\n source={{ uri: getAvatarUrl(st, avatarSeed, bgColor, 80) }}\n style={styles.styleTileImage}\n />\n </TouchableOpacity>\n );\n })}\n </ScrollView>\n\n {/* Background color picker */}\n <Text style={[styles.label, { color: t.textSecondary }]}>Background Color</Text>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.row}\n >\n {BG_COLORS.map((color) => {\n const isSelected = color === bgColor;\n return (\n <TouchableOpacity\n key={color}\n onPress={() => onBgChange(color)}\n activeOpacity={0.7}\n disabled={disabled}\n style={[\n styles.colorSwatch,\n { backgroundColor: `#${color}` },\n isSelected && { borderColor: accent, borderWidth: 2.5 },\n ]}\n />\n );\n })}\n </ScrollView>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n gap: 10,\n },\n row: {\n gap: 10,\n },\n label: {\n fontSize: 14,\n fontWeight: '600',\n },\n styleTile: {\n width: 72,\n height: 72,\n borderRadius: 16,\n overflow: 'hidden',\n },\n styleTileImage: {\n width: '100%',\n height: '100%',\n },\n colorSwatch: {\n width: 32,\n height: 32,\n borderRadius: 16,\n borderWidth: 1.5,\n borderColor: 'rgba(255,255,255,0.15)',\n },\n});\n","import React, { useMemo } from 'react';\nimport { View, Text, Image, StyleSheet } from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { ensurePngAvatar } from '../utils/avatarUrl';\n\nexport interface UserProfileCardProps {\n walletAddress: string;\n username?: string;\n avatarUrl?: string | null;\n memberSince?: string | null;\n}\n\nfunction truncateAddress(address: string, chars = 4): string {\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\nfunction formatMemberSince(iso: string): string {\n const date = new Date(iso);\n const month = date.toLocaleString('en-US', { month: 'short' });\n const year = date.getFullYear();\n return `Member since ${month} ${year}`;\n}\n\nexport function UserProfileCard({\n walletAddress,\n username,\n avatarUrl,\n memberSince,\n}: UserProfileCardProps) {\n const t = useDubsTheme();\n\n const imageUri = useMemo(\n () =>\n ensurePngAvatar(avatarUrl) ||\n `https://api.dicebear.com/9.x/avataaars/png?seed=${walletAddress}&size=128`,\n [avatarUrl, walletAddress],\n );\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Image source={{ uri: imageUri }} style={styles.avatar} />\n <View style={styles.info}>\n {username ? (\n <Text style={[styles.username, { color: t.text }]}>{username}</Text>\n ) : null}\n <Text style={[styles.address, { color: t.textMuted }]}>\n {truncateAddress(walletAddress)}\n </Text>\n {memberSince ? (\n <Text style={[styles.memberSince, { color: t.textDim }]}>\n {formatMemberSince(memberSince)}\n </Text>\n ) : null}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 16,\n borderRadius: 16,\n borderWidth: 1,\n gap: 14,\n },\n avatar: {\n width: 64,\n height: 64,\n borderRadius: 32,\n backgroundColor: '#1A1A24',\n },\n info: {\n flex: 1,\n gap: 2,\n },\n username: {\n fontSize: 18,\n fontWeight: '700',\n },\n address: {\n fontSize: 14,\n fontFamily: 'monospace',\n },\n memberSince: {\n fontSize: 12,\n marginTop: 2,\n },\n});\n","import React from 'react';\nimport {\n View,\n Text,\n ScrollView,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { UserProfileCard } from './UserProfileCard';\n\nexport interface SettingsSheetProps {\n walletAddress: string;\n username?: string;\n avatarUrl?: string | null;\n memberSince?: string | null;\n appVersion?: string;\n onCopyAddress?: () => void;\n onSupport?: () => void;\n onLogout: () => void | Promise<void>;\n loggingOut?: boolean;\n}\n\nfunction truncateAddress(address: string, chars = 4): string {\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\nexport function SettingsSheet({\n walletAddress,\n username,\n avatarUrl,\n memberSince,\n appVersion,\n onCopyAddress,\n onSupport,\n onLogout,\n loggingOut = false,\n}: SettingsSheetProps) {\n const t = useDubsTheme();\n\n return (\n <ScrollView\n style={[styles.container, { backgroundColor: t.background }]}\n contentContainerStyle={styles.content}\n >\n {/* Profile card */}\n <UserProfileCard\n walletAddress={walletAddress}\n username={username}\n avatarUrl={avatarUrl}\n memberSince={memberSince}\n />\n\n {/* Action rows */}\n <View style={[styles.actionsCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n {onCopyAddress ? (\n <TouchableOpacity\n style={styles.actionRow}\n onPress={onCopyAddress}\n activeOpacity={0.7}\n >\n <View style={styles.actionRowLeft}>\n <Text style={[styles.actionLabel, { color: t.text }]}>Wallet Address</Text>\n <Text style={[styles.actionValue, { color: t.textMuted }]}>\n {truncateAddress(walletAddress)}\n </Text>\n </View>\n <Text style={[styles.copyLabel, { color: t.accent }]}>Copy</Text>\n </TouchableOpacity>\n ) : null}\n\n {onSupport ? (\n <>\n {onCopyAddress ? (\n <View style={[styles.separator, { backgroundColor: t.border }]} />\n ) : null}\n <TouchableOpacity\n style={styles.actionRow}\n onPress={onSupport}\n activeOpacity={0.7}\n >\n <Text style={[styles.actionLabel, { color: t.text }]}>Help & Support</Text>\n <Text style={[styles.chevron, { color: t.textMuted }]}>{'\\u203A'}</Text>\n </TouchableOpacity>\n </>\n ) : null}\n </View>\n\n {/* Logout button */}\n <TouchableOpacity\n style={[styles.logoutButton, { borderColor: t.live }]}\n onPress={onLogout}\n disabled={loggingOut}\n activeOpacity={0.7}\n >\n {loggingOut ? (\n <ActivityIndicator color={t.live} size=\"small\" />\n ) : (\n <Text style={[styles.logoutText, { color: t.live }]}>Log Out</Text>\n )}\n </TouchableOpacity>\n\n {/* App version */}\n {appVersion ? (\n <Text style={[styles.version, { color: t.textDim }]}>v{appVersion}</Text>\n ) : null}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n content: {\n padding: 20,\n paddingTop: 24,\n gap: 20,\n },\n actionsCard: {\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n actionRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n actionRowLeft: {\n flex: 1,\n gap: 2,\n },\n actionLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n actionValue: {\n fontSize: 13,\n fontFamily: 'monospace',\n },\n copyLabel: {\n fontSize: 14,\n fontWeight: '600',\n },\n chevron: {\n fontSize: 22,\n fontWeight: '300',\n },\n separator: {\n height: 1,\n marginHorizontal: 16,\n },\n logoutButton: {\n height: 52,\n borderRadius: 16,\n borderWidth: 1.5,\n justifyContent: 'center',\n alignItems: 'center',\n },\n logoutText: {\n fontSize: 16,\n fontWeight: '700',\n },\n version: {\n fontSize: 12,\n textAlign: 'center',\n },\n});\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n Image,\n ScrollView,\n Dimensions,\n} from 'react-native';\nimport { useDubsTheme } from './theme';\nimport { useDubs } from '../provider';\nimport { usePushNotifications } from '../hooks/usePushNotifications';\nimport { AvatarEditor, getAvatarUrl, generateSeed, parseAvatarUrl } from './AvatarEditor';\n\nfunction truncateAddress(address: string, chars = 4): string {\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars)}...${address.slice(-chars)}`;\n}\n\n// ── Props ──\n\nexport interface UserProfileSheetProps {\n visible: boolean;\n onDismiss: () => void;\n user: {\n walletAddress: string;\n username?: string;\n avatar?: string | null;\n createdAt?: string;\n };\n onAvatarUpdated?: (newAvatarUrl: string) => void;\n onDisconnect?: () => void;\n}\n\nexport function UserProfileSheet({\n visible,\n onDismiss,\n user,\n onAvatarUpdated,\n onDisconnect,\n}: UserProfileSheetProps) {\n const t = useDubsTheme();\n const { client } = useDubs();\n const push = usePushNotifications();\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n const parsed = useMemo(() => parseAvatarUrl(user.avatar), [user.avatar]);\n const [avatarStyle, setAvatarStyle] = useState(parsed.style);\n const [avatarSeed, setAvatarSeed] = useState(parsed.seed);\n const [bgColor, setBgColor] = useState(parsed.bg);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Re-sync when user prop changes\n useEffect(() => {\n const p = parseAvatarUrl(user.avatar);\n setAvatarStyle(p.style);\n setAvatarSeed(p.seed);\n setBgColor(p.bg);\n }, [user.avatar]);\n\n // Animate overlay\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset error when sheet opens\n useEffect(() => {\n if (visible) setError(null);\n }, [visible]);\n\n const currentAvatarUrl = getAvatarUrl(avatarStyle, avatarSeed, bgColor);\n\n const saveAvatar = useCallback(async (newUrl: string) => {\n setSaving(true);\n setError(null);\n try {\n await client.updateProfile({ avatar: newUrl });\n onAvatarUpdated?.(newUrl);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update avatar');\n } finally {\n setSaving(false);\n }\n }, [client, onAvatarUpdated]);\n\n const handleStyleChange = useCallback((style: string) => {\n setAvatarStyle(style);\n saveAvatar(getAvatarUrl(style, avatarSeed, bgColor));\n }, [avatarSeed, bgColor, saveAvatar]);\n\n const handleShuffle = useCallback(() => {\n const newSeed = generateSeed();\n setAvatarSeed(newSeed);\n saveAvatar(getAvatarUrl(avatarStyle, newSeed, bgColor));\n }, [avatarStyle, bgColor, saveAvatar]);\n\n const handleBgChange = useCallback((color: string) => {\n setBgColor(color);\n saveAvatar(getAvatarUrl(avatarStyle, avatarSeed, color));\n }, [avatarStyle, avatarSeed, saveAvatar]);\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>Profile</Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n <ScrollView\n style={styles.scrollContent}\n contentContainerStyle={styles.scrollContentInner}\n showsVerticalScrollIndicator={false}\n bounces={false}\n >\n {/* Avatar section */}\n <View style={styles.avatarSection}>\n <View style={[styles.avatarContainer, { borderColor: t.border }]}>\n <Image\n source={{ uri: currentAvatarUrl }}\n style={styles.avatar}\n />\n {saving && (\n <View style={styles.avatarLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n </View>\n )}\n </View>\n {user.username ? (\n <Text style={[styles.username, { color: t.text }]}>{user.username}</Text>\n ) : null}\n <Text style={[styles.walletAddress, { color: t.textMuted }]}>\n {truncateAddress(user.walletAddress, 6)}\n </Text>\n </View>\n\n {/* Change Avatar */}\n <View style={styles.section}>\n <View style={styles.sectionHeaderRow}>\n <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>\n Change Avatar\n </Text>\n <TouchableOpacity\n style={[styles.shuffleButton, { borderColor: t.border }]}\n onPress={handleShuffle}\n activeOpacity={0.7}\n disabled={saving}\n >\n <Text style={[styles.shuffleText, { color: t.accent }]}>Shuffle</Text>\n </TouchableOpacity>\n </View>\n <AvatarEditor\n style={avatarStyle}\n seed={avatarSeed}\n bg={bgColor}\n onStyleChange={handleStyleChange}\n onSeedChange={setAvatarSeed}\n onBgChange={handleBgChange}\n disabled={saving}\n />\n </View>\n\n {/* Error */}\n {error ? (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{error}</Text>\n </View>\n ) : null}\n\n {/* Push Notifications */}\n {push.enabled && (\n <View style={[styles.notifRow, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.notifLeft}>\n <Text style={[styles.notifLabel, { color: t.text }]}>Push Notifications</Text>\n <Text\n style={[\n styles.notifStatus,\n { color: push.hasPermission ? t.success : t.textMuted },\n ]}\n >\n {push.hasPermission ? 'Enabled' : 'Disabled'}\n </Text>\n </View>\n {!push.hasPermission && (\n <TouchableOpacity\n style={[styles.enableButton, { backgroundColor: t.accent }]}\n onPress={push.register}\n disabled={push.loading}\n activeOpacity={0.8}\n >\n {push.loading ? (\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n ) : (\n <Text style={styles.enableText}>Enable</Text>\n )}\n </TouchableOpacity>\n )}\n </View>\n )}\n\n {/* Push error */}\n {push.enabled && push.error ? (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{push.error.message}</Text>\n </View>\n ) : null}\n\n {/* Disconnect */}\n {onDisconnect ? (\n <TouchableOpacity\n style={[styles.disconnectButton, { borderColor: t.live }]}\n onPress={onDisconnect}\n activeOpacity={0.7}\n >\n <Text style={[styles.disconnectText, { color: t.live }]}>Disconnect Wallet</Text>\n </TouchableOpacity>\n ) : null}\n </ScrollView>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 0,\n height: Dimensions.get('window').height * 0.7,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n scrollContent: {\n flexGrow: 0,\n },\n scrollContentInner: {\n paddingBottom: 8,\n },\n avatarSection: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 20,\n gap: 8,\n },\n avatarContainer: {\n width: 120,\n height: 120,\n borderRadius: 60,\n borderWidth: 2,\n overflow: 'hidden',\n },\n avatar: {\n width: '100%',\n height: '100%',\n },\n avatarLoading: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.35)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n username: {\n fontSize: 18,\n fontWeight: '700',\n },\n walletAddress: {\n fontSize: 13,\n fontFamily: 'monospace',\n },\n section: {\n marginBottom: 20,\n gap: 12,\n },\n sectionHeaderRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n sectionLabel: {\n fontSize: 14,\n fontWeight: '600',\n },\n shuffleButton: {\n paddingHorizontal: 14,\n paddingVertical: 6,\n borderRadius: 12,\n borderWidth: 1,\n },\n shuffleText: {\n fontSize: 13,\n fontWeight: '600',\n },\n errorBox: {\n marginBottom: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n notifRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderRadius: 16,\n borderWidth: 1,\n paddingHorizontal: 16,\n paddingVertical: 14,\n marginBottom: 16,\n },\n notifLeft: {\n gap: 2,\n },\n notifLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n notifStatus: {\n fontSize: 13,\n },\n enableButton: {\n paddingHorizontal: 18,\n paddingVertical: 10,\n borderRadius: 12,\n },\n enableText: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: '700',\n },\n disconnectButton: {\n height: 52,\n borderRadius: 16,\n borderWidth: 1.5,\n justifyContent: 'center',\n alignItems: 'center',\n },\n disconnectText: {\n fontSize: 16,\n fontWeight: '700',\n },\n});\n","import { useState } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface GamePosterProps {\n game: GameDetail;\n /** Optional Image component — pass expo-image or RN Image. Defaults to RN Image. */\n ImageComponent?: React.ComponentType<any>;\n}\n\nfunction computeCountdown(lockTimestamp: number | string | null): string {\n if (!lockTimestamp) return '';\n const ts = typeof lockTimestamp === 'string' ? parseInt(lockTimestamp) : lockTimestamp;\n const diff = ts * 1000 - Date.now();\n if (diff <= 0) return 'LIVE';\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n if (days > 0) return `${days}d ${hours}h`;\n if (hours > 0) return `${hours}h ${mins}m`;\n return `${mins}m`;\n}\n\n/**\n * Matchup poster hero widget.\n * Shows the game poster image (or team logo fallback), countdown pill, and pool total.\n */\nexport function GamePoster({ game, ImageComponent }: GamePosterProps) {\n const t = useDubsTheme();\n const Img = ImageComponent || require('react-native').Image;\n\n const opponents = game.opponents || [];\n const home = opponents[0];\n const away = opponents[1];\n const countdown = computeCountdown(game.lockTimestamp);\n const isLive = countdown === 'LIVE';\n\n return (\n <View style={styles.container}>\n {game.media?.poster ? (\n <Img\n source={{ uri: game.media.poster }}\n style={styles.image}\n resizeMode=\"cover\"\n />\n ) : (\n <View style={[styles.image, { backgroundColor: t.surface }]}>\n <View style={styles.fallback}>\n <TeamLogoInternal url={home?.imageUrl} size={56} Img={Img} />\n <Text style={styles.vs}>VS</Text>\n <TeamLogoInternal url={away?.imageUrl} size={56} Img={Img} />\n </View>\n </View>\n )}\n <View style={styles.overlay} />\n\n <View style={styles.teamNames}>\n <Text style={styles.teamNameText} numberOfLines={1}>\n {home?.name || 'Home'}\n </Text>\n <Text style={styles.teamNameVs}>vs</Text>\n <Text style={styles.teamNameText} numberOfLines={1}>\n {away?.name || 'Away'}\n </Text>\n </View>\n\n {countdown ? (\n <View style={styles.countdownPill}>\n <Text style={[styles.countdownText, isLive && styles.countdownLive]}>\n {countdown}\n </Text>\n </View>\n ) : null}\n\n <View style={styles.poolPill}>\n <Text style={styles.poolText}>{game.totalPool || 0} SOL</Text>\n </View>\n </View>\n );\n}\n\nfunction TeamLogoInternal({ url, size, Img }: { url: string | null | undefined; size: number; Img: any }) {\n const [failed, setFailed] = useState(false);\n if (!url || failed) {\n return <View style={[styles.logoPlaceholder, { width: size, height: size, borderRadius: size / 2 }]} />;\n }\n return (\n <Img\n source={{ uri: url }}\n style={{ width: size, height: size, borderRadius: size / 2 }}\n resizeMode=\"contain\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n height: 200,\n borderRadius: 16,\n overflow: 'hidden',\n position: 'relative',\n },\n image: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: 'center',\n alignItems: 'center',\n },\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.35)',\n },\n fallback: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 24,\n zIndex: 2,\n },\n vs: {\n color: '#FFF',\n fontSize: 24,\n fontWeight: '900',\n zIndex: 2,\n },\n logoPlaceholder: {\n backgroundColor: 'rgba(255,255,255,0.15)',\n zIndex: 2,\n },\n teamNames: {\n position: 'absolute',\n top: 12,\n left: 12,\n right: 12,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n },\n teamNameText: {\n color: '#FFF',\n fontSize: 14,\n fontWeight: '700',\n maxWidth: '40%',\n },\n teamNameVs: {\n color: 'rgba(255,255,255,0.6)',\n fontSize: 12,\n fontWeight: '600',\n },\n countdownPill: {\n position: 'absolute',\n bottom: 12,\n left: 12,\n backgroundColor: 'rgba(0,0,0,0.65)',\n borderRadius: 8,\n paddingHorizontal: 10,\n paddingVertical: 5,\n },\n countdownText: {\n color: '#FFF',\n fontSize: 13,\n fontWeight: '700',\n },\n countdownLive: {\n color: '#EF4444',\n },\n poolPill: {\n position: 'absolute',\n bottom: 12,\n right: 12,\n backgroundColor: '#7C3AED',\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 5,\n },\n poolText: {\n color: '#FFF',\n fontSize: 13,\n fontWeight: '800',\n },\n});\n","import { useMemo } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface LivePoolsCardProps {\n game: GameDetail;\n /** Custom short-name function for team labels. Defaults to full name. */\n shortName?: (name: string | null) => string;\n /** Override bar colors. Defaults to blue/red. */\n homeColor?: string;\n awayColor?: string;\n}\n\n/**\n * Pool breakdown card showing each side's SOL amount, bar chart, and implied odds.\n */\nexport function LivePoolsCard({\n game,\n shortName,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n}: LivePoolsCardProps) {\n const t = useDubsTheme();\n\n const opponents = game.opponents || [];\n const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n const homePool = game.homePool || 0;\n const awayPool = game.awayPool || 0;\n const totalPool = game.totalPool || 0;\n\n const { homePercent, awayPercent, homeOdds, awayOdds } = useMemo(() => {\n return {\n homePercent: totalPool > 0 ? (homePool / totalPool) * 100 : 50,\n awayPercent: totalPool > 0 ? (awayPool / totalPool) * 100 : 50,\n homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n };\n }, [homePool, awayPool, totalPool]);\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.title, { color: t.text }]}>Live Pools</Text>\n <Text style={[styles.total, { color: t.accent }]}>{totalPool} SOL total</Text>\n\n <View style={styles.bars}>\n <PoolBar name={homeName} amount={homePool} percent={homePercent} color={homeColor} t={t} />\n <PoolBar name={awayName} amount={awayPool} percent={awayPercent} color={awayColor} t={t} />\n </View>\n\n <View style={styles.oddsRow}>\n <Text style={[styles.oddsText, { color: t.textMuted }]}>\n {homeName}: <Text style={{ color: t.text, fontWeight: '700' }}>{homeOdds}x</Text>\n </Text>\n <Text style={[styles.oddsText, { color: t.textMuted }]}>\n {awayName}: <Text style={{ color: t.text, fontWeight: '700' }}>{awayOdds}x</Text>\n </Text>\n </View>\n </View>\n );\n}\n\nfunction PoolBar({ name, amount, percent, color, t }: { name: string; amount: number; percent: number; color: string; t: any }) {\n return (\n <View style={styles.barRow}>\n <Text style={[styles.barLabel, { color: t.textSecondary }]} numberOfLines={1}>{name}</Text>\n <View style={[styles.barTrack, { backgroundColor: t.border }]}>\n <View style={[styles.barFill, { width: `${Math.max(percent, 2)}%`, backgroundColor: color }]} />\n </View>\n <Text style={[styles.barAmount, { color: t.text }]}>{amount} SOL</Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n title: { fontSize: 17, fontWeight: '700', marginBottom: 4 },\n total: { fontSize: 14, fontWeight: '600', marginBottom: 14 },\n bars: { gap: 10 },\n barRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n barLabel: { width: 80, fontSize: 13, fontWeight: '600' },\n barTrack: { flex: 1, height: 10, borderRadius: 5, overflow: 'hidden' },\n barFill: { height: '100%', borderRadius: 5 },\n barAmount: { width: 70, textAlign: 'right', fontSize: 13, fontWeight: '700' },\n oddsRow: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 12 },\n oddsText: { fontSize: 12 },\n});\n","import { useState, useMemo } from 'react';\nimport { StyleSheet, View, Text, TouchableOpacity } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail } from '../../types';\n\nexport interface PickWinnerCardProps {\n game: GameDetail;\n selectedTeam: 'home' | 'away' | null;\n onSelect: (team: 'home' | 'away') => void;\n /** Custom short-name function for team labels. Defaults to full name. */\n shortName?: (name: string | null) => string;\n /** Override colors. Defaults to blue/red. */\n homeColor?: string;\n awayColor?: string;\n /** Optional Image component (expo-image, etc.). */\n ImageComponent?: React.ComponentType<any>;\n}\n\n/**\n * Team selection card for picking which side to bet on.\n */\nexport function PickWinnerCard({\n game,\n selectedTeam,\n onSelect,\n shortName,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n ImageComponent,\n}: PickWinnerCardProps) {\n const t = useDubsTheme();\n\n const opponents = game.opponents || [];\n const bettors = game.bettors || [];\n const totalPool = game.totalPool || 0;\n const homePool = game.homePool || 0;\n const awayPool = game.awayPool || 0;\n\n const { homeOdds, awayOdds, homeBets, awayBets } = useMemo(() => ({\n homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n homeBets: bettors.filter(b => b.team === 'home').length,\n awayBets: bettors.filter(b => b.team === 'away').length,\n }), [totalPool, homePool, awayPool, bettors]);\n\n const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.title, { color: t.text }]}>Pick Your Winner</Text>\n <View style={styles.row}>\n <TeamOption\n name={homeName}\n imageUrl={opponents[0]?.imageUrl}\n odds={homeOdds}\n bets={homeBets}\n color={homeColor}\n selected={selectedTeam === 'home'}\n onPress={() => onSelect('home')}\n ImageComponent={ImageComponent}\n t={t}\n />\n <TeamOption\n name={awayName}\n imageUrl={opponents[1]?.imageUrl}\n odds={awayOdds}\n bets={awayBets}\n color={awayColor}\n selected={selectedTeam === 'away'}\n onPress={() => onSelect('away')}\n ImageComponent={ImageComponent}\n t={t}\n />\n </View>\n </View>\n );\n}\n\nfunction TeamOption({\n name, imageUrl, odds, bets, color, selected, onPress, ImageComponent, t,\n}: {\n name: string; imageUrl?: string | null; odds: string; bets: number;\n color: string; selected: boolean; onPress: () => void;\n ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n const [imgFailed, setImgFailed] = useState(false);\n const Img = ImageComponent || require('react-native').Image;\n const showImage = imageUrl && !imgFailed;\n\n return (\n <TouchableOpacity\n style={[styles.option, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + '15' : t.background }]}\n onPress={onPress}\n activeOpacity={0.7}\n >\n {showImage ? (\n <Img source={{ uri: imageUrl }} style={styles.logo} resizeMode=\"contain\" onError={() => setImgFailed(true)} />\n ) : (\n <View style={[styles.logo, styles.logoPlaceholder]} />\n )}\n <Text style={[styles.name, { color: t.text }]} numberOfLines={1}>{name}</Text>\n <Text style={[styles.odds, { color }]}>{odds}x</Text>\n <Text style={[styles.bets, { color: t.textMuted }]}>{bets} {bets === 1 ? 'bet' : 'bets'}</Text>\n {selected && (\n <View style={[styles.badge, { backgroundColor: color }]}>\n <Text style={styles.badgeText}>Selected</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n title: { fontSize: 17, fontWeight: '700', marginBottom: 12 },\n row: { flexDirection: 'row', gap: 12 },\n option: { flex: 1, borderWidth: 2, borderRadius: 16, padding: 16, alignItems: 'center', gap: 8 },\n logo: { width: 48, height: 48, borderRadius: 24 },\n logoPlaceholder: { backgroundColor: 'rgba(128,128,128,0.2)' },\n name: { fontSize: 15, fontWeight: '700' },\n odds: { fontSize: 20, fontWeight: '800' },\n bets: { fontSize: 12 },\n badge: { borderRadius: 8, paddingHorizontal: 12, paddingVertical: 4, marginTop: 4 },\n badgeText: { color: '#FFF', fontSize: 12, fontWeight: '700' },\n});\n","import { useState } from 'react';\nimport { StyleSheet, View, Text } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { ensurePngAvatar } from '../../utils/avatarUrl';\nimport type { GameDetail } from '../../types';\n\nexport interface PlayersCardProps {\n game: GameDetail;\n /** How many chars to show on each side of a truncated wallet. Default 4. */\n truncateChars?: number;\n /** Override team dot colors. */\n homeColor?: string;\n awayColor?: string;\n drawColor?: string;\n /** Optional Image component (expo-image, etc.). */\n ImageComponent?: React.ComponentType<any>;\n}\n\nfunction truncateWallet(addr: string, chars: number): string {\n if (addr.length <= chars * 2 + 3) return addr;\n return `${addr.slice(0, chars)}...${addr.slice(-chars)}`;\n}\n\n/**\n * Card showing all bettors in a game with their avatar, username, team, and wager amount.\n */\nexport function PlayersCard({\n game,\n truncateChars = 4,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n drawColor = '#A855F7',\n ImageComponent,\n}: PlayersCardProps) {\n const t = useDubsTheme();\n const bettors = game.bettors || [];\n\n const dotColor = (team: 'home' | 'away' | 'draw') => {\n if (team === 'home') return homeColor;\n if (team === 'away') return awayColor;\n return drawColor;\n };\n\n return (\n <View style={[styles.card, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.title, { color: t.text }]}>\n Players{bettors.length > 0 ? ` (${bettors.length})` : ''}\n </Text>\n\n {bettors.length === 0 ? (\n <Text style={[styles.empty, { color: t.textMuted }]}>No players yet — be the first!</Text>\n ) : (\n bettors.map((b, i) => (\n <BettorRow\n key={`${b.wallet}-${i}`}\n bettor={b}\n dotColor={dotColor(b.team)}\n truncateChars={truncateChars}\n isFirst={i === 0}\n ImageComponent={ImageComponent}\n t={t}\n />\n ))\n )}\n </View>\n );\n}\n\nfunction BettorRow({\n bettor, dotColor, truncateChars, isFirst, ImageComponent, t,\n}: {\n bettor: { wallet: string; username: string | null; avatar: string | null; team: 'home' | 'away' | 'draw'; amount: number };\n dotColor: string; truncateChars: number; isFirst: boolean;\n ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n const [imgFailed, setImgFailed] = useState(false);\n const Img = ImageComponent || require('react-native').Image;\n const showAvatar = bettor.avatar && !imgFailed;\n\n return (\n <View style={[styles.row, !isFirst && { borderTopColor: t.border, borderTopWidth: 1 }]}>\n <View style={[styles.dot, { backgroundColor: dotColor }]} />\n {showAvatar ? (\n <Img source={{ uri: ensurePngAvatar(bettor.avatar) }} style={styles.avatar} resizeMode=\"cover\" onError={() => setImgFailed(true)} />\n ) : (\n <View style={[styles.avatar, styles.avatarPlaceholder]} />\n )}\n <View style={styles.nameCol}>\n <Text style={[styles.username, { color: t.text }]} numberOfLines={1}>\n {bettor.username || truncateWallet(bettor.wallet, truncateChars)}\n </Text>\n </View>\n <Text style={[styles.amount, { color: t.textSecondary }]}>{bettor.amount} SOL</Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderRadius: 16, borderWidth: 1, padding: 16 },\n title: { fontSize: 17, fontWeight: '700', marginBottom: 12 },\n empty: { fontSize: 14, textAlign: 'center', paddingVertical: 16 },\n row: { flexDirection: 'row', alignItems: 'center', paddingVertical: 10, gap: 10 },\n dot: { width: 8, height: 8, borderRadius: 4 },\n avatar: { width: 28, height: 28, borderRadius: 14 },\n avatarPlaceholder: { backgroundColor: 'rgba(128,128,128,0.2)' },\n nameCol: { flex: 1 },\n username: { fontSize: 14, fontWeight: '600' },\n amount: { fontSize: 13, fontWeight: '700' },\n});\n","import { useMemo } from 'react';\nimport { StyleSheet, View, Text, TouchableOpacity, ActivityIndicator } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport type { GameDetail, MutationStatus } from '../../types';\n\nexport interface JoinGameButtonProps {\n game: GameDetail;\n walletAddress: string;\n selectedTeam: 'home' | 'away' | null;\n status: MutationStatus;\n onJoin: () => void;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming on-chain...',\n saving: 'Saving...',\n};\n\n/**\n * Fixed bottom bar with buy-in info and join button.\n * Renders nothing if the user already joined, or the game is locked/resolved.\n */\nexport function JoinGameButton({ game, walletAddress, selectedTeam, status, onJoin }: JoinGameButtonProps) {\n const t = useDubsTheme();\n\n const alreadyJoined = useMemo(() => {\n if (!walletAddress) return false;\n return (game.bettors || []).some(b => b.wallet === walletAddress);\n }, [game.bettors, walletAddress]);\n\n if (alreadyJoined || game.isLocked || game.isResolved) return null;\n\n const isJoining = status !== 'idle' && status !== 'success' && status !== 'error';\n const statusLabel = STATUS_LABELS[status] || '';\n\n return (\n <View style={[styles.bar, { backgroundColor: t.background, borderTopColor: t.border }]}>\n <View style={styles.buyInRow}>\n <Text style={[styles.buyInLabel, { color: t.textMuted }]}>Buy-in</Text>\n <Text style={[styles.buyInValue, { color: t.text }]}>{game.buyIn} SOL</Text>\n </View>\n <TouchableOpacity\n style={[styles.button, { backgroundColor: selectedTeam ? t.accent : t.border }]}\n disabled={!selectedTeam || isJoining}\n onPress={onJoin}\n activeOpacity={0.8}\n >\n {isJoining ? (\n <View style={styles.joiningRow}>\n <ActivityIndicator size=\"small\" color=\"#000\" />\n <Text style={styles.buttonText}>{statusLabel}</Text>\n </View>\n ) : (\n <Text style={[styles.buttonText, !selectedTeam && { color: t.textMuted }]}>\n {selectedTeam ? `Join Bet — ${game.buyIn} SOL` : 'Pick a team to bet'}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n bar: { position: 'absolute', bottom: 0, left: 0, right: 0, paddingHorizontal: 16, paddingTop: 12, paddingBottom: 36, borderTopWidth: 1 },\n buyInRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 },\n buyInLabel: { fontSize: 13 },\n buyInValue: { fontSize: 15, fontWeight: '800' },\n button: { borderRadius: 14, paddingVertical: 16, alignItems: 'center' },\n buttonText: { color: '#000', fontSize: 16, fontWeight: '800' },\n joiningRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useCreateCustomGame } from '../../hooks/useCreateCustomGame';\nimport type { CreateCustomGameMutationResult } from '../../hooks/useCreateCustomGame';\n\nexport interface CreateCustomGameSheetProps {\n visible: boolean;\n onDismiss: () => void;\n title?: string;\n maxPlayers?: number;\n fee?: number;\n presetAmounts?: number[];\n defaultAmount?: number;\n metadata?: Record<string, unknown>;\n onAmountChange?: (amount: number | null) => void;\n onSuccess?: (result: CreateCustomGameMutationResult) => void;\n onError?: (error: Error) => void;\n /** Pool mode: hides buy-in selection, uses defaultAmount, auto-assigns team, shows \"Create Pool\" labels */\n isPoolModeEnabled?: boolean;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming...',\n success: 'Game Created!',\n};\n\nexport function CreateCustomGameSheet({\n visible,\n onDismiss,\n title,\n maxPlayers = 2,\n fee = 5,\n presetAmounts = [0.01, 0.1, 0.5, 1],\n defaultAmount = 0.01,\n metadata,\n onAmountChange,\n onSuccess,\n onError,\n isPoolModeEnabled = false,\n}: CreateCustomGameSheetProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const mutation = useCreateCustomGame();\n\n const [selectedAmount, setSelectedAmount] = useState<number | null>(null);\n const [customAmount, setCustomAmount] = useState('');\n const [isCustom, setIsCustom] = useState(false);\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n // Animate overlay on visibility change\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset state when sheet opens\n useEffect(() => {\n if (visible) {\n setSelectedAmount(defaultAmount ?? null);\n setCustomAmount('');\n setIsCustom(false);\n mutation.reset();\n }\n }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-dismiss on success\n useEffect(() => {\n if (mutation.status === 'success' && mutation.data) {\n onSuccess?.(mutation.data);\n const timer = setTimeout(() => {\n onDismiss();\n }, 1500);\n return () => clearTimeout(timer);\n }\n }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Report errors\n useEffect(() => {\n if (mutation.status === 'error' && mutation.error) {\n onError?.(mutation.error);\n }\n }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handlePresetSelect = useCallback((amount: number) => {\n setSelectedAmount(amount);\n setIsCustom(false);\n setCustomAmount('');\n onAmountChange?.(amount);\n }, [onAmountChange]);\n\n const handleCustomSelect = useCallback(() => {\n setIsCustom(true);\n setSelectedAmount(null);\n onAmountChange?.(null);\n }, [onAmountChange]);\n\n const handleCustomAmountChange = useCallback((text: string) => {\n // Allow only numbers and single decimal point\n const cleaned = text.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');\n setCustomAmount(cleaned);\n const parsed = parseFloat(cleaned);\n const amount = parsed > 0 ? parsed : null;\n setSelectedAmount(amount);\n onAmountChange?.(amount);\n }, [onAmountChange]);\n\n const effectiveAmount = selectedAmount;\n const playerCount = maxPlayers || 2;\n\n // In pool mode, always use defaultAmount\n const finalAmount = isPoolModeEnabled ? (defaultAmount ?? 0.1) : effectiveAmount;\n\n const pot = finalAmount ? finalAmount * playerCount : 0;\n const winnerTakes = pot * (1 - fee / 100);\n\n const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n const canCreate = finalAmount !== null && finalAmount > 0 && !isMutating && mutation.status !== 'success';\n\n const handleCreate = useCallback(async () => {\n if (!finalAmount || !wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n teamChoice: 'home',\n wagerAmount: finalAmount,\n title,\n maxPlayers,\n metadata,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [finalAmount, wallet.publicKey, mutation.execute, title, maxPlayers, metadata]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n const playersLabel = playerCount === 2 ? '2 (1v1)' : `${playerCount} players`;\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>{isPoolModeEnabled ? 'Create Pool' : 'New Game'}</Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n {/* Buy-In Section — hidden in pool mode (uses defaultAmount) */}\n {!isPoolModeEnabled && (\n <View style={styles.section}>\n <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Buy-In Amount</Text>\n <View style={styles.chipsRow}>\n {presetAmounts.map((amount) => {\n const active = !isCustom && selectedAmount === amount;\n return (\n <TouchableOpacity\n key={amount}\n style={[\n styles.chip,\n { borderColor: active ? t.accent : t.border },\n active && { backgroundColor: t.accent },\n ]}\n onPress={() => handlePresetSelect(amount)}\n activeOpacity={0.8}\n >\n <Text style={[styles.chipText, { color: active ? '#FFFFFF' : t.text }]}>\n {amount} SOL\n </Text>\n </TouchableOpacity>\n );\n })}\n <TouchableOpacity\n style={[\n styles.chip,\n { borderColor: isCustom ? t.accent : t.border },\n isCustom && { backgroundColor: t.accent },\n ]}\n onPress={handleCustomSelect}\n activeOpacity={0.8}\n >\n <Text style={[styles.chipText, { color: isCustom ? '#FFFFFF' : t.text }]}>\n Custom\n </Text>\n </TouchableOpacity>\n </View>\n\n {isCustom && (\n <TextInput\n style={[styles.input, { backgroundColor: t.surface, color: t.text, borderColor: t.accent }]}\n placeholder=\"Enter amount in SOL\"\n placeholderTextColor={t.textDim}\n keyboardType=\"decimal-pad\"\n value={customAmount}\n onChangeText={handleCustomAmountChange}\n autoFocus\n />\n )}\n </View>\n )}\n\n {/* Summary Card */}\n <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Buy-in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>\n {finalAmount ? `${finalAmount} SOL` : '—'}\n </Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isPoolModeEnabled ? 'Max players' : 'Players'}</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{isPoolModeEnabled ? playerCount : playersLabel}</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isPoolModeEnabled ? 'Max pot' : 'Winner Takes'}</Text>\n <View style={styles.winnerCol}>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {finalAmount ? `${(finalAmount * playerCount * (1 - fee / 100)).toFixed(4)} SOL` : '—'}\n </Text>\n {finalAmount ? (\n <Text style={[styles.feeNote, { color: t.textDim }]}>{fee}% platform fee</Text>\n ) : null}\n </View>\n </View>\n </View>\n\n {/* Error Display */}\n {mutation.error && (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n </View>\n )}\n\n {/* CTA Button */}\n <TouchableOpacity\n style={[\n styles.ctaButton,\n { backgroundColor: canCreate ? t.accent : t.border },\n ]}\n disabled={!canCreate}\n onPress={handleCreate}\n activeOpacity={0.8}\n >\n {isMutating ? (\n <View style={styles.ctaLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n <Text style={styles.ctaText}>{statusLabel}</Text>\n </View>\n ) : mutation.status === 'success' ? (\n <Text style={styles.ctaText}>{isPoolModeEnabled ? 'Pool Created!' : STATUS_LABELS.success}</Text>\n ) : (\n <Text style={[styles.ctaText, !canCreate && { opacity: 0.5 }]}>\n {isPoolModeEnabled\n ? `Create Pool \\u2014 ${finalAmount} SOL`\n : effectiveAmount ? `Create Game \\u2014 ${effectiveAmount} SOL` : 'Select buy-in amount'}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 40,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n section: {\n gap: 12,\n paddingTop: 8,\n },\n sectionLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n chipsRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 10,\n },\n chip: {\n paddingHorizontal: 18,\n paddingVertical: 10,\n borderRadius: 14,\n borderWidth: 1.5,\n },\n chipText: {\n fontSize: 15,\n fontWeight: '600',\n },\n input: {\n height: 56,\n borderRadius: 16,\n borderWidth: 1.5,\n paddingHorizontal: 16,\n fontSize: 16,\n },\n summaryCard: {\n marginTop: 20,\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n summaryRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n summaryLabel: {\n fontSize: 14,\n },\n summaryValue: {\n fontSize: 15,\n fontWeight: '700',\n },\n summarySep: {\n height: 1,\n marginHorizontal: 16,\n },\n winnerCol: {\n alignItems: 'flex-end',\n gap: 2,\n },\n feeNote: {\n fontSize: 11,\n },\n errorBox: {\n marginTop: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n ctaButton: {\n marginTop: 20,\n height: 56,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n ctaText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n ctaLoading: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n },\n});\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useJoinGame } from '../../hooks/useJoinGame';\nimport type { JoinGameMutationResult } from '../../hooks/useJoinGame';\nimport type { GameDetail } from '../../types';\n\nexport interface JoinGameSheetProps {\n visible: boolean;\n onDismiss: () => void;\n game: GameDetail;\n /** Optional Image component (expo-image, etc.) for team logos */\n ImageComponent?: React.ComponentType<any>;\n /** Custom short-name function for team labels */\n shortName?: (name: string | null) => string;\n /** Override team colors (default blue/red) */\n homeColor?: string;\n awayColor?: string;\n /** Callbacks */\n onSuccess?: (result: JoinGameMutationResult) => void;\n onError?: (error: Error) => void;\n /** Pool mode: hides team selection, auto-assigns team, shows \"Join Pool\" labels */\n isPoolModeEnabled?: boolean;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming...',\n success: 'Joined!',\n};\n\nconst CUSTOM_GAME_MODE = 6;\n\nexport function JoinGameSheet({\n visible,\n onDismiss,\n game,\n ImageComponent,\n shortName,\n homeColor = '#3B82F6',\n awayColor = '#EF4444',\n onSuccess,\n onError,\n isPoolModeEnabled = false,\n}: JoinGameSheetProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const mutation = useJoinGame();\n\n const isCustomGame = game.gameMode === CUSTOM_GAME_MODE;\n\n // Pool mode and custom games auto-assign team — no team selection needed.\n // For sports/esports games the user picks a team.\n const [selectedTeam, setSelectedTeam] = useState<'home' | 'away' | null>(null);\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n\n // Animate overlay on visibility change\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset state when sheet opens\n useEffect(() => {\n if (visible) {\n setSelectedTeam(isPoolModeEnabled ? 'home' : isCustomGame ? 'away' : null);\n mutation.reset();\n }\n }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-dismiss on success\n useEffect(() => {\n if (mutation.status === 'success' && mutation.data) {\n onSuccess?.(mutation.data);\n const timer = setTimeout(() => {\n onDismiss();\n }, 1500);\n return () => clearTimeout(timer);\n }\n }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Report errors\n useEffect(() => {\n if (mutation.status === 'error' && mutation.error) {\n onError?.(mutation.error);\n }\n }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // --- Derived values ---\n\n const opponents = game.opponents || [];\n const bettors = game.bettors || [];\n const totalPool = game.totalPool || 0;\n const homePool = game.homePool || 0;\n const awayPool = game.awayPool || 0;\n const buyIn = game.buyIn;\n\n const { homeOdds, awayOdds, homeBets, awayBets } = useMemo(() => ({\n homeOdds: homePool > 0 ? (totalPool / homePool).toFixed(2) : '—',\n awayOdds: awayPool > 0 ? (totalPool / awayPool).toFixed(2) : '—',\n homeBets: bettors.filter(b => b.team === 'home').length,\n awayBets: bettors.filter(b => b.team === 'away').length,\n }), [totalPool, homePool, awayPool, bettors]);\n\n const poolAfterJoin = totalPool + buyIn;\n const selectedOdds = selectedTeam === 'home' ? homeOdds : selectedTeam === 'away' ? awayOdds : '—';\n const potentialWinnings = selectedOdds !== '—' ? (parseFloat(selectedOdds) * buyIn).toFixed(4) : '—';\n\n const homeName = shortName ? shortName(opponents[0]?.name) : (opponents[0]?.name || 'Home');\n const awayName = shortName ? shortName(opponents[1]?.name) : (opponents[1]?.name || 'Away');\n const selectedName = selectedTeam === 'home' ? homeName : selectedTeam === 'away' ? awayName : '—';\n\n const alreadyJoined = useMemo(() => {\n if (!wallet.publicKey) return false;\n const addr = wallet.publicKey.toBase58();\n return bettors.some(b => b.wallet === addr);\n }, [bettors, wallet.publicKey]);\n\n const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n const canJoin = selectedTeam !== null && !isMutating && mutation.status !== 'success' && !alreadyJoined;\n\n const handleJoin = useCallback(async () => {\n if (!selectedTeam || !wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n gameId: game.gameId,\n teamChoice: selectedTeam,\n amount: buyIn,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [selectedTeam, wallet.publicKey, mutation.execute, game.gameId, buyIn]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>{isPoolModeEnabled ? 'Join Pool' : 'Join Game'}</Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n {/* Team Selection — hidden in pool mode and custom games */}\n {!isCustomGame && !isPoolModeEnabled && (\n <View style={styles.section}>\n <Text style={[styles.sectionLabel, { color: t.textSecondary }]}>Pick Your Side</Text>\n <View style={styles.teamsRow}>\n <TeamButton\n name={homeName}\n imageUrl={opponents[0]?.imageUrl}\n odds={homeOdds}\n bets={homeBets}\n color={homeColor}\n selected={selectedTeam === 'home'}\n onPress={() => setSelectedTeam('home')}\n ImageComponent={ImageComponent}\n t={t}\n />\n <TeamButton\n name={awayName}\n imageUrl={opponents[1]?.imageUrl}\n odds={awayOdds}\n bets={awayBets}\n color={awayColor}\n selected={selectedTeam === 'away'}\n onPress={() => setSelectedTeam('away')}\n ImageComponent={ImageComponent}\n t={t}\n />\n </View>\n </View>\n )}\n\n {/* Summary Card */}\n <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Buy-in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{buyIn} SOL</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n {isPoolModeEnabled ? (\n <>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Players in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{bettors.length}</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Current pot</Text>\n <Text style={[styles.summaryValue, { color: t.success }]}>{totalPool} SOL</Text>\n </View>\n </>\n ) : (\n <>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Your side</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{selectedName}</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Total pool</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{poolAfterJoin} SOL</Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Potential winnings</Text>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {potentialWinnings !== '—' ? `${potentialWinnings} SOL` : '—'}\n </Text>\n </View>\n </>\n )}\n </View>\n\n {/* Already Joined Notice */}\n {alreadyJoined && (\n <View style={[styles.errorBox, { backgroundColor: t.surface, borderColor: t.border }]}>\n <Text style={[styles.errorText, { color: t.textMuted }]}>{isPoolModeEnabled ? \"You've already joined this pool.\" : \"You've already joined this game.\"}</Text>\n </View>\n )}\n\n {/* Error Display */}\n {mutation.error && (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n </View>\n )}\n\n {/* CTA Button */}\n <TouchableOpacity\n style={[\n styles.ctaButton,\n { backgroundColor: canJoin ? t.accent : t.border },\n ]}\n disabled={!canJoin}\n onPress={handleJoin}\n activeOpacity={0.8}\n >\n {isMutating ? (\n <View style={styles.ctaLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n <Text style={styles.ctaText}>{statusLabel}</Text>\n </View>\n ) : mutation.status === 'success' ? (\n <Text style={styles.ctaText}>{isPoolModeEnabled ? 'Joined!' : STATUS_LABELS.success}</Text>\n ) : (\n <Text style={[styles.ctaText, !canJoin && { opacity: 0.5 }]}>\n {alreadyJoined\n ? 'Already Joined'\n : isPoolModeEnabled\n ? `Join Pool \\u2014 ${buyIn} SOL`\n : selectedTeam\n ? `Join Game \\u2014 ${buyIn} SOL`\n : 'Pick a side to join'}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\n// ── TeamButton (internal, for sports/esports games) ──\n\nfunction TeamButton({\n name, imageUrl, odds, bets, color, selected, onPress, ImageComponent, t,\n}: {\n name: string; imageUrl?: string | null; odds: string; bets: number;\n color: string; selected: boolean; onPress: () => void;\n ImageComponent?: React.ComponentType<any>; t: any;\n}) {\n const [imgFailed, setImgFailed] = useState(false);\n const Img = ImageComponent || require('react-native').Image;\n const showImage = imageUrl && !imgFailed;\n\n return (\n <TouchableOpacity\n style={[styles.teamOption, { borderColor: selected ? color : t.border, backgroundColor: selected ? color + '15' : t.background }]}\n onPress={onPress}\n activeOpacity={0.7}\n >\n {showImage ? (\n <Img source={{ uri: imageUrl }} style={styles.teamLogo} resizeMode=\"contain\" onError={() => setImgFailed(true)} />\n ) : (\n <View style={[styles.teamLogo, styles.teamLogoPlaceholder]} />\n )}\n <Text style={[styles.teamName, { color: t.text }]} numberOfLines={1}>{name}</Text>\n <Text style={[styles.teamOdds, { color }]}>{odds}x</Text>\n <Text style={[styles.teamBets, { color: t.textMuted }]}>{bets} {bets === 1 ? 'bet' : 'bets'}</Text>\n {selected && (\n <View style={[styles.teamBadge, { backgroundColor: color }]}>\n <Text style={styles.teamBadgeText}>Selected</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 40,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n section: {\n gap: 12,\n paddingTop: 8,\n },\n sectionLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n teamsRow: {\n flexDirection: 'row',\n gap: 12,\n },\n summaryCard: {\n marginTop: 20,\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n summaryRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n summaryLabel: {\n fontSize: 14,\n },\n summaryValue: {\n fontSize: 15,\n fontWeight: '700',\n },\n summarySep: {\n height: 1,\n marginHorizontal: 16,\n },\n errorBox: {\n marginTop: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n ctaButton: {\n marginTop: 20,\n height: 56,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n ctaText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n ctaLoading: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n },\n // Team button styles\n teamOption: {\n flex: 1,\n borderWidth: 2,\n borderRadius: 16,\n padding: 16,\n alignItems: 'center',\n gap: 8,\n },\n teamLogo: {\n width: 48,\n height: 48,\n borderRadius: 24,\n },\n teamLogoPlaceholder: {\n backgroundColor: 'rgba(128,128,128,0.2)',\n },\n teamName: {\n fontSize: 15,\n fontWeight: '700',\n },\n teamOdds: {\n fontSize: 20,\n fontWeight: '800',\n },\n teamBets: {\n fontSize: 12,\n },\n teamBadge: {\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 4,\n marginTop: 4,\n },\n teamBadgeText: {\n color: '#FFF',\n fontSize: 12,\n fontWeight: '700',\n },\n});\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n ActivityIndicator,\n Modal,\n Animated,\n StyleSheet,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useClaim } from '../../hooks/useClaim';\nimport type { ClaimMutationResult } from '../../hooks/useClaim';\n\nexport interface ClaimPrizeSheetProps {\n visible: boolean;\n onDismiss: () => void;\n gameId: string;\n /** Prize amount in SOL */\n prizeAmount: number;\n /** When true, shows refund language instead of prize language */\n isRefund?: boolean;\n /** Callbacks */\n onSuccess?: (result: ClaimMutationResult) => void;\n onError?: (error: Error) => void;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n building: 'Building transaction...',\n signing: 'Approve in wallet...',\n confirming: 'Confirming...',\n success: 'Claimed!',\n};\n\nexport function ClaimPrizeSheet({\n visible,\n onDismiss,\n gameId,\n prizeAmount,\n isRefund = false,\n onSuccess,\n onError,\n}: ClaimPrizeSheetProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const mutation = useClaim();\n\n const overlayOpacity = useRef(new Animated.Value(0)).current;\n const celebrationScale = useRef(new Animated.Value(0)).current;\n const celebrationOpacity = useRef(new Animated.Value(0)).current;\n const [showCelebration, setShowCelebration] = useState(false);\n\n // Animate overlay on visibility change\n useEffect(() => {\n Animated.timing(overlayOpacity, {\n toValue: visible ? 1 : 0,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [visible, overlayOpacity]);\n\n // Reset state when sheet opens\n useEffect(() => {\n if (visible) {\n mutation.reset();\n setShowCelebration(false);\n celebrationScale.setValue(0);\n celebrationOpacity.setValue(0);\n }\n }, [visible]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Celebration animation + auto-dismiss on success\n useEffect(() => {\n if (mutation.status === 'success' && mutation.data) {\n setShowCelebration(true);\n\n Animated.parallel([\n Animated.spring(celebrationScale, {\n toValue: 1,\n tension: 50,\n friction: 6,\n useNativeDriver: true,\n }),\n Animated.timing(celebrationOpacity, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n ]).start();\n\n onSuccess?.(mutation.data);\n\n const timer = setTimeout(() => {\n onDismiss();\n }, 2500);\n return () => clearTimeout(timer);\n }\n }, [mutation.status, mutation.data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Report errors\n useEffect(() => {\n if (mutation.status === 'error' && mutation.error) {\n onError?.(mutation.error);\n }\n }, [mutation.status, mutation.error]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const isMutating = mutation.status !== 'idle' && mutation.status !== 'success' && mutation.status !== 'error';\n const canClaim = !isMutating && mutation.status !== 'success' && !!wallet.publicKey;\n\n const handleClaim = useCallback(async () => {\n if (!wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n gameId,\n amountClaimed: prizeAmount,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [wallet.publicKey, mutation.execute, gameId, prizeAmount]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const statusLabel = STATUS_LABELS[mutation.status] || '';\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n transparent\n onRequestClose={onDismiss}\n >\n <Animated.View style={[styles.overlay, { opacity: overlayOpacity }]}>\n <TouchableOpacity style={styles.overlayTap} activeOpacity={1} onPress={onDismiss} />\n </Animated.View>\n\n <KeyboardAvoidingView\n style={styles.keyboardView}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={styles.sheetPositioner}>\n <View style={[styles.sheet, { backgroundColor: t.background }]}>\n {/* Drag handle */}\n <View style={styles.handleRow}>\n <View style={[styles.handle, { backgroundColor: t.textMuted }]} />\n </View>\n\n {/* Header */}\n <View style={styles.header}>\n <Text style={[styles.headerTitle, { color: t.text }]}>\n {showCelebration\n ? (isRefund ? 'Refund Claimed!' : 'Prize Claimed!')\n : (isRefund ? 'Claim Refund' : 'Claim Prize')}\n </Text>\n <TouchableOpacity onPress={onDismiss} activeOpacity={0.8}>\n <Text style={[styles.closeButton, { color: t.textMuted }]}>{'\\u2715'}</Text>\n </TouchableOpacity>\n </View>\n\n {/* Celebration */}\n {showCelebration && (\n <Animated.View\n style={[\n styles.celebrationContainer,\n {\n opacity: celebrationOpacity,\n transform: [{ scale: celebrationScale }],\n },\n ]}\n >\n <Text style={styles.celebrationEmoji}>{'🏆'}</Text>\n <Text style={[styles.celebrationText, { color: t.success }]}>\n +{prizeAmount} SOL\n </Text>\n <Text style={[styles.celebrationSubtext, { color: t.textMuted }]}>\n {isRefund ? 'Refund sent to your wallet' : 'Winnings sent to your wallet'}\n </Text>\n </Animated.View>\n )}\n\n {/* Summary Card */}\n {!showCelebration && (\n <View style={[styles.summaryCard, { backgroundColor: t.surface, borderColor: t.border }]}>\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>{isRefund ? 'Refund' : 'Prize'}</Text>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {prizeAmount} SOL\n </Text>\n </View>\n <View style={[styles.summarySep, { backgroundColor: t.border }]} />\n <View style={styles.summaryRow}>\n <Text style={[styles.summaryLabel, { color: t.textMuted }]}>Game</Text>\n <Text\n style={[styles.summaryValue, { color: t.text }]}\n numberOfLines={1}\n >\n {gameId.slice(0, 8)}...{gameId.slice(-4)}\n </Text>\n </View>\n </View>\n )}\n\n {/* Error Display */}\n {mutation.error && (\n <View style={[styles.errorBox, { backgroundColor: t.errorBg, borderColor: t.errorBorder }]}>\n <Text style={[styles.errorText, { color: t.errorText }]}>{mutation.error.message}</Text>\n </View>\n )}\n\n {/* CTA Button */}\n {!showCelebration && (\n <TouchableOpacity\n style={[\n styles.ctaButton,\n { backgroundColor: canClaim ? t.accent : t.border },\n ]}\n disabled={!canClaim}\n onPress={handleClaim}\n activeOpacity={0.8}\n >\n {isMutating ? (\n <View style={styles.ctaLoading}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n <Text style={styles.ctaText}>{statusLabel}</Text>\n </View>\n ) : (\n <Text style={[styles.ctaText, !canClaim && { opacity: 0.5 }]}>\n {isRefund ? 'Claim Refund' : 'Claim Prize'} — {prizeAmount} SOL\n </Text>\n )}\n </TouchableOpacity>\n )}\n\n {/* Explorer link on success */}\n {mutation.data?.explorerUrl && (\n <Text style={[styles.explorerHint, { color: t.textMuted }]}>\n View on Solscan\n </Text>\n )}\n </View>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n overlayTap: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n sheetPositioner: {\n justifyContent: 'flex-end',\n },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 20,\n paddingBottom: 40,\n },\n handleRow: {\n alignItems: 'center',\n paddingTop: 10,\n paddingBottom: 8,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 2,\n opacity: 0.4,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n },\n headerTitle: {\n fontSize: 20,\n fontWeight: '700',\n },\n closeButton: {\n fontSize: 20,\n padding: 4,\n },\n // Celebration\n celebrationContainer: {\n alignItems: 'center',\n paddingVertical: 32,\n gap: 8,\n },\n celebrationEmoji: {\n fontSize: 64,\n },\n celebrationText: {\n fontSize: 32,\n fontWeight: '800',\n },\n celebrationSubtext: {\n fontSize: 14,\n marginTop: 4,\n },\n // Summary\n summaryCard: {\n marginTop: 20,\n borderRadius: 16,\n borderWidth: 1,\n overflow: 'hidden',\n },\n summaryRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n },\n summaryLabel: {\n fontSize: 14,\n },\n summaryValue: {\n fontSize: 15,\n fontWeight: '700',\n },\n summarySep: {\n height: 1,\n marginHorizontal: 16,\n },\n // Error\n errorBox: {\n marginTop: 16,\n borderRadius: 12,\n borderWidth: 1,\n padding: 12,\n },\n errorText: {\n fontSize: 13,\n fontWeight: '500',\n },\n // CTA\n ctaButton: {\n marginTop: 20,\n height: 56,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n ctaText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n ctaLoading: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n },\n explorerHint: {\n textAlign: 'center',\n marginTop: 12,\n fontSize: 13,\n },\n});\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { StyleSheet, Text, TouchableOpacity, type ViewStyle } from 'react-native';\nimport { useDubsTheme } from '../theme';\nimport { useDubs } from '../../provider';\nimport { useGame } from '../../hooks/useGame';\nimport { useHasClaimed } from '../../hooks/useHasClaimed';\nimport { ClaimPrizeSheet } from './ClaimPrizeSheet';\nimport type { ClaimMutationResult } from '../../hooks/useClaim';\n\nexport interface ClaimButtonProps {\n gameId: string;\n style?: ViewStyle;\n onSuccess?: (result: ClaimMutationResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Drop-in claim button that handles eligibility checks, prize/refund display,\n * and the claim sheet lifecycle internally.\n *\n * Renders nothing when the user is ineligible (lost, not resolved, not a bettor, etc.).\n */\nexport function ClaimButton({ gameId, style, onSuccess, onError }: ClaimButtonProps) {\n const t = useDubsTheme();\n const { wallet } = useDubs();\n const game = useGame(gameId);\n const claimStatus = useHasClaimed(gameId);\n const [sheetVisible, setSheetVisible] = useState(false);\n\n const walletAddress = wallet.publicKey?.toBase58() ?? null;\n\n const myBet = useMemo(() => {\n if (!walletAddress || !game.data?.bettors) return null;\n return game.data.bettors.find(b => b.wallet === walletAddress) ?? null;\n }, [walletAddress, game.data?.bettors]);\n\n const isResolved = game.data?.isResolved ?? false;\n const isRefund = isResolved && game.data?.winnerSide === null;\n const isWinner = isResolved && myBet != null && myBet.team === game.data?.winnerSide;\n const isEligible = myBet != null && isResolved && (isWinner || isRefund);\n const prizeAmount = isRefund ? (myBet?.amount ?? 0) : (game.data?.totalPool ?? 0);\n\n const handleSuccess = useCallback(\n (result: ClaimMutationResult) => {\n claimStatus.refetch();\n onSuccess?.(result);\n },\n [claimStatus.refetch, onSuccess], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n // Don't render while loading or missing wallet/data\n if (game.loading || claimStatus.loading || !game.data || !walletAddress) {\n return null;\n }\n\n const label = isRefund ? 'Refund' : 'Prize';\n\n // Already claimed — always show badge regardless of eligibility computation\n if (claimStatus.hasClaimed) {\n return (\n <TouchableOpacity\n style={[styles.badge, { borderColor: t.accent }, style]}\n activeOpacity={1}\n disabled\n >\n <Text style={[styles.badgeText, { color: t.accent }]}>\n {label} Claimed!\n </Text>\n </TouchableOpacity>\n );\n }\n\n // Not eligible (lost, not resolved, not a bettor) — render nothing\n if (!isEligible) {\n return null;\n }\n\n return (\n <>\n <TouchableOpacity\n style={[styles.button, { backgroundColor: t.accent }, style]}\n activeOpacity={0.8}\n onPress={() => setSheetVisible(true)}\n >\n <Text style={styles.buttonText}>\n Claim {label} — {prizeAmount} SOL\n </Text>\n </TouchableOpacity>\n\n <ClaimPrizeSheet\n visible={sheetVisible}\n onDismiss={() => setSheetVisible(false)}\n gameId={gameId}\n prizeAmount={prizeAmount}\n isRefund={isRefund}\n onSuccess={handleSuccess}\n onError={onError}\n />\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n button: {\n height: 52,\n borderRadius: 14,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 20,\n },\n buttonText: {\n color: '#FFFFFF',\n fontSize: 16,\n fontWeight: '700',\n },\n badge: {\n height: 52,\n borderRadius: 14,\n borderWidth: 2,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 20,\n },\n badgeText: {\n fontSize: 16,\n fontWeight: '700',\n },\n});\n"],"mappings":"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","names":["createContext","useContext","useMemo","useCallback","useState","useEffect","Connection","createContext","useContext","PublicKey","Transaction","bs58","requestId","TAG","bs58","PublicKey","Transaction","jsx","TAG","createContext","useContext","React","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","StyleSheet","Platform","Image","ScrollView","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","Transaction","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useCallback","useState","useCallback","error","useState","useEffect","useState","useEffect","useState","useCallback","useRef","useContext","bs58","createContext","Platform","useContext","useState","useRef","useCallback","bs58","user","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","useRef","useEffect","Platform","useState","useRef","useCallback","Platform","useEffect","View","Text","TouchableOpacity","Image","StyleSheet","jsx","jsxs","View","styles","TouchableOpacity","Image","Text","StyleSheet","Fragment","jsx","jsxs","useState","useEffect","useCallback","View","Text","ActivityIndicator","TouchableOpacity","React","useRef","Image","Platform","ScrollView","StyleSheet","jsx","createContext","useMemo","useState","useEffect","Connection","useCallback","useContext","useMemo","View","Text","Image","StyleSheet","jsx","jsxs","useMemo","View","styles","Image","Text","StyleSheet","View","Text","ScrollView","TouchableOpacity","ActivityIndicator","StyleSheet","Fragment","jsx","jsxs","truncateAddress","ScrollView","styles","View","TouchableOpacity","Text","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","useMemo","View","Text","TouchableOpacity","ActivityIndicator","Animated","StyleSheet","KeyboardAvoidingView","Platform","Image","ScrollView","jsx","jsxs","truncateAddress","useRef","Animated","useMemo","useState","useEffect","useCallback","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ScrollView","Image","ActivityIndicator","StyleSheet","useState","StyleSheet","View","Text","jsx","jsxs","View","styles","Text","useState","StyleSheet","useMemo","StyleSheet","View","Text","jsx","jsxs","useMemo","View","styles","Text","StyleSheet","useState","useMemo","StyleSheet","View","Text","TouchableOpacity","jsx","jsxs","useMemo","View","styles","Text","useState","TouchableOpacity","StyleSheet","useState","StyleSheet","View","Text","jsx","jsxs","View","styles","Text","useState","StyleSheet","useMemo","StyleSheet","View","Text","TouchableOpacity","ActivityIndicator","jsx","jsxs","useMemo","View","styles","Text","TouchableOpacity","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","View","Text","TextInput","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","jsx","jsxs","STATUS_LABELS","useState","useRef","Animated","useEffect","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","TextInput","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","useMemo","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","Fragment","jsx","jsxs","STATUS_LABELS","useState","useRef","Animated","useEffect","useMemo","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ActivityIndicator","StyleSheet","useState","useEffect","useRef","useCallback","View","Text","TouchableOpacity","ActivityIndicator","Modal","Animated","StyleSheet","KeyboardAvoidingView","Platform","jsx","jsxs","STATUS_LABELS","useRef","Animated","useState","useEffect","useCallback","Modal","styles","TouchableOpacity","KeyboardAvoidingView","Platform","View","Text","ActivityIndicator","StyleSheet","useState","useMemo","useCallback","StyleSheet","Text","TouchableOpacity","Fragment","jsx","jsxs","useState","useMemo","useCallback","TouchableOpacity","styles","Text","StyleSheet"]}
|