mirror of
https://github.com/CompassConnections/Compass.git
synced 2026-01-06 12:57:51 -05:00
37 lines
930 B
TypeScript
37 lines
930 B
TypeScript
import { useCallback, useState } from 'react'
|
|
|
|
// simplified version of react-query useMutation
|
|
export const useMutation = <T extends Array<unknown>, R>(
|
|
fn: (...props: T) => Promise<R>,
|
|
options?: {
|
|
onSuccess?: (data: R) => void
|
|
onError?: (error: unknown) => void
|
|
}
|
|
) => {
|
|
const { onSuccess, onError } = options ?? {}
|
|
const [isLoading, setLoading] = useState(false)
|
|
const [error, setError] = useState<unknown | null>(null)
|
|
const [data, setData] = useState<R | null>(null)
|
|
|
|
const mutate = useCallback(
|
|
async (...props: T) => {
|
|
setLoading(true)
|
|
setError(null)
|
|
try {
|
|
const data = await fn(...props)
|
|
setData(data)
|
|
onSuccess?.(data)
|
|
return data
|
|
} catch (error) {
|
|
setError(error)
|
|
onError?.(error)
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
},
|
|
[fn, onError, onSuccess]
|
|
)
|
|
|
|
return { mutate, data, isLoading, error }
|
|
}
|