SHA256
Каналы: типы 0/1/100/200, CreateChannel v3, state для chat200, новые API и деплой на prod
This commit is contained in:
@@ -11,6 +11,9 @@ import {
|
||||
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 {
|
||||
@@ -45,7 +48,15 @@ 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>
|
||||
<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>
|
||||
|
||||
<label for="channel-name">Название канала</label>
|
||||
<input id="channel-name" class="input" maxlength="32" placeholder="Например: my_channel-1" required />
|
||||
@@ -64,6 +75,8 @@ 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');
|
||||
@@ -79,10 +92,27 @@ 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);
|
||||
@@ -124,11 +154,22 @@ 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,
|
||||
channelTypeVersion: 1,
|
||||
});
|
||||
|
||||
persistCreateSuccessFlash(`Канал "${normalizeChannelDisplayName(check.name)}" создан.`);
|
||||
@@ -141,9 +182,11 @@ export function render({ navigate }) {
|
||||
});
|
||||
|
||||
cancelEl.addEventListener('click', () => navigate('channels-list'));
|
||||
typeEl.addEventListener('change', updateTypeHint);
|
||||
|
||||
screen.append(form);
|
||||
nameEl.focus();
|
||||
updateTypeHint();
|
||||
updateValidation();
|
||||
return screen;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user