| "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 }; |
| } |
|
|