You've already forked AstralRinth
forked from didirus/AstralRinth
* feat: migrate frontend notifications to dependency injection based notificaton manager * fix: lint * fix: issues * fix: compile error + notif binding issue * refactor: move org context to new DI setup * feat: migrate app notifications to DI + frontend styling * fix: sidebar issues * fix: dont use delete in computed * fix: import and prop issue * refactor: move handleError to main notification manager class * fix: lint & build * fix: merge issues * fix: lint issues * fix: lint issues --------- Signed-off-by: IMB11 <hendersoncal117@gmail.com> Signed-off-by: Cal H. <hendersoncal117@gmail.com>
39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import { injectNotificationManager } from "@modrinth/ui";
|
|
|
|
type AsyncFunction<TArgs extends any[], TResult> = (...args: TArgs) => Promise<TResult>;
|
|
type ErrorFunction = (err: any) => void | Promise<void>;
|
|
type VoidFunction = () => void | Promise<void>;
|
|
|
|
type useClientTry = <TArgs extends any[], TResult>(
|
|
fn: AsyncFunction<TArgs, TResult>,
|
|
onFail?: ErrorFunction,
|
|
onFinish?: VoidFunction,
|
|
) => (...args: TArgs) => Promise<TResult | undefined>;
|
|
|
|
const defaultOnError: ErrorFunction = (error) => {
|
|
const { addNotification } = injectNotificationManager();
|
|
addNotification({
|
|
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();
|
|
}
|
|
};
|