2024-03-15 12:34:41 +03:00
|
|
|
|
import clsx from 'clsx';
|
2025-02-17 14:40:18 +03:00
|
|
|
|
import { ZodError } from 'zod';
|
2023-12-13 14:32:57 +03:00
|
|
|
|
|
2025-03-12 11:55:43 +03:00
|
|
|
|
import { type AxiosError, isAxiosError } from '@/backend/api-transport';
|
2023-12-13 14:32:57 +03:00
|
|
|
|
import { isResponseHtml } from '@/utils/utils';
|
2023-07-25 20:27:29 +03:00
|
|
|
|
|
2025-03-12 12:04:50 +03:00
|
|
|
|
import { PrettyJson } from './view';
|
2025-02-10 01:32:55 +03:00
|
|
|
|
|
2025-02-19 22:33:09 +03:00
|
|
|
|
export type ErrorData = string | Error | AxiosError | ZodError;
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
2023-12-13 14:32:57 +03:00
|
|
|
|
interface InfoErrorProps {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
error: ErrorData;
|
2023-07-15 17:46:19 +03:00
|
|
|
|
}
|
|
|
|
|
|
2025-02-19 19:26:29 +03:00
|
|
|
|
export function DescribeError({ error }: { error: ErrorData }) {
|
2023-07-15 17:46:19 +03:00
|
|
|
|
if (!error) {
|
|
|
|
|
return <p>Ошибки отсутствуют</p>;
|
|
|
|
|
} else if (typeof error === 'string') {
|
|
|
|
|
return <p>{error}</p>;
|
2025-02-17 14:40:18 +03:00
|
|
|
|
} else if (error instanceof ZodError) {
|
|
|
|
|
return (
|
2025-02-19 19:26:29 +03:00
|
|
|
|
<div>
|
2025-02-17 14:40:18 +03:00
|
|
|
|
<p>Ошибка валидации данных</p>
|
|
|
|
|
<PrettyJson data={JSON.parse(error.toString()) as unknown} />;
|
|
|
|
|
</div>
|
|
|
|
|
);
|
2025-02-10 01:32:55 +03:00
|
|
|
|
} else if (!isAxiosError(error)) {
|
2025-01-29 14:52:07 +03:00
|
|
|
|
return (
|
2025-02-19 19:26:29 +03:00
|
|
|
|
<div>
|
2025-01-29 14:52:07 +03:00
|
|
|
|
<p>
|
|
|
|
|
<b>Error:</b> {error.name}
|
|
|
|
|
</p>
|
|
|
|
|
<p>
|
|
|
|
|
<b>Message:</b> {error.message}
|
|
|
|
|
</p>
|
2025-03-13 14:42:48 +03:00
|
|
|
|
{error.stack && <pre className='whitespace-pre-wrap p-2 overflow-x-auto break-words'>{error.stack}</pre>}
|
2025-01-29 14:52:07 +03:00
|
|
|
|
</div>
|
|
|
|
|
);
|
2023-07-23 15:23:01 +03:00
|
|
|
|
}
|
|
|
|
|
if (!error?.response) {
|
|
|
|
|
return <p>Нет ответа от сервера</p>;
|
|
|
|
|
}
|
|
|
|
|
if (error.response.status === 404) {
|
2023-07-15 17:46:19 +03:00
|
|
|
|
return (
|
2023-12-28 14:04:44 +03:00
|
|
|
|
<div>
|
|
|
|
|
<p>{'Обращение к несуществующему API'}</p>
|
|
|
|
|
<PrettyJson data={error} />
|
|
|
|
|
</div>
|
|
|
|
|
);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
}
|
2024-03-20 20:04:52 +03:00
|
|
|
|
if (error.response.status === 403 && error.message.includes('CSRF')) {
|
|
|
|
|
return (
|
|
|
|
|
<div>
|
|
|
|
|
<p>{'Соединение с сервером потеряно. Перезагрузите страницу'}</p>
|
|
|
|
|
<PrettyJson data={error} />
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
2023-07-25 20:27:29 +03:00
|
|
|
|
|
2024-05-26 14:54:02 +03:00
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
2023-12-13 14:32:57 +03:00
|
|
|
|
const isHtml = isResponseHtml(error.response);
|
2023-07-23 15:23:01 +03:00
|
|
|
|
return (
|
2023-12-17 20:19:28 +03:00
|
|
|
|
<div>
|
2023-07-23 15:23:01 +03:00
|
|
|
|
<p className='underline'>Ошибка</p>
|
|
|
|
|
<p>{error.message}</p>
|
2023-12-28 14:04:44 +03:00
|
|
|
|
{error.response.data && (
|
|
|
|
|
<>
|
|
|
|
|
<p className='mt-2 underline'>Описание</p>
|
|
|
|
|
{isHtml ? <div dangerouslySetInnerHTML={{ __html: error.response.data as TrustedHTML }} /> : null}
|
|
|
|
|
{!isHtml ? <PrettyJson data={error.response.data as object} /> : null}
|
|
|
|
|
</>
|
|
|
|
|
)}
|
2023-07-23 15:23:01 +03:00
|
|
|
|
</div>
|
|
|
|
|
);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
}
|
|
|
|
|
|
2025-02-10 01:32:55 +03:00
|
|
|
|
export function InfoError({ error }: InfoErrorProps) {
|
2023-07-15 17:46:19 +03:00
|
|
|
|
return (
|
2024-12-12 13:19:12 +03:00
|
|
|
|
<div
|
2024-03-15 12:34:41 +03:00
|
|
|
|
className={clsx(
|
2025-04-29 13:33:39 +03:00
|
|
|
|
'min-w-100', //
|
2024-03-15 12:34:41 +03:00
|
|
|
|
'px-3 py-2 flex flex-col',
|
2025-04-12 21:44:13 +03:00
|
|
|
|
'text-destructive text-sm font-semibold',
|
2024-03-15 12:34:41 +03:00
|
|
|
|
'select-text'
|
|
|
|
|
)}
|
|
|
|
|
>
|
2025-04-12 21:44:13 +03:00
|
|
|
|
<div className='font-normal text-foreground mb-6'>
|
2024-05-20 17:45:37 +03:00
|
|
|
|
<p>Пожалуйста сделайте скриншот и отправьте вместе с описанием ситуации на почту portal@acconcept.ru</p>
|
2024-03-15 12:34:41 +03:00
|
|
|
|
<br />
|
2024-05-20 17:45:37 +03:00
|
|
|
|
<p>Для продолжения работы перезагрузите страницу</p>
|
|
|
|
|
</div>
|
|
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
|
<DescribeError error={error} />
|
2024-12-12 13:19:12 +03:00
|
|
|
|
</div>
|
2023-12-28 14:04:44 +03:00
|
|
|
|
);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
}
|