UI: каналы 1..32, публичный type=1 и актуальный prevLine перед записью

This commit is contained in:
AidarKC
2026-05-14 17:58:16 +03:00
parent 01b38952e5
commit ab31ccf6d8
6 changed files with 55 additions and 58 deletions
+3 -42
View File
@@ -12,8 +12,6 @@ export const pageMeta = { id: 'add-channel-view', title: 'Создать кан
const CREATE_CHANNEL_FLASH_KEY = 'shine-channels-create-success';
const CHANNEL_TYPE_PUBLIC = 1;
const CHANNEL_TYPE_PERSONAL = 100;
const CHANNEL_TYPE_GROUP = 200;
function persistCreateSuccessFlash(message) {
try {
@@ -48,15 +46,8 @@ export function render({ navigate }) {
form.innerHTML = `
<strong class="channel-head-title">Создание канала</strong>
<p class="channel-head-meta">Можно использовать только латиницу, цифры, _ и -.</p>
<p class="channel-head-meta">Длина названия: от 3 до 32 символов.</p>
<label for="channel-type">Тип канала</label>
<select id="channel-type" class="input">
<option value="${CHANNEL_TYPE_PUBLIC}">Публичный (1)</option>
<option value="${CHANNEL_TYPE_PERSONAL}">Персональный (100)</option>
<option value="${CHANNEL_TYPE_GROUP}">Групповой (200)</option>
</select>
<div id="channel-type-hint" class="meta-muted">Публичный канал видят все. Писать может только владелец.</div>
<p class="channel-head-meta">Длина названия: от 1 до 32 символов.</p>
<div class="meta-muted">Тип канала фиксирован: публичный (1).</div>
<label for="channel-name">Название канала</label>
<input id="channel-name" class="input" maxlength="32" placeholder="Например: my_channel-1" required />
@@ -75,8 +66,6 @@ export function render({ navigate }) {
`;
const nameEl = form.querySelector('#channel-name');
const typeEl = form.querySelector('#channel-type');
const typeHintEl = form.querySelector('#channel-type-hint');
const descriptionEl = form.querySelector('#channel-description');
const nameErrorEl = form.querySelector('#channel-name-error');
const descriptionErrorEl = form.querySelector('#channel-description-error');
@@ -92,27 +81,10 @@ export function render({ navigate }) {
submitEl.disabled = submitInFlight;
cancelEl.disabled = submitInFlight;
nameEl.disabled = submitInFlight;
typeEl.disabled = submitInFlight;
descriptionEl.disabled = submitInFlight;
submitEl.textContent = submitInFlight ? 'Создаём...' : 'Создать';
};
const updateTypeHint = () => {
const typeCode = Number(typeEl.value || CHANNEL_TYPE_PUBLIC);
if (typeCode === CHANNEL_TYPE_PERSONAL) {
typeHintEl.textContent = 'Для персонального канала название должно быть login собеседника.';
nameEl.placeholder = 'Например: aidar';
return;
}
if (typeCode === CHANNEL_TYPE_GROUP) {
typeHintEl.textContent = 'Для группового канала участников добавляют командами /.add и /.remove.';
nameEl.placeholder = 'Например: team_room';
return;
}
typeHintEl.textContent = 'Публичный канал видят все. Писать может только владелец.';
nameEl.placeholder = 'Например: my_channel-1';
};
const updateValidation = () => {
const nameCheck = validateChannelDisplayName(nameEl.value);
const descriptionCheck = validateDescription(descriptionEl.value);
@@ -154,21 +126,12 @@ export function render({ navigate }) {
errorEl.textContent = '';
try {
const channelType = Number(typeEl.value || CHANNEL_TYPE_PUBLIC);
if (channelType === CHANNEL_TYPE_PERSONAL) {
const targetLogin = normalizeChannelDisplayName(check.name);
const foundUser = await authService.getUser(targetLogin);
if (!foundUser?.exists) {
throw new Error('Логин для персонального канала не найден.');
}
}
await authService.addBlockCreateChannel({
login,
storagePwd,
channelName: normalizeChannelDisplayName(check.name),
channelDescription: normalizeChannelDescription(check.description),
channelType,
channelType: CHANNEL_TYPE_PUBLIC,
channelTypeVersion: 1,
});
@@ -182,11 +145,9 @@ export function render({ navigate }) {
});
cancelEl.addEventListener('click', () => navigate('channels-list'));
typeEl.addEventListener('change', updateTypeHint);
screen.append(form);
nameEl.focus();
updateTypeHint();
updateValidation();
return screen;
}