import type { AbstractWebNotificationManager } from '@modrinth/ui' import { injectNotificationManager } from '@modrinth/ui' type AsyncFunction = (...args: TArgs) => Promise type ErrorFunction = ( err: any, addNotification: typeof AbstractWebNotificationManager.prototype.addNotification, ) => void | Promise type VoidFunction = () => void | Promise type useClientTry = ( fn: AsyncFunction, onFail?: ErrorFunction, onFinish?: VoidFunction, ) => (...args: TArgs) => Promise const defaultOnError: ErrorFunction = (error, addNotification) => { addNotification({ title: 'An error occurred', text: error?.data?.description || error.message || error || 'Unknown error', type: 'error', }) } export const useClientTry: useClientTry = (fn, onFail = defaultOnError, onFinish) => { const { addNotification } = injectNotificationManager() return async (...args) => { startLoading() try { return await fn(...args) } catch (err) { if (onFail) { await onFail(err, addNotification) } else { console.error('[CLIENT TRY ERROR]', err) } } finally { if (onFinish) await onFinish() stopLoading() } } }