import { useState, useCallback } from 'react'; import { useDubs } from '../provider'; import { signAndSendBase64Transaction } from '../utils/transaction'; import type { BuildClaimParams, MutationStatus } from '../types'; export interface ClaimMutationResult { gameId: string; signature: string; explorerUrl: string; } export function useClaim() { 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: BuildClaimParams & { amountClaimed?: number }): Promise => { setStatus('building'); setError(null); setData(null); try { // 1. Build unsigned claim transaction console.log('[useClaim] Step 1: Building claim transaction...'); const claimResult = await client.buildClaimTransaction(params); console.log('[useClaim] Step 1 done.'); // 2. Sign and send transaction setStatus('signing'); console.log('[useClaim] Step 2: Signing and sending...'); const signature = await signAndSendBase64Transaction( claimResult.transaction, wallet, connection, ); console.log('[useClaim] Step 2 done. Signature:', signature); // 3. Confirm claim with backend (records signature + amount in DB) setStatus('confirming'); console.log('[useClaim] Step 3: Confirming claim...'); const confirmResult = await client.confirmClaim(params.gameId, { playerWallet: params.playerWallet, signature, amountClaimed: params.amountClaimed, }); console.log('[useClaim] Step 3 done.'); const result: ClaimMutationResult = { gameId: params.gameId, signature, explorerUrl: confirmResult.explorerUrl, }; setData(result); setStatus('success'); console.log('[useClaim] Complete!'); return result; } catch (err: any) { console.error('[useClaim] ===== CLAIM ERROR DUMP ====='); console.error('[useClaim] typeof:', typeof err); console.error('[useClaim] value:', err); console.error('[useClaim] message:', err?.message); console.error('[useClaim] name:', err?.name); console.error('[useClaim] code:', err?.code); console.error('[useClaim] cause:', err?.cause); console.error('[useClaim] stack:', err?.stack); console.error('[useClaim] JSON:', (() => { try { return JSON.stringify(err, Object.getOwnPropertyNames(err ?? {})); } catch { return 'unstringifiable'; } })()); console.error('[useClaim] ===== END DUMP ====='); const error = err instanceof Error ? err : new Error(String(err)); setError(error); setStatus('error'); throw error; } }, [client, wallet]); return { execute, status, error, data, reset }; }