feat(instance): сервер установщика больше не «главный»

Понятие главного сервера убрано из поведения: сервер, создаваемый установщиком,
обычный (is_main = false), автовступления в него нет, а в настройках инстанса
он остаётся лишь справочно (main_guild_id → AdminGuildID в ответе API).
Клиент от него больше не зависит: новичок начинает с пустым списком серверов.
This commit is contained in:
2026-09-20 01:12:01 +03:00
parent 33dc1fec96
commit f26728113d
9 changed files with 458 additions and 23 deletions
+28 -1
View File
@@ -1,4 +1,4 @@
import { useEffect, useRef, useState } from 'react';
import { useEffect, useRef, useState, type MouseEvent as ReactMouseEvent } from 'react';
import { useTranslation } from 'react-i18next';
import { fileContentUrl } from '@/api/files';
@@ -34,6 +34,12 @@ interface MessageItemProps {
const actionButtonClass =
'rounded-[var(--radius-sm)] px-1.5 py-0.5 text-sm leading-none text-fg-muted transition-[color,background-color,transform] duration-[var(--duration-fast)] hover:bg-surface-3 hover:text-fg active:scale-95';
/**
* Селектор интерактива: двойной клик по ссылке, реакции или кнопке не должен
* ставить сообщение в ответ — этим элементам клик принадлежит целиком.
*/
const INTERACTIVE_SELECTOR = 'a, button, input, textarea, select, [role="menu"]';
/**
* Сообщение ленты: текст, вложения, реакции, ответы и действия.
*
@@ -140,10 +146,31 @@ export function MessageItem({
.catch((error: unknown) => setActionError(error));
};
/**
* Двойной клик по сообщению — быстрый ответ (то же, что пункт «Ответить»).
* Браузер сам ограничивает интервал двойного клика (~300–500 мс).
*/
const onDoubleClick = (event: ReactMouseEvent<HTMLElement>): void => {
if (!canSend || pending) {
return;
}
// Выделенный пользователем текст важнее: двойной клик — типичный способ
// выделить слово, поэтому ответ в этом случае не ставим.
if ((window.getSelection()?.toString() ?? '') !== '') {
return;
}
const target = event.target;
if (target instanceof Element && target.closest(INTERACTIVE_SELECTOR) !== null) {
return;
}
onReply(message);
};
return (
<article
data-message-id={message.id}
data-testid={`message-${message.id}`}
onDoubleClick={onDoubleClick}
className={`group/message relative flex flex-col gap-1 px-1 py-0.5 ${
pending ? 'opacity-70' : ''
} ${highlight ? 'gl-highlight rounded-[var(--radius-md)]' : ''}`}