|
|
|
@ -1,49 +1,24 @@ |
|
|
|
import type { |
|
|
|
NitroFetchRequest, |
|
|
|
NitroFetchOptions, |
|
|
|
TypedInternalResponse, |
|
|
|
ExtractedRouteMethod, |
|
|
|
} from 'nitropack/types'; |
|
|
|
import { FetchError } from 'ofetch'; |
|
|
|
|
|
|
|
type RevertFn< |
|
|
|
R extends NitroFetchRequest, |
|
|
|
T = unknown, |
|
|
|
O extends NitroFetchOptions<R> = NitroFetchOptions<R>, |
|
|
|
> = ( |
|
|
|
success: boolean, |
|
|
|
data: |
|
|
|
| TypedInternalResponse< |
|
|
|
R, |
|
|
|
T, |
|
|
|
NitroFetchOptions<R> extends O ? 'get' : ExtractedRouteMethod<R, O> |
|
|
|
> |
|
|
|
| undefined |
|
|
|
) => Promise<void>; |
|
|
|
type RevertFn<T> = (success: boolean, data: T | undefined) => Promise<void>; |
|
|
|
|
|
|
|
type SubmitOpts< |
|
|
|
R extends NitroFetchRequest, |
|
|
|
T = unknown, |
|
|
|
O extends NitroFetchOptions<R> = NitroFetchOptions<R>, |
|
|
|
> = { |
|
|
|
revert: RevertFn<R, T, O>; |
|
|
|
type SubmitOpts<T> = { |
|
|
|
revert: RevertFn<T>; |
|
|
|
successMsg?: string; |
|
|
|
noSuccessToast?: boolean; |
|
|
|
}; |
|
|
|
|
|
|
|
export function useSubmit< |
|
|
|
R extends NitroFetchRequest, |
|
|
|
O extends NitroFetchOptions<R> & { body?: never }, |
|
|
|
T = unknown, |
|
|
|
>(url: R, options: O, opts: SubmitOpts<R, T, O>) { |
|
|
|
type Body = Record<string, unknown> | null | undefined; |
|
|
|
|
|
|
|
export function useSubmit<T>( |
|
|
|
fetcher: (data: Body) => Promise<T>, |
|
|
|
opts: SubmitOpts<T> |
|
|
|
) { |
|
|
|
const toast = useToast(); |
|
|
|
|
|
|
|
return async (data: unknown) => { |
|
|
|
return async (data: Body) => { |
|
|
|
try { |
|
|
|
const res = await $fetch(url, { |
|
|
|
...options, |
|
|
|
body: data, |
|
|
|
}); |
|
|
|
const res = await fetcher(data); |
|
|
|
|
|
|
|
if (!opts.noSuccessToast) { |
|
|
|
toast.showToast({ |
|
|
|
|