init
Change-Id: I62d8e17fdc3103133b9ddaff22c27ddd9ea9f6ac
diff --git a/src/hooks/request.ts b/src/hooks/request.ts
new file mode 100644
index 0000000..8594ac2
--- /dev/null
+++ b/src/hooks/request.ts
@@ -0,0 +1,43 @@
+import { useState, useEffect, useCallback } from 'react'
+import { data } from 'react-router'
+
+type RequestFunction<T> = () => Promise<T>
+
+interface UseApiResult<T> {
+ data: T | null
+ loading: boolean
+ error: Error | null
+ refresh: () => void
+}
+
+export function useApi<T>(
+ requestFn: RequestFunction<T>,
+ immediate = true
+ ): UseApiResult<T> {
+ const [data, setData] = useState<T | null>(null)
+ const [loading, setLoading] = useState(false)
+ const [error, setError] = useState<Error | null>(null)
+
+ const execute = useCallback(async () => {
+ try {
+ setLoading(true)
+ const result = await requestFn()
+ setData(result)
+ setError(null)
+ return result // 返回请求结果
+ } catch (err) {
+ setError(err as Error)
+ throw err
+ } finally {
+ setLoading(false)
+ }
+ }, [requestFn])
+
+ useEffect(() => {
+ if (immediate) {
+ execute()
+ }
+ }, [execute, immediate])
+
+ return { data, loading, error, refresh: execute }
+ }
\ No newline at end of file