2026-01-06 14:57:55 +08:00
|
|
|
import {
|
|
|
|
|
type Dispatch,
|
|
|
|
|
type SetStateAction,
|
|
|
|
|
useCallback,
|
|
|
|
|
useState,
|
|
|
|
|
} from "react"
|
|
|
|
|
import { toast } from "sonner"
|
|
|
|
|
import type { ApiResponse } from "@/lib/api"
|
2025-12-29 18:01:16 +08:00
|
|
|
|
|
|
|
|
export function useStatus() {
|
|
|
|
|
return useState<"load" | "fail" | "done">("load")
|
|
|
|
|
}
|
2026-01-06 14:57:55 +08:00
|
|
|
|
|
|
|
|
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],
|
|
|
|
|
)
|
|
|
|
|
}
|