import { useCallback, useEffect, useState } from "react"; import { fetchTimezone } from "../api/setup"; import { handleFetchError, createStringErrorAdapter } from "../utils/fetchError"; export interface UseTimezoneDataResult { timezone: string; loading: boolean; error: string | null; refresh: () => Promise; } export function useTimezoneData(): UseTimezoneDataResult { const [timezone, setTimezone] = useState("UTC"); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const load = useCallback(async (signal?: AbortSignal): Promise => { setLoading(true); setError(null); try { const resp = await fetchTimezone(signal); if (signal?.aborted) return; setTimezone(resp.timezone); } catch (err: unknown) { if (signal?.aborted) return; handleFetchError(err, createStringErrorAdapter(setError), "Failed to fetch timezone"); setTimezone("UTC"); } finally { if (!signal?.aborted) { setLoading(false); } } }, []); useEffect(() => { const controller = new AbortController(); void load(controller.signal); return (): void => { controller.abort(); }; }, [load]); return { timezone, loading, error, refresh: load, }; }