type AsyncFunction = (...args: TArgs) => Promise; type ErrorFunction = (err: any) => void | Promise; type VoidFunction = () => void | Promise; type useClientTry = ( fn: AsyncFunction, onFail?: ErrorFunction, onFinish?: VoidFunction, ) => (...args: TArgs) => Promise; const defaultOnError: ErrorFunction = (error) => { addNotification({ group: "main", title: "An error occurred", text: error?.data?.description || error.message || error || "Unknown error", type: "error", }); }; export const useClientTry: useClientTry = (fn, onFail = defaultOnError, onFinish) => async (...args) => { startLoading(); try { return await fn(...args); } catch (err) { if (onFail) { await onFail(err); } else { console.error("[CLIENT TRY ERROR]", err); } } finally { if (onFinish) await onFinish(); stopLoading(); } };