Failed to load group
+{error}
+ +- {formatAmount(group.contributionAmount)} tokens per cycle -
++ {formatAmount(group.contributionAmount)} tokens per cycle +
++ All contributions received — payout ready +
+ )}+ Updated {lastUpdated.toLocaleTimeString()} +
+ )} ); } diff --git a/src/hooks/useGroupPolling.ts b/src/hooks/useGroupPolling.ts new file mode 100644 index 0000000..7f1b1ff --- /dev/null +++ b/src/hooks/useGroupPolling.ts @@ -0,0 +1,92 @@ +"use client"; + +import { useState, useEffect, useCallback, useRef } from "react"; +import { sorosaveClient } from "@/lib/sorosave"; +import { GroupStatus } from "@sorosave/sdk"; + +const POLL_INTERVAL = 10_000; + +export interface GroupData { + id: number; + name: string; + admin: string; + token: string; + contributionAmount: bigint; + cycleLength: number; + maxMembers: number; + members: string[]; + payoutOrder: string[]; + currentRound: number; + totalRounds: number; + status: GroupStatus; + createdAt: number; + contributionsReceived: number; +} + +interface UseGroupPollingResult { + group: GroupData | null; + isLoading: boolean; + error: string | null; + lastUpdated: Date | null; + isPolling: boolean; + refresh: () => Promise