import { useState, useEffect, useCallback } from 'react'; import { usePlaybasis } from '../PlaybasisProvider'; import type { PointBalance, Currency } from '../types'; interface UsePointsReturn { balances: PointBalance[]; xp: number; qwikCoins: number; loading: boolean; error: Error | null; refresh: () => Promise; earn: (currency: Currency, amount: number, reason?: string) => Promise; } export function usePoints(): UsePointsReturn { const { client, playerId } = usePlaybasis(); const [balances, setBalances] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const fetchBalances = useCallback(async () => { if (!playerId) { setBalances([]); setLoading(false); return; } setLoading(true); setError(null); try { const playerBalances = await client.getBalances(playerId); setBalances(playerBalances); } catch (err) { setError(err instanceof Error ? err : new Error('Failed to fetch balances')); } finally { setLoading(false); } }, [client, playerId]); useEffect(() => { fetchBalances(); }, [fetchBalances]); const earn = useCallback( async (currency: Currency, amount: number, reason?: string): Promise => { if (!playerId) return null; try { const balance = await client.earnPoints({ playerId, currency, amount, reason, }); // Update local state setBalances((prev) => { const idx = prev.findIndex((b) => b.currency === currency); if (idx >= 0) { const updated = [...prev]; updated[idx] = balance; return updated; } return [...prev, balance]; }); return balance; } catch (err) { setError(err instanceof Error ? err : new Error('Failed to earn points')); return null; } }, [client, playerId], ); // Helper getters for common currencies const xp = balances.find((b) => b.currency === 'xp')?.balance ?? 0; const qwikCoins = balances.find((b) => b.currency === 'coins')?.balance ?? 0; return { balances, xp, qwikCoins, loading, error, refresh: fetchBalances, earn, }; } export default usePoints;