feat(web): вход с 2FA сразу, панель пользователя, модальные настройки, markdown
По правкам пользователя: - вход: поле «Код 2FA или резервный код» видно сразу, принимает 14-символьные резервные коды (раньше влезало 6 цифр), пустое значение не ломает вход; - нижняя панель: одна подложка, слева аватар и имя с мини-профилем и выбором статуса, справа микрофон, камера, наушники (переключатели, стрелка с выбором устройства и громкости, переход в «Аудио-видео») и шестерёнка; - кнопка «Покинуть сервер» из сайдбара убрана (выход — в «Опасной зоне»); - настройки открываются модальным окном со списком пунктов; «Профиль» имеет вкладки «Основной» и «Сервер» (список серверов, ник и «Применить ко всем серверам»), аватар загружается и удаляется, есть часовой пояс (МСК по умолчанию); - markdown: добавлены ==выделение==, __жирный__, ***оба***, ||спойлер||, #канал; - двойной клик по сообщению ставит ответ (не срабатывает на ссылках, кнопках и при выделенном тексте); - 219 тестов Vitest (было 176), check/lint/test/build зелёные.
This commit is contained in:
@@ -517,6 +517,61 @@ describe('чат комнаты: реакции и ответы', () => {
|
||||
expect(screen.queryByText('Ответ Аля')).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
it('двойной клик по сообщению ставит его в ответ', async () => {
|
||||
await boot({
|
||||
messages: [message({ id: 'm-1', content: 'оригинал', author_id: 'user-2' })],
|
||||
});
|
||||
|
||||
const article = await screen.findByTestId('message-m-1');
|
||||
fireEvent.doubleClick(article);
|
||||
|
||||
// Та же плашка, что и у пункта «Ответить» в меню.
|
||||
expect(await screen.findByText('Ответ Bob')).toBeVisible();
|
||||
});
|
||||
|
||||
it('двойной клик по ссылке не ставит ответ', async () => {
|
||||
await boot({
|
||||
messages: [
|
||||
message({ id: 'm-1', content: 'смотри https://example.com/page', author_id: 'user-2' }),
|
||||
],
|
||||
});
|
||||
|
||||
const article = await screen.findByTestId('message-m-1');
|
||||
fireEvent.doubleClick(within(article).getByRole('link'));
|
||||
|
||||
expect(screen.queryByText('Ответ Bob')).toBeNull();
|
||||
});
|
||||
|
||||
it('двойной клик по выделенному тексту не ставит ответ', async () => {
|
||||
await boot({
|
||||
messages: [message({ id: 'm-1', content: 'выделенный текст', author_id: 'user-2' })],
|
||||
});
|
||||
|
||||
const article = await screen.findByTestId('message-m-1');
|
||||
// Пользователь выделил текст — двойной клик принадлежит выделению.
|
||||
const range = document.createRange();
|
||||
range.selectNodeContents(article);
|
||||
const selection = window.getSelection();
|
||||
selection?.removeAllRanges();
|
||||
selection?.addRange(range);
|
||||
|
||||
fireEvent.doubleClick(article);
|
||||
|
||||
expect(screen.queryByText('Ответ Bob')).toBeNull();
|
||||
selection?.removeAllRanges();
|
||||
});
|
||||
|
||||
it('двойной клик по кнопке реакции не ставит ответ', async () => {
|
||||
await boot({
|
||||
messages: [message({ id: 'm-1', content: 'оригинал', author_id: 'user-2' })],
|
||||
});
|
||||
|
||||
const article = await screen.findByTestId('message-m-1');
|
||||
fireEvent.doubleClick(within(article).getByRole('button', { name: 'Поставить реакцию 🔥' }));
|
||||
|
||||
expect(screen.queryByText('Ответ Bob')).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('чат комнаты: права и действия', () => {
|
||||
|
||||
Reference in New Issue
Block a user