76 lines
2.4 KiB
JavaScript
76 lines
2.4 KiB
JavaScript
const MIN_LEN = 1;
|
|
const MAX_LEN = 32;
|
|
const ALLOWED_CHARS_RE = /^[A-Za-z0-9_-]+$/;
|
|
|
|
export function normalizeChannelDisplayName(value) {
|
|
if (value == null) return '';
|
|
return String(value).trim();
|
|
}
|
|
|
|
export function normalizeChannelDescription(value) {
|
|
if (value == null) return '';
|
|
return String(value).trim().replace(/\s+/g, ' ');
|
|
}
|
|
|
|
export function toCanonicalChannelSlug(value) {
|
|
const normalized = normalizeChannelDisplayName(value);
|
|
if (!normalized) return '';
|
|
|
|
const lowered = normalized.toLowerCase();
|
|
if (!ALLOWED_CHARS_RE.test(lowered)) return '';
|
|
return lowered;
|
|
}
|
|
|
|
export function validateChannelDisplayName(value) {
|
|
const normalized = normalizeChannelDisplayName(value);
|
|
if (!normalized) {
|
|
return { ok: false, code: 'blank', normalized: '', slug: '' };
|
|
}
|
|
|
|
const length = Array.from(normalized).length;
|
|
if (length < MIN_LEN) {
|
|
return { ok: false, code: 'too_short', normalized, slug: '' };
|
|
}
|
|
if (length > MAX_LEN) {
|
|
return { ok: false, code: 'too_long', normalized, slug: '' };
|
|
}
|
|
if (!ALLOWED_CHARS_RE.test(normalized)) {
|
|
return { ok: false, code: 'bad_chars', normalized, slug: '' };
|
|
}
|
|
if (normalized === '0') {
|
|
return { ok: false, code: 'reserved', normalized, slug: '' };
|
|
}
|
|
|
|
const slug = toCanonicalChannelSlug(normalized);
|
|
if (!slug) {
|
|
return { ok: false, code: 'bad_chars', normalized, slug: '' };
|
|
}
|
|
|
|
return { ok: true, code: '', normalized, slug };
|
|
}
|
|
|
|
export function channelNameErrorText(code) {
|
|
switch (String(code || '').trim()) {
|
|
case 'blank':
|
|
return 'Введите название канала.';
|
|
case 'too_short':
|
|
return 'Название слишком короткое: минимум 1 символ.';
|
|
case 'too_long':
|
|
return 'Название слишком длинное: максимум 32 символа.';
|
|
case 'bad_chars':
|
|
return 'Разрешены только латиница, цифры, _ и -.';
|
|
case 'reserved':
|
|
return 'Название "0" зарезервировано.';
|
|
default:
|
|
return 'Некорректное название канала.';
|
|
}
|
|
}
|
|
|
|
export function channelDescriptionErrorText(value) {
|
|
const normalized = normalizeChannelDescription(value);
|
|
if (new TextEncoder().encode(normalized).length > 200) {
|
|
return 'Описание слишком длинное: максимум 200 байт UTF-8.';
|
|
}
|
|
return '';
|
|
}
|