import { useCallback, useEffect, useState } from "react"; import type { ApiResult } from "@/lib/client/fetch-json"; import { groupInvitesCreate, groupInvitesDelete, groupInvitesList, groupInvitesRevoke, groupInvitesRevive, type InviteLink, type JoinPolicy } from "@/lib/client/group-invites"; function isError(result: ApiResult): result is { error: { code: string; message: string } } { return "error" in result; } export default function useGroupInvites(activeGroupId?: number | null) { const [links, setLinks] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const load = useCallback(async () => { if (!activeGroupId) { setLinks([]); setError(""); return; } setLoading(true); setError(""); const result = await groupInvitesList(); if (isError(result)) setError(result.error.message || ""); else setLinks(result.data.links || []); setLoading(false); }, [activeGroupId]); const create = useCallback(async (input: { policy: JoinPolicy; singleUse: boolean; ttlDays: number }) => { const result = await groupInvitesCreate(input); if (isError(result)) { setError(result.error.message || ""); return null; } await load(); return result.data.link; }, [load]); const revoke = useCallback(async (linkId: number) => { const result = await groupInvitesRevoke({ linkId }); if (isError(result)) { setError(result.error.message || ""); return false; } await load(); return true; }, [load]); const revive = useCallback(async (linkId: number, ttlDays: number) => { const result = await groupInvitesRevive({ linkId, ttlDays }); if (isError(result)) { setError(result.error.message || ""); return false; } await load(); return true; }, [load]); const remove = useCallback(async (linkId: number) => { const result = await groupInvitesDelete({ linkId }); if (isError(result)) { setError(result.error.message || ""); return false; } await load(); return true; }, [load]); useEffect(() => { load(); }, [load]); return { links, loading, error, create, revoke, revive, remove, reload: load }; }