Files
SHiNE-server/shine-UI/js/services/ui-error-texts.js
T

114 lines
4.6 KiB
JavaScript

function extractCode(message = '') {
const match = String(message || '').match(/\(([A-Z0-9_]+)\)\s*$/i);
return match ? String(match[1]).toUpperCase() : '';
}
function normalizeText(error) {
return String(error?.message || '').trim().toLowerCase();
}
export function toUserMessage(error, fallback = 'Действие не выполнено. Попробуйте еще раз.') {
const raw = String(error?.message || '').trim();
const text = normalizeText(error);
const code = String(error?.code || extractCode(raw) || '').toUpperCase();
if (
text.includes('webcrypto') ||
text.includes('crypto.subtle') ||
text.includes("reading 'digest'") ||
text.includes('not supported on insecure origins')
) {
return 'Криптография браузера недоступна. Откройте приложение через HTTPS или localhost.';
}
if (
text.includes('mixed content') ||
text.includes('insecure websocket connection') ||
(text.includes('https') && text.includes('ws://'))
) {
return 'Подключение заблокировано: страница открыта по HTTPS, а сервер указан как ws://. Используйте wss://.';
}
if (
text.includes('не удалось подключиться') ||
text.includes('failed to connect websocket') ||
text.includes('websocket закрыто') ||
text.includes('соединение websocket закрыто')
) {
return 'Сервер недоступен. Проверьте, что backend запущен, и повторите попытку.';
}
if (text.includes('таймаут') || text.includes('timeout waiting')) {
return 'Сервер отвечает слишком долго. Повторите попытку через несколько секунд.';
}
if (
code === 'USER_NOT_FOUND' ||
text.includes('user not found') ||
text.includes('пользователь не найден')
) {
return 'Пользователь не найден. Проверьте логин.';
}
if (
code === 'BAD_CHANNEL_NAME' ||
text.includes('channel name must match') ||
text.includes('channelname contains unsupported') ||
text.includes('channelname length must be 3..32') ||
text.includes('channelname length must be 1..32') ||
text.includes('bad_channel_name')
) {
return 'Некорректное название канала. Разрешены кириллица, латиница, цифры, пробел, _ и - (1..32 символа).';
}
if (text.includes('channel name is required') || text.includes('введите имя канала')) {
return 'Введите имя канала.';
}
if (code === 'CHANNEL_NAME_ALREADY_EXISTS' || text.includes('channel_name_already_exists')) {
return 'Такое название уже занято. Попробуйте немного изменить его.';
}
if (
code === 'PREV_LINE_BLOCK_NOT_FOUND' ||
code === 'LINE_ERR_NO_PREV' ||
text.includes('prev_line_block_not_found') ||
text.includes('line_err_no_prev')
) {
return 'Базовый блок линии не найден. Обновите страницу и повторите действие.';
}
if (
code === 'BAD_PREV_LINE_HASH' ||
code === 'LINE_ERR_PREV_HASH_MISMATCH' ||
text.includes('bad_prev_line_hash') ||
text.includes('line_err_prev_hash_mismatch') ||
text.includes('prevlinehash')
) {
return 'Конфликт состояния канала. Обновите страницу и повторите действие.';
}
if (code === 'LINE_ERR_PARTIAL_FIELDS' || text.includes('line_err_partial_fields')) {
return 'Некорректные данные канала. Обновите страницу и повторите действие.';
}
if (code === 'NOT_AUTHENTICATED' || text.includes('session is not ready for signing')) {
return 'Сессия недействительна. Выполните вход заново.';
}
if (
code === 'SESSION_NOT_FOUND' ||
code === 'SESSION_KEY_NOT_ACTUAL' ||
code === 'SESSION_OF_ANOTHER_USER'
) {
return 'Сессия устарела. Войдите заново и повторите действие.';
}
if (code === 'UNSUPPORTED_KEY_ALGORITHM' || text.includes('unsupported key algorithm')) {
return 'Ключ устройства не поддерживается сервером. Очистите локальные ключи и войдите заново.';
}
if (!raw) return fallback;
return raw;
}