import { useState, useCallback } from 'react'; import { useDubs } from '../provider'; import { useAuth } from './useAuth'; import { signAndSendBase64Transaction } from '../utils/transaction'; import type { ArcadeEntry, MutationStatus } from '../types'; export interface EnterArcadePoolMutationResult { poolId: number; signature: string; entry: ArcadeEntry; } export function useEnterArcadePool() { const { client, wallet, connection } = useDubs(); const { user } = useAuth(); const [status, setStatus] = useState('idle'); const [error, setError] = useState(null); const [data, setData] = useState(null); const reset = useCallback(() => { setStatus('idle'); setError(null); setData(null); }, []); const execute = useCallback(async (poolId: number): Promise => { if (!wallet.publicKey) throw new Error('Wallet not connected'); const walletAddress = wallet.publicKey.toBase58(); setStatus('building'); setError(null); setData(null); try { // 1. Build unsigned transaction console.log('[useEnterArcadePool] Step 1: Building transaction...', { poolId, walletAddress }); const buildResult = await client.buildArcadeEntry(poolId, walletAddress); console.log('[useEnterArcadePool] Step 1 done:', { poolId: buildResult.poolId, amount: buildResult.amount }); // 2. Sign and send transaction setStatus('signing'); console.log('[useEnterArcadePool] Step 2: Signing and sending...'); const signature = await signAndSendBase64Transaction( buildResult.transaction, wallet, connection, ); console.log('[useEnterArcadePool] Step 2 done. Signature:', signature); // 3. Confirm entry with backend (pass gameId/gameAddress for on-chain tracking) setStatus('confirming'); console.log('[useEnterArcadePool] Step 3: Confirming with backend...'); const entry = await client.enterArcadePool(poolId, { walletAddress, txSignature: signature, gameId: buildResult.gameId, gameAddress: buildResult.gameAddress, }); console.log('[useEnterArcadePool] Step 3 done. Entry recorded.'); const result: EnterArcadePoolMutationResult = { poolId, signature, entry, }; setData(result); setStatus('success'); console.log('[useEnterArcadePool] Complete!'); return result; } catch (err) { console.error('[useEnterArcadePool] FAILED at status:', status, err); const e = err instanceof Error ? err : new Error(String(err)); setError(e); setStatus('error'); throw e; } }, [client, wallet, connection]); return { execute, status, error, data, reset }; }