over / src /components /use-api.tsx
luguog's picture
fix(microsoft): use configurable Azure AD client ID for device-code flow
3f13033 verified
Raw
History Blame Contribute Delete
1.24 kB
"use client";
import { useCallback, useEffect, useState } from "react";
export function useApi<T = any>(url: string, deps: unknown[] = []) {
const [data, setData] = useState<T | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const refetch = useCallback(async () => {
setLoading(true);
setError(null);
try {
const res = await fetch(url, { cache: "no-store" });
const json = await res.json();
if (!res.ok) throw new Error(json.error || `HTTP ${res.status}`);
setData(json as T);
} catch (e) {
setError(e instanceof Error ? e.message : "Request failed");
} finally {
setLoading(false);
}
}, [url]);
const post = useCallback(
async (body?: any) => {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: body ? JSON.stringify(body) : undefined,
});
const json = await res.json();
if (!res.ok) throw new Error(json.error || `HTTP ${res.status}`);
return json;
},
[url],
);
useEffect(() => {
refetch();
}, [refetch, ...deps]);
return { data, loading, error, refetch, post };
}