import { useMemo, useRef } from 'react'; import { useQuery } from '@tanstack/react-query'; import api from '@/lib/api'; import type { Calendar, SharedCalendarMembership } from '@/types'; interface UseCalendarsOptions { pollingEnabled?: boolean; } export function useCalendars({ pollingEnabled = false }: UseCalendarsOptions = {}) { const ownedQuery = useQuery({ queryKey: ['calendars'], queryFn: async () => { const { data } = await api.get('/calendars'); return data; }, }); // AS-4: Gate shared-calendar polling on whether user participates in sharing. // Saves ~12 API calls/min for personal-only users. // Use a ref to latch "has sharing" once discovered, so polling doesn't flicker. const hasSharingRef = useRef(false); const ownsShared = (ownedQuery.data ?? []).some((c) => c.is_shared); if (ownsShared) hasSharingRef.current = true; const sharedQuery = useQuery({ queryKey: ['calendars', 'shared'], queryFn: async () => { const { data } = await api.get('/shared-calendars'); return data; }, refetchInterval: pollingEnabled && hasSharingRef.current ? 5_000 : false, staleTime: 3_000, }); // Also latch if user is a member of others' shared calendars if ((sharedQuery.data ?? []).length > 0) hasSharingRef.current = true; const allCalendarIds = useMemo(() => { const owned = (ownedQuery.data ?? []).map((c) => c.id); const shared = (sharedQuery.data ?? []).map((m) => m.calendar_id); return new Set([...owned, ...shared]); }, [ownedQuery.data, sharedQuery.data]); return { data: ownedQuery.data ?? [], sharedData: sharedQuery.data ?? [], allCalendarIds, isLoading: ownedQuery.isLoading, isLoadingShared: sharedQuery.isLoading, }; }