Files
admin/src/hooks/data.ts

43 lines
1.0 KiB
TypeScript
Raw Normal View History

import {
type Dispatch,
type SetStateAction,
useCallback,
useState,
} from "react"
import { toast } from "sonner"
import type { ApiResponse } from "@/lib/api"
export function useStatus() {
return useState<"load" | "fail" | "done">("load")
}
export function useFetch<TArgs extends unknown[], TResult>(
fetchData: (...args: TArgs) => Promise<ApiResponse<TResult>>,
messages: {
done?: string
fail?: string
},
setStatus?: Dispatch<SetStateAction<"load" | "fail" | "done">>,
) {
return useCallback(
async (...args: TArgs) => {
try {
setStatus?.("load")
const resp = await fetchData(...args)
if (!resp.success) {
throw new Error(resp.message)
}
setStatus?.("done")
toast.success(messages.done || "获取数据成功")
} catch (e) {
setStatus?.("fail")
toast.error(messages.fail || "获取数据失败", {
description: (e as Error).message || "未知错误",
})
}
},
[fetchData, setStatus, messages],
)
}