@dubsdotapp/expo 0.2.8 → 0.2.9
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.d.mts +12 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +33 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +33 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/hooks/useAuth.ts +16 -3
- package/src/wallet/mwa-adapter.ts +31 -0
- package/src/wallet/types.ts +7 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/errors.ts","../src/client.ts","../src/storage.ts","../src/provider.tsx","../src/managed-wallet.tsx","../src/wallet/mwa-adapter.ts","../src/ui/ConnectWalletScreen.tsx","../src/ui/theme.ts","../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/useAuth.ts","../src/auth-context.ts","../src/ui/UserProfileCard.tsx","../src/ui/SettingsSheet.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"],"sourcesContent":["// Core\nexport { DubsClient } from './client';\nexport type { DubsClientConfig } from './client';\nexport { DubsApiError, parseSolanaError, SOLANA_PROGRAM_ERRORS } from './errors';\nexport { DEFAULT_BASE_URL, DEFAULT_RPC_URL, NETWORK_CONFIG } from './constants';\nexport type { DubsNetwork } from './constants';\n\n// Storage\nexport { createSecureStoreStorage, STORAGE_KEYS } from './storage';\nexport type { TokenStorage } from './storage';\n\n// Types\nexport type {\n UnifiedEvent,\n Opponent,\n EventMedia,\n EventStream,\n EventMeta,\n Pagination,\n EsportsMatchDetail,\n EsportsMatchOpponent,\n EsportsMatchResult,\n ValidateEventResult,\n CreateGameParams,\n CreateGameResult,\n CreateCustomGameParams,\n CreateCustomGameResult,\n JoinGameParams,\n JoinGameResult,\n ConfirmGameParams,\n ConfirmGameResult,\n BuildClaimParams,\n BuildClaimResult,\n Bettor,\n GameDetail,\n GameMedia,\n GameListItem,\n GameListOpponent,\n GetGamesParams,\n GetNetworkGamesParams,\n GetUpcomingEventsParams,\n ParsedError,\n SolanaErrorCode,\n MutationStatus,\n QueryResult,\n MutationResult,\n DubsUser,\n DubsPublicUser,\n DubsAppUser,\n NonceResult,\n AuthenticateParams,\n AuthenticateResult,\n RegisterParams,\n RegisterResult,\n CheckUsernameResult,\n AuthStatus,\n LiveScore,\n LiveScoreCompetitor,\n UiConfig,\n} from './types';\n\n// Provider\nexport { DubsProvider, useDubs, useAppConfig } from './provider';\nexport type { DubsProviderProps, DubsContextValue } from './provider';\n\n// Wallet\nexport type { WalletAdapter } from './wallet';\nexport { MwaWalletAdapter } from './wallet';\nexport type { MwaAdapterConfig, MwaTransactFn } from './wallet';\n\n// Hooks\nexport {\n useEvents,\n useGame,\n useGames,\n useNetworkGames,\n useCreateGame,\n useCreateCustomGame,\n useJoinGame,\n useClaim,\n useAuth,\n} from './hooks';\nexport type {\n CreateGameMutationResult,\n CreateCustomGameMutationResult,\n JoinGameMutationResult,\n ClaimMutationResult,\n UseAuthResult,\n} from './hooks';\n\n// UI\nexport { AuthGate, ConnectWalletScreen, UserProfileCard, SettingsSheet, useDubsTheme, mergeTheme } from './ui';\nexport type { AuthGateProps, RegistrationScreenProps, ConnectWalletScreenProps, UserProfileCardProps, SettingsSheetProps, DubsTheme } from './ui';\n\n// Game widgets\nexport { GamePoster, LivePoolsCard, PickWinnerCard, PlayersCard, JoinGameButton, CreateCustomGameSheet } from './ui';\nexport type {\n GamePosterProps,\n LivePoolsCardProps,\n PickWinnerCardProps,\n PlayersCardProps,\n JoinGameButtonProps,\n CreateCustomGameSheetProps,\n} from './ui';\n\n// Utils\nexport { signAndSendBase64Transaction } from './utils/transaction';\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: 'https://dubs-server-dev-55d1fba09a97.herokuapp.com/api/developer/v1',\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 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} 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 // ── 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 // ── 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 // ── 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) */\n async getAppConfig(): Promise<UiConfig> {\n const res = await this.request<{ data: { uiConfig: UiConfig } }>('GET', '/apps/config');\n return res.data?.uiConfig || {};\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 JWT_TOKEN: 'dubs_jwt_token',\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 { 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}\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}\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}: 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 const cluster = config.cluster;\n\n // Create stable instances\n const client = useMemo(() => new DubsClient({ apiKey, baseUrl }), [apiKey, baseUrl]);\n const connection = useMemo(() => new Connection(rpcUrl, { commitment: 'confirmed' }), [rpcUrl]);\n const storage = useMemo(() => tokenStorage || createSecureStoreStorage(), [tokenStorage]);\n\n // Fetch developer UI config on mount (silent fail = default theme)\n const [uiConfig, setUiConfig] = useState<UiConfig | null>(null);\n useEffect(() => {\n client.getAppConfig()\n .then((config) => {\n console.log('[DubsProvider] UI config loaded:', JSON.stringify(config));\n setUiConfig(config);\n })\n .catch((err) => {\n console.log('[DubsProvider] UI config fetch failed, using defaults:', err?.message);\n setUiConfig({});\n });\n }, [client]);\n\n // Wait for config before rendering so accent color is applied on first paint\n if (uiConfig === null) return null;\n\n // ── Path A: External wallet provided (BYOA) ──\n if (externalWallet) {\n return (\n <ExternalWalletProvider\n client={client}\n connection={connection}\n wallet={externalWallet}\n appName={uiConfig.appName || appName}\n network={network}\n storage={storage}\n managed={managed}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n >\n {children}\n </ExternalWalletProvider>\n );\n }\n\n // ── Path B: Managed MWA wallet ──\n return (\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 >\n {(adapter) => (\n <ManagedInner\n client={client}\n connection={connection}\n wallet={adapter}\n appName={uiConfig.appName || appName}\n network={network}\n storage={storage}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n >\n {children}\n </ManagedInner>\n )}\n </ManagedWalletProvider>\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 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 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 }),\n [client, wallet, connection, appName, network, disconnect, uiConfig],\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 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 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 }),\n [client, wallet, connection, appName, network, disconnect, uiConfig],\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 React, { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';\nimport { MwaWalletAdapter } from './wallet/mwa-adapter';\nimport { ConnectWalletScreen } from './ui/ConnectWalletScreen';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { TokenStorage } from './storage';\nimport { STORAGE_KEYS } from './storage';\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 children: (adapter: MwaWalletAdapter) => 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 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 const adapterRef = useRef<MwaWalletAdapter | null>(null);\n const transactRef = useRef<any>(null);\n\n // Lazily create adapter\n if (!adapterRef.current) {\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 },\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 const adapter = adapterRef.current;\n\n // Dynamic-import transact on mount\n useEffect(() => {\n let cancelled = false;\n\n (async () => {\n try {\n const mwa = await import('@solana-mobile/mobile-wallet-adapter-protocol-web3js');\n if (cancelled) return;\n transactRef.current = mwa.transact;\n } catch {\n // MWA not installed — transact calls will throw a clear error\n }\n\n // Attempt silent reconnect from saved token\n try {\n const savedToken = await storage.getItem(STORAGE_KEYS.MWA_AUTH_TOKEN);\n if (savedToken && !cancelled) {\n adapter.setAuthToken(savedToken);\n await adapter.connect();\n if (!cancelled) setConnected(true);\n }\n } catch {\n // Token expired or wallet unavailable — user will tap Connect manually\n } finally {\n if (!cancelled) setIsReady(true);\n }\n })();\n\n return () => { cancelled = true; };\n }, [adapter, storage]);\n\n const handleConnect = useCallback(async () => {\n setConnecting(true);\n setError(null);\n try {\n await adapter.connect();\n setConnected(true);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Connection failed';\n setError(message);\n } finally {\n setConnecting(false);\n }\n }, [adapter]);\n\n const disconnect = useCallback(async () => {\n adapter.disconnect();\n await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n setConnected(false);\n }, [adapter, storage]);\n\n // Show nothing until we've attempted silent reconnect\n if (!isReady) return null;\n\n // Not connected — show connect screen\n if (!connected) {\n if (renderConnectScreen === false) {\n // Headless mode — render nothing\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 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 *\n * Usage:\n * ```ts\n * import { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\n *\n * const adapter = new MwaWalletAdapter({\n * transact,\n * appIdentity: { name: 'My App' },\n * });\n * ```\n */\nexport class MwaWalletAdapter implements WalletAdapter {\n private _publicKey: PublicKey | null = null;\n private _connected = false;\n private _authToken: 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 * Connect to a mobile wallet. Call this before any signing.\n */\n async connect(): Promise<void> {\n await this.transact(async (wallet) => {\n const authResult = this._authToken\n ? await wallet.reauthorize({ auth_token: this._authToken })\n : await wallet.authorize({\n identity: this.config.appIdentity,\n cluster: this.config.cluster || 'mainnet-beta',\n });\n\n this._publicKey = toPublicKey(authResult.accounts[0].address);\n this._authToken = authResult.auth_token;\n this._connected = true;\n\n this.config.onAuthTokenChange?.(this._authToken);\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.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._authToken = reauth.auth_token;\n this.config.onAuthTokenChange?.(this._authToken);\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._authToken = reauth.auth_token;\n this.config.onAuthTokenChange?.(this._authToken);\n\n const result = await wallet.signMessages({\n addresses: [this._publicKey!.toBytes()],\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 const signature = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this._authToken = reauth.auth_token;\n this.config.onAuthTokenChange?.(this._authToken);\n\n const result = await wallet.signAndSendTransactions({\n transactions: [transaction],\n });\n return result[0];\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","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 { 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\nexport function useDubsTheme(): DubsTheme {\n const scheme = useColorScheme();\n return scheme === 'light' ? light : dark;\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, { 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 { 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\nfunction generateSeed(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction getAvatarUrl(style: string, seed: string, size = 256): string {\n return `https://api.dicebear.com/9.x/${style}/png?seed=${seed}&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 } = useDubs();\n const auth = useAuth();\n const [phase, setPhase] = useState<'init' | 'active'>('init');\n const [registrationPhase, setRegistrationPhase] = 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) { 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 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 return <AuthContext.Provider value={auth}>{children}</AuthContext.Provider>;\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 [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);\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 <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, 80) }} style={s.styleThumb} />\n </TouchableOpacity>\n ))}\n </ScrollView>\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// ── 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 } = 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 );\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 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 explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: CreateGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n 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 } 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 * Returns the transaction signature.\n */\nexport async function signAndSendBase64Transaction(\n base64Tx: string,\n wallet: WalletAdapter,\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 if (wallet.signAndSendTransaction) {\n return wallet.signAndSendTransaction(transaction);\n }\n\n throw new Error('Wallet does not support signAndSendTransaction');\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 } = 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 );\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 await client.confirmGame(confirmParams);\n console.log('[useJoinGame] Step 3 done. Backend confirmed.');\n\n const explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: JoinGameMutationResult = {\n gameId: params.gameId,\n gameAddress: joinResult.gameAddress,\n signature,\n 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 } = 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): 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 );\n console.log('[useClaim] Step 2 done. Signature:', signature);\n\n // Claims don't need backend confirmation — the on-chain tx is the claim\n const explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: ClaimMutationResult = {\n gameId: params.gameId,\n signature,\n explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useClaim] Complete!');\n return result;\n } catch (err) {\n console.error('[useClaim] 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, 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 } = 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 );\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 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 explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: CreateCustomGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n 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, useCallback, useRef, useContext } from 'react';\nimport bs58 from 'bs58';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport type { AuthStatus, DubsUser } from '../types';\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 /** 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 [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 between authenticate → register (single-sign flow)\n const pendingAuth = useRef<{\n walletAddress: string;\n nonce: string;\n signature: string;\n } | null>(null);\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 const walletAddress = wallet.publicKey.toBase58();\n setStatus('authenticating');\n setError(null);\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 const signature = bs58.encode(signatureBytes);\n\n // 3. Verify with server\n setStatus('verifying');\n const result = await client.authenticate({ walletAddress, signature, nonce });\n\n if (result.needsRegistration) {\n // Stash credentials for register() — nonce is NOT consumed\n pendingAuth.current = { walletAddress, nonce, signature };\n setStatus('needsRegistration');\n return;\n }\n\n // Existing user — fully authenticated\n setUser(result.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, wallet]);\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 });\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(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(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 // 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 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 React, { useMemo } from 'react';\nimport { View, Text, Image, StyleSheet } from 'react-native';\nimport { useDubsTheme } from './theme';\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 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 { 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 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: 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 ? '#22D3EE' : 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}\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}: 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 const pot = effectiveAmount ? effectiveAmount * 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 = effectiveAmount !== null && effectiveAmount > 0 && !isMutating && mutation.status !== 'success';\n\n const handleCreate = useCallback(async () => {\n if (!effectiveAmount || !wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n teamChoice: 'home',\n wagerAmount: effectiveAmount,\n title,\n maxPlayers,\n metadata,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [effectiveAmount, 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 }]}>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 */}\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 {/* 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 }]}>Your buy-in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>\n {effectiveAmount ? `${effectiveAmount} 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 }]}>Players</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{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 }]}>Winner Takes</Text>\n <View style={styles.winnerCol}>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {effectiveAmount ? `${winnerTakes.toFixed(4)} SOL` : '—'}\n </Text>\n {effectiveAmount ? (\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}>{STATUS_LABELS.success}</Text>\n ) : (\n <Text style={[styles.ctaText, !canCreate && { opacity: 0.5 }]}>\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"],"mappings":"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","names":["import_react","import_web3","import_react_native","import_jsx_runtime","import_react","import_react_native","import_react","import_react","import_react","import_react","import_react","import_web3","error","import_react","error","import_react","error","import_react","error","import_react","import_react","bs58","user","import_jsx_runtime","React","import_jsx_runtime","config","import_react","import_react_native","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","truncateAddress","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","STATUS_LABELS","styles"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/errors.ts","../src/client.ts","../src/storage.ts","../src/provider.tsx","../src/managed-wallet.tsx","../src/wallet/mwa-adapter.ts","../src/ui/ConnectWalletScreen.tsx","../src/ui/theme.ts","../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/useAuth.ts","../src/auth-context.ts","../src/ui/UserProfileCard.tsx","../src/ui/SettingsSheet.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"],"sourcesContent":["// Core\nexport { DubsClient } from './client';\nexport type { DubsClientConfig } from './client';\nexport { DubsApiError, parseSolanaError, SOLANA_PROGRAM_ERRORS } from './errors';\nexport { DEFAULT_BASE_URL, DEFAULT_RPC_URL, NETWORK_CONFIG } from './constants';\nexport type { DubsNetwork } from './constants';\n\n// Storage\nexport { createSecureStoreStorage, STORAGE_KEYS } from './storage';\nexport type { TokenStorage } from './storage';\n\n// Types\nexport type {\n UnifiedEvent,\n Opponent,\n EventMedia,\n EventStream,\n EventMeta,\n Pagination,\n EsportsMatchDetail,\n EsportsMatchOpponent,\n EsportsMatchResult,\n ValidateEventResult,\n CreateGameParams,\n CreateGameResult,\n CreateCustomGameParams,\n CreateCustomGameResult,\n JoinGameParams,\n JoinGameResult,\n ConfirmGameParams,\n ConfirmGameResult,\n BuildClaimParams,\n BuildClaimResult,\n Bettor,\n GameDetail,\n GameMedia,\n GameListItem,\n GameListOpponent,\n GetGamesParams,\n GetNetworkGamesParams,\n GetUpcomingEventsParams,\n ParsedError,\n SolanaErrorCode,\n MutationStatus,\n QueryResult,\n MutationResult,\n DubsUser,\n DubsPublicUser,\n DubsAppUser,\n NonceResult,\n AuthenticateParams,\n AuthenticateResult,\n RegisterParams,\n RegisterResult,\n CheckUsernameResult,\n AuthStatus,\n LiveScore,\n LiveScoreCompetitor,\n UiConfig,\n} from './types';\n\n// Provider\nexport { DubsProvider, useDubs, useAppConfig } from './provider';\nexport type { DubsProviderProps, DubsContextValue } from './provider';\n\n// Wallet\nexport type { WalletAdapter } from './wallet';\nexport { MwaWalletAdapter } from './wallet';\nexport type { MwaAdapterConfig, MwaTransactFn } from './wallet';\n\n// Hooks\nexport {\n useEvents,\n useGame,\n useGames,\n useNetworkGames,\n useCreateGame,\n useCreateCustomGame,\n useJoinGame,\n useClaim,\n useAuth,\n} from './hooks';\nexport type {\n CreateGameMutationResult,\n CreateCustomGameMutationResult,\n JoinGameMutationResult,\n ClaimMutationResult,\n UseAuthResult,\n} from './hooks';\n\n// UI\nexport { AuthGate, ConnectWalletScreen, UserProfileCard, SettingsSheet, useDubsTheme, mergeTheme } from './ui';\nexport type { AuthGateProps, RegistrationScreenProps, ConnectWalletScreenProps, UserProfileCardProps, SettingsSheetProps, DubsTheme } from './ui';\n\n// Game widgets\nexport { GamePoster, LivePoolsCard, PickWinnerCard, PlayersCard, JoinGameButton, CreateCustomGameSheet } from './ui';\nexport type {\n GamePosterProps,\n LivePoolsCardProps,\n PickWinnerCardProps,\n PlayersCardProps,\n JoinGameButtonProps,\n CreateCustomGameSheetProps,\n} from './ui';\n\n// Utils\nexport { signAndSendBase64Transaction } from './utils/transaction';\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: 'https://dubs-server-dev-55d1fba09a97.herokuapp.com/api/developer/v1',\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 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} 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 // ── 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 // ── 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 // ── 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) */\n async getAppConfig(): Promise<UiConfig> {\n const res = await this.request<{ data: { uiConfig: UiConfig } }>('GET', '/apps/config');\n return res.data?.uiConfig || {};\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 JWT_TOKEN: 'dubs_jwt_token',\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 { 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}\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}\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}: 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 const cluster = config.cluster;\n\n // Create stable instances\n const client = useMemo(() => new DubsClient({ apiKey, baseUrl }), [apiKey, baseUrl]);\n const connection = useMemo(() => new Connection(rpcUrl, { commitment: 'confirmed' }), [rpcUrl]);\n const storage = useMemo(() => tokenStorage || createSecureStoreStorage(), [tokenStorage]);\n\n // Fetch developer UI config on mount (silent fail = default theme)\n const [uiConfig, setUiConfig] = useState<UiConfig | null>(null);\n useEffect(() => {\n client.getAppConfig()\n .then((config) => {\n console.log('[DubsProvider] UI config loaded:', JSON.stringify(config));\n setUiConfig(config);\n })\n .catch((err) => {\n console.log('[DubsProvider] UI config fetch failed, using defaults:', err?.message);\n setUiConfig({});\n });\n }, [client]);\n\n // Wait for config before rendering so accent color is applied on first paint\n if (uiConfig === null) return null;\n\n // ── Path A: External wallet provided (BYOA) ──\n if (externalWallet) {\n return (\n <ExternalWalletProvider\n client={client}\n connection={connection}\n wallet={externalWallet}\n appName={uiConfig.appName || appName}\n network={network}\n storage={storage}\n managed={managed}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n >\n {children}\n </ExternalWalletProvider>\n );\n }\n\n // ── Path B: Managed MWA wallet ──\n return (\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 >\n {(adapter) => (\n <ManagedInner\n client={client}\n connection={connection}\n wallet={adapter}\n appName={uiConfig.appName || appName}\n network={network}\n storage={storage}\n renderLoading={renderLoading}\n renderError={renderError}\n renderRegistration={renderRegistration}\n accentColor={uiConfig.accentColor}\n uiConfig={uiConfig}\n >\n {children}\n </ManagedInner>\n )}\n </ManagedWalletProvider>\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 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 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 }),\n [client, wallet, connection, appName, network, disconnect, uiConfig],\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 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 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 }),\n [client, wallet, connection, appName, network, disconnect, uiConfig],\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 React, { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';\nimport { MwaWalletAdapter } from './wallet/mwa-adapter';\nimport { ConnectWalletScreen } from './ui/ConnectWalletScreen';\nimport type { ConnectWalletScreenProps } from './ui/ConnectWalletScreen';\nimport type { TokenStorage } from './storage';\nimport { STORAGE_KEYS } from './storage';\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 children: (adapter: MwaWalletAdapter) => 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 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 const adapterRef = useRef<MwaWalletAdapter | null>(null);\n const transactRef = useRef<any>(null);\n\n // Lazily create adapter\n if (!adapterRef.current) {\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 },\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 const adapter = adapterRef.current;\n\n // Dynamic-import transact on mount\n useEffect(() => {\n let cancelled = false;\n\n (async () => {\n try {\n const mwa = await import('@solana-mobile/mobile-wallet-adapter-protocol-web3js');\n if (cancelled) return;\n transactRef.current = mwa.transact;\n } catch {\n // MWA not installed — transact calls will throw a clear error\n }\n\n // Attempt silent reconnect from saved token\n try {\n const savedToken = await storage.getItem(STORAGE_KEYS.MWA_AUTH_TOKEN);\n if (savedToken && !cancelled) {\n adapter.setAuthToken(savedToken);\n await adapter.connect();\n if (!cancelled) setConnected(true);\n }\n } catch {\n // Token expired or wallet unavailable — user will tap Connect manually\n } finally {\n if (!cancelled) setIsReady(true);\n }\n })();\n\n return () => { cancelled = true; };\n }, [adapter, storage]);\n\n const handleConnect = useCallback(async () => {\n setConnecting(true);\n setError(null);\n try {\n await adapter.connect();\n setConnected(true);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Connection failed';\n setError(message);\n } finally {\n setConnecting(false);\n }\n }, [adapter]);\n\n const disconnect = useCallback(async () => {\n adapter.disconnect();\n await storage.deleteItem(STORAGE_KEYS.MWA_AUTH_TOKEN).catch(() => {});\n await storage.deleteItem(STORAGE_KEYS.JWT_TOKEN).catch(() => {});\n setConnected(false);\n }, [adapter, storage]);\n\n // Show nothing until we've attempted silent reconnect\n if (!isReady) return null;\n\n // Not connected — show connect screen\n if (!connected) {\n if (renderConnectScreen === false) {\n // Headless mode — render nothing\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 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 *\n * Usage:\n * ```ts\n * import { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\n *\n * const adapter = new MwaWalletAdapter({\n * transact,\n * appIdentity: { name: 'My App' },\n * });\n * ```\n */\nexport class MwaWalletAdapter implements WalletAdapter {\n private _publicKey: PublicKey | null = null;\n private _connected = false;\n private _authToken: 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 * Connect to a mobile wallet. Call this before any signing.\n */\n async connect(): Promise<void> {\n await this.transact(async (wallet) => {\n const authResult = this._authToken\n ? await wallet.reauthorize({ auth_token: this._authToken })\n : await wallet.authorize({\n identity: this.config.appIdentity,\n cluster: this.config.cluster || 'mainnet-beta',\n });\n\n this._publicKey = toPublicKey(authResult.accounts[0].address);\n this._authToken = authResult.auth_token;\n this._connected = true;\n\n this.config.onAuthTokenChange?.(this._authToken);\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.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._authToken = reauth.auth_token;\n this.config.onAuthTokenChange?.(this._authToken);\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._authToken = reauth.auth_token;\n this.config.onAuthTokenChange?.(this._authToken);\n\n const result = await wallet.signMessages({\n addresses: [this._publicKey!.toBytes()],\n payloads: [message],\n });\n return result[0];\n });\n\n return sig instanceof Uint8Array ? sig : new Uint8Array(sig);\n }\n\n /**\n * Connect (authorize) and sign a message in a single MWA transact() session.\n * This avoids the double-open problem with Phantom on regular Android where\n * two rapid transact() calls cause the second one to be auto-declined.\n */\n async connectAndSignMessage(message: Uint8Array): Promise<Uint8Array> {\n const sig = await this.transact(async (wallet) => {\n // Authorize or reauthorize in the same session\n const authResult = this._authToken\n ? await wallet.reauthorize({ auth_token: this._authToken })\n : await wallet.authorize({\n identity: this.config.appIdentity,\n cluster: this.config.cluster || 'mainnet-beta',\n });\n\n this._publicKey = toPublicKey(authResult.accounts[0].address);\n this._authToken = authResult.auth_token;\n this._connected = true;\n this.config.onAuthTokenChange?.(this._authToken);\n\n // Sign message in the same session — no second app-switch\n const result = await wallet.signMessages({\n addresses: [this._publicKey.toBytes()],\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 const signature = await this.transact(async (wallet) => {\n const reauth = await wallet.reauthorize({ auth_token: this._authToken });\n this._authToken = reauth.auth_token;\n this.config.onAuthTokenChange?.(this._authToken);\n\n const result = await wallet.signAndSendTransactions({\n transactions: [transaction],\n });\n return result[0];\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","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 { 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\nexport function useDubsTheme(): DubsTheme {\n const scheme = useColorScheme();\n return scheme === 'light' ? light : dark;\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, { 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 { 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\nfunction generateSeed(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction getAvatarUrl(style: string, seed: string, size = 256): string {\n return `https://api.dicebear.com/9.x/${style}/png?seed=${seed}&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 } = useDubs();\n const auth = useAuth();\n const [phase, setPhase] = useState<'init' | 'active'>('init');\n const [registrationPhase, setRegistrationPhase] = 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) { 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 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 return <AuthContext.Provider value={auth}>{children}</AuthContext.Provider>;\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 [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);\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 <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, 80) }} style={s.styleThumb} />\n </TouchableOpacity>\n ))}\n </ScrollView>\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// ── 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 } = 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 );\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 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 explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: CreateGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n 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 } 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 * Returns the transaction signature.\n */\nexport async function signAndSendBase64Transaction(\n base64Tx: string,\n wallet: WalletAdapter,\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 if (wallet.signAndSendTransaction) {\n return wallet.signAndSendTransaction(transaction);\n }\n\n throw new Error('Wallet does not support signAndSendTransaction');\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 } = 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 );\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 await client.confirmGame(confirmParams);\n console.log('[useJoinGame] Step 3 done. Backend confirmed.');\n\n const explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: JoinGameMutationResult = {\n gameId: params.gameId,\n gameAddress: joinResult.gameAddress,\n signature,\n 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 } = 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): 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 );\n console.log('[useClaim] Step 2 done. Signature:', signature);\n\n // Claims don't need backend confirmation — the on-chain tx is the claim\n const explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: ClaimMutationResult = {\n gameId: params.gameId,\n signature,\n explorerUrl,\n };\n\n setData(result);\n setStatus('success');\n console.log('[useClaim] Complete!');\n return result;\n } catch (err) {\n console.error('[useClaim] 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, 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 } = 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 );\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 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 explorerUrl = `https://solscan.io/tx/${signature}`;\n const result: CreateCustomGameMutationResult = {\n gameId: createResult.gameId,\n gameAddress: createResult.gameAddress,\n signature,\n 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, useCallback, useRef, useContext } from 'react';\nimport bs58 from 'bs58';\nimport { useDubs } from '../provider';\nimport { AuthContext } from '../auth-context';\nimport type { AuthStatus, DubsUser } from '../types';\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 /** 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 [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 between authenticate → register (single-sign flow)\n const pendingAuth = useRef<{\n walletAddress: string;\n nonce: string;\n signature: string;\n } | null>(null);\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 && !wallet.connectAndSignMessage) {\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 // 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 let signatureBytes: Uint8Array;\n\n if (wallet.connectAndSignMessage) {\n // MWA path: reauthorize + sign in a single transact() session.\n // This avoids the double-open problem with Phantom on regular Android\n // where two rapid transact() calls cause the second to be auto-declined.\n signatureBytes = await wallet.connectAndSignMessage(messageBytes);\n } else if (wallet.signMessage) {\n signatureBytes = await wallet.signMessage(messageBytes);\n } else {\n throw new Error('Wallet does not support signMessage');\n }\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 });\n\n if (result.needsRegistration) {\n // Stash credentials for register() — nonce is NOT consumed\n pendingAuth.current = { walletAddress, nonce, signature };\n setStatus('needsRegistration');\n return;\n }\n\n // Existing user — fully authenticated\n setUser(result.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, wallet]);\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 });\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(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(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 // 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 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 React, { useMemo } from 'react';\nimport { View, Text, Image, StyleSheet } from 'react-native';\nimport { useDubsTheme } from './theme';\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 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 { 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 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: 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 ? '#22D3EE' : 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}\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}: 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 const pot = effectiveAmount ? effectiveAmount * 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 = effectiveAmount !== null && effectiveAmount > 0 && !isMutating && mutation.status !== 'success';\n\n const handleCreate = useCallback(async () => {\n if (!effectiveAmount || !wallet.publicKey) return;\n\n try {\n await mutation.execute({\n playerWallet: wallet.publicKey.toBase58(),\n teamChoice: 'home',\n wagerAmount: effectiveAmount,\n title,\n maxPlayers,\n metadata,\n });\n } catch {\n // Error is already captured in mutation state\n }\n }, [effectiveAmount, 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 }]}>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 */}\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 {/* 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 }]}>Your buy-in</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>\n {effectiveAmount ? `${effectiveAmount} 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 }]}>Players</Text>\n <Text style={[styles.summaryValue, { color: t.text }]}>{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 }]}>Winner Takes</Text>\n <View style={styles.winnerCol}>\n <Text style={[styles.summaryValue, { color: t.success }]}>\n {effectiveAmount ? `${winnerTakes.toFixed(4)} SOL` : '—'}\n </Text>\n {effectiveAmount ? (\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}>{STATUS_LABELS.success}</Text>\n ) : (\n <Text style={[styles.ctaText, !canCreate && { opacity: 0.5 }]}>\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"],"mappings":"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","names":["import_react","import_web3","import_react_native","import_jsx_runtime","import_react","import_react_native","import_react","import_react","import_react","import_react","import_react","import_web3","error","import_react","error","import_react","error","import_react","error","import_react","import_react","bs58","user","import_jsx_runtime","React","import_jsx_runtime","config","import_react","import_react_native","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","truncateAddress","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","STATUS_LABELS","styles"]}
|