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