import type { NitroFetchRequest, NitroFetchOptions, TypedInternalResponse, ExtractedRouteMethod, } from 'nitropack/types'; import { FetchError } from 'ofetch'; type RevertFn< R extends NitroFetchRequest, T = unknown, O extends NitroFetchOptions = NitroFetchOptions, > = ( success: boolean, data: | TypedInternalResponse< R, T, NitroFetchOptions extends O ? 'get' : ExtractedRouteMethod > | undefined ) => Promise; type SubmitOpts< R extends NitroFetchRequest, T = unknown, O extends NitroFetchOptions = NitroFetchOptions, > = { revert: RevertFn; successMsg?: string; noSuccessToast?: boolean; }; export function useSubmit< R extends NitroFetchRequest, O extends NitroFetchOptions & { body?: never }, T = unknown, >(url: R, options: O, opts: SubmitOpts) { const toast = useToast(); return async (data: unknown) => { try { const res = await $fetch(url, { ...options, body: data, }); if (!opts.noSuccessToast) { toast.showToast({ type: 'success', message: opts.successMsg, }); } // eslint-disable-next-line @typescript-eslint/no-explicit-any await opts.revert(true, res as any); } catch (e) { if (e instanceof FetchError) { toast.showToast({ type: 'error', message: e.data.message, }); } else if (e instanceof Error) { toast.showToast({ type: 'error', message: e.message, }); } else { console.error(e); } await opts.revert(false, undefined); } }; }