blob: 8594ac2e27e61607c0be4c9ac0565415c4efd046 [file] [log] [blame] [edit]
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 }
}