import { useState, useCallback } from 'react'; import { useDubs } from '../provider'; import { signAndSendBase64Transaction } from '../utils/transaction'; import type { CreateCustomGameParams, MutationStatus } from '../types'; export interface CreateCustomGameMutationResult { gameId: string; gameAddress: string; signature: string; explorerUrl: string; buyIn: number; } export function useCreateCustomGame() { const { client, wallet, connection } = useDubs(); 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 (params: CreateCustomGameParams): Promise => { setStatus('building'); setError(null); setData(null); try { // 1. Build unsigned transaction console.log('[useCreateCustomGame] Step 1: Building transaction...'); const createResult = await client.createCustomGame(params); console.log('[useCreateCustomGame] Step 1 done:', { gameId: createResult.gameId, gameAddress: createResult.gameAddress }); // 2. Sign and send transaction setStatus('signing'); console.log('[useCreateCustomGame] Step 2: Signing and sending...'); const signature = await signAndSendBase64Transaction( createResult.transaction, wallet, connection, ); console.log('[useCreateCustomGame] Step 2 done. Signature:', signature); // 3. Confirm with backend setStatus('confirming'); console.log('[useCreateCustomGame] Step 3: Confirming with backend...'); const confirmResult = await client.confirmCustomGame({ gameId: createResult.gameId, playerWallet: params.playerWallet, signature, teamChoice: params.teamChoice, wagerAmount: params.wagerAmount, role: 'creator', gameAddress: createResult.gameAddress, }); console.log('[useCreateCustomGame] Step 3 done.'); const result: CreateCustomGameMutationResult = { gameId: createResult.gameId, gameAddress: createResult.gameAddress, signature, explorerUrl: confirmResult.explorerUrl, buyIn: params.wagerAmount, }; setData(result); setStatus('success'); console.log('[useCreateCustomGame] Complete!'); return result; } catch (err) { console.error('[useCreateCustomGame] FAILED:', err); const error = err instanceof Error ? err : new Error(String(err)); setError(error); setStatus('error'); throw error; } }, [client, wallet]); return { execute, status, error, data, reset }; }