frontPanel/src/utils/parse-error.ts

81 lines
2.9 KiB
TypeScript
Raw Normal View History

2024-05-15 12:37:42 +00:00
import { isAxiosError } from "axios";
2023-11-08 12:51:40 +00:00
import type { AxiosError } from "axios";
export type ServerError = {
statusCode: number;
error: string;
message: string;
};
const translateMessage: Record<string, string> = {
"user not found": "Пользователь не найден",
"invalid password": "Неправильный пароль",
2023-12-31 02:53:25 +00:00
"field <password> is empty": 'Поле "Пароль" не заполнено',
"field <login> is empty": 'Поле "Логин" не заполнено',
"field <email> is empty": 'Поле "E-mail" не заполнено',
"field <phoneNumber> is empty": 'Поле "Номер телефона" не заполнено',
2023-11-08 12:51:40 +00:00
"user with this email or login is exist": "Пользователь уже существует",
"user with this login is exist": "Пользователь с таким логином уже существует",
2024-04-09 10:41:32 +00:00
"promocode already activated": "Промокод уже активирован",
"promocode not found": "Промокод не найден",
"promo code is expired": "Промокод истек",
2024-04-10 13:55:08 +00:00
"promocode exhausted": "Количество активаций исчерпано",
2023-11-08 12:51:40 +00:00
};
export const parseAxiosError = (nativeError: unknown): [string, number?] => {
const error = nativeError as AxiosError;
console.error(error);
2024-05-15 12:37:42 +00:00
if (process.env.NODE_ENV !== "production") console.error(error);
if (error.message === "Failed to fetch") return ["Ошибка сети"];
if (error.response?.data) {
2023-11-08 12:51:40 +00:00
const serverError = error.response.data as ServerError;
let SEMessage;
2024-05-15 13:51:41 +00:00
if (error.response.statusText) {
return [error.response.statusText];
}
if ("statusCode" in serverError) {
SEMessage = serverError?.message.toLowerCase() || "";
}
if ("error" in serverError && !("statusCode" in (error.response.data as ServerError))) {
2024-05-15 13:51:41 +00:00
SEMessage = serverError.error.toLowerCase() || "";
}
2024-04-09 10:41:32 +00:00
const translatedMessage = translateMessage[SEMessage || ""]?.toLowerCase();
if (translatedMessage !== undefined) SEMessage = translatedMessage;
return [SEMessage || "", serverError.statusCode];
2023-11-08 12:51:40 +00:00
}
2024-05-15 12:37:42 +00:00
if (isAxiosError(error)) {
switch (error.code) {
case "ERR_NETWORK":
return ["Ошибка сети"];
case "ERR_CANCELED":
return ["Неизвестная ошибка сервера."];
case "ERR_BAD_REQUEST":
return ["Слишком много запросов"];
}
}
2023-11-08 12:51:40 +00:00
switch (error.status) {
case 404:
return ["Не найдено.", error.status];
case 403:
return ["Доступ ограничен.", error.status];
case 401:
return ["Ошибка авторизации.", error.status];
case 500:
return ["Внутренняя ошибка сервера.", error.status];
case 503:
return ["Сервис недоступен.", error.status];
default:
return ["Неизвестная ошибка сервера."];
}
};