import { useCallback, useEffect, useState } from "react"; import type { Entry } from "@/lib/shared/types"; import { recurringEntriesCreate, recurringEntriesDelete, recurringEntriesList, recurringEntriesUpdate } from "@/lib/client/recurring-entries"; import type { ApiResult } from "@/lib/client/fetch-json"; type CreateRecurringEntryInput = { entryType: "SPENDING" | "INCOME"; amountDollars: number; occurredAt: string; necessity: "NECESSARY" | "BOTH" | "UNNECESSARY"; purchaseType: string; notes?: string; tags?: string[]; bucketId?: number | null; frequency?: "DAILY" | "WEEKLY" | "BIWEEKLY" | "MONTHLY" | "QUARTERLY" | "YEARLY" | null; intervalCount?: number; endCondition?: "NEVER" | "AFTER_COUNT" | "BY_DATE" | null; endCount?: number | null; endDate?: string | null; nextRunAt?: string | null; }; type UpdateRecurringEntryInput = CreateRecurringEntryInput & { id: number }; export default function useRecurringEntries(activeGroupId?: number | null) { const [entries, setEntries] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); function isError(result: ApiResult): result is { error: { code: string; message: string } } { return "error" in result; } const load = useCallback(async () => { if (!activeGroupId) { setError(""); setEntries([]); setLoading(false); return; } setLoading(true); setError(""); const result = await recurringEntriesList(); if (isError(result)) { setError(result.error.message || ""); setEntries([]); } else { setEntries(result.data.entries || []); } setLoading(false); }, [activeGroupId]); const createEntry = useCallback(async (input: CreateRecurringEntryInput) => { setError(""); const result = await recurringEntriesCreate(input); if (isError(result)) { setError(result.error.message || ""); return false; } await load(); return true; }, [load]); const updateEntry = useCallback(async (input: UpdateRecurringEntryInput) => { setError(""); const result = await recurringEntriesUpdate(input); if (isError(result)) { setError(result.error.message || ""); return false; } await load(); return true; }, [load]); const deleteEntry = useCallback(async (id: number | string) => { setError(""); const result = await recurringEntriesDelete({ id }); if (isError(result)) { setError(result.error.message || ""); return false; } await load(); return true; }, [load]); useEffect(() => { load(); }, [load]); return { entries, loading, error, createEntry, updateEntry, deleteEntry, reload: load }; }