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() } }