expo-duooomi-app/hooks/core/use-loomart-api.ts

44 lines
1.0 KiB
TypeScript

import { useCallback, useState } from 'react'
import { type ApiError } from '@/lib/types'
export const useLoomartApi = <TData, TParams = void>(
apiFn: (params: TParams) => Promise<{ data?: TData; error?: ApiError }>,
options?: {
enabled?: boolean
initialLoad?: boolean
},
) => {
const [data, setData] = useState<TData | undefined>()
const [loading, setLoading] = useState(false)
const [error, setError] = useState<ApiError | null>(null)
const execute = useCallback(
async (params?: TParams) => {
try {
setLoading(true)
setError(null)
const { data, error } = await apiFn(params as TParams)
if (error) {
setError(error)
return { data: undefined, error }
}
setData(data)
return { data, error: null }
} catch (e) {
const err = e as ApiError
setError(err)
return { data: undefined, error: err }
} finally {
setLoading(false)
}
},
[apiFn],
)
return { data, loading, error, execute, refetch: execute }
}