From c9cfb394d77c0c9b049eba7168f8a336b37e87f410aec27afde5d02d4c63dd31 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Fri, 10 Jul 2026 19:27:49 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=8B=20=D0=B2=20DM=20?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82=D1=8C=20UI?= =?UTF-8?q?=20=D1=87=D0=B0=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-10_1845_dm_shine_tags_and_safe_preview.md | 2 + .../Технические_вставки_DM_v1.md | 2 + VERSION.properties | 4 +- shine-UI/js/app.js | 3 + shine-UI/js/pages/chat-view.js | 114 +++++- .../js/pages/public-support-queue-view.js | 369 ++++++++++++++++++ shine-UI/js/router.js | 4 + shine-UI/js/services/call-service.js | 3 + shine-UI/js/services/dm-tech-blocks.js | 8 + shine-UI/styles/components.css | 32 +- 10 files changed, 526 insertions(+), 15 deletions(-) create mode 100644 shine-UI/js/pages/public-support-queue-view.js diff --git a/Dev_Docs/Pending_Features/2026-07-10_1845_dm_shine_tags_and_safe_preview.md b/Dev_Docs/Pending_Features/2026-07-10_1845_dm_shine_tags_and_safe_preview.md index d7716e8..98d897c 100644 --- a/Dev_Docs/Pending_Features/2026-07-10_1845_dm_shine_tags_and_safe_preview.md +++ b/Dev_Docs/Pending_Features/2026-07-10_1845_dm_shine_tags_and_safe_preview.md @@ -12,8 +12,10 @@ UI скрывает такие вставки из текста сообщени - Если пользователь отправляет обычный текст, начинающийся с `` показывается в чате как специальное call-сообщение, а не как сырой техтекст. +- При исходящем звонке короче `5` секунд call-summary не отправляется вообще. - В списке личных сообщений превью такого сообщения показывает человекочитаемый итог звонка. - DM с `Текст ответа` скрывает техблок и показывает только `Текст ответа`. +- В меню любого DM первым пунктом есть `Ответить`, и отправка из этого режима реально добавляет `` в начало plaintext. - Если reply-цель отсутствует, сообщение всё равно показывается как обычный текст ответа. - Текст вида `` или похожие HTML-теги не исполняются ни в чате, ни в списке личных сообщений, ни в списке каналов. diff --git a/Dev_Docs/Personal_Messages/Технические_вставки_DM_v1.md b/Dev_Docs/Personal_Messages/Технические_вставки_DM_v1.md index 1ba0fc6..ded7a5f 100644 --- a/Dev_Docs/Personal_Messages/Технические_вставки_DM_v1.md +++ b/Dev_Docs/Personal_Messages/Технические_вставки_DM_v1.md @@ -89,6 +89,7 @@ fromLogin|toLogin|timeMs|nonce - этот блок должен стоять в начале plaintext; - после него может идти обычный текст ответа; +- официальный UI формирует такой блок при отправке ответа через пункт `Ответить` в меню сообщения; - если клиент не находит сообщение, на которое ссылается `reply`, он просто не показывает reply-preview; - в таком случае само сообщение отображается как обычный текст без блока ``. @@ -123,6 +124,7 @@ fromLogin|toLogin|timeMs|nonce - call-блок в v1 должен содержать только техническую запись звонка; - пользовательский текст после такого блока в штатной логике не предполагается; - UI может рисовать такие сообщения отдельным специальным стилем. +- официальный UI не отправляет call-summary, если от старта исходящего звонка до его завершения прошло меньше `5` секунд. ## 7. Поведение официального UI diff --git a/VERSION.properties b/VERSION.properties index 29f7837..2d0a8fd 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.308 -server.version=1.2.287 +client.version=1.2.309 +server.version=1.2.288 diff --git a/shine-UI/js/app.js b/shine-UI/js/app.js index e15ba3c..52e0b37 100644 --- a/shine-UI/js/app.js +++ b/shine-UI/js/app.js @@ -50,6 +50,7 @@ import * as loginCameraView from './pages/login-camera-view.js'; import * as loginOtherDeviceView from './pages/login-other-device-view.js?v=202606180940'; import * as loginPasswordView from './pages/login-password-view.js?v=202606201650'; import * as keyStorageView from './pages/key-storage-view.js'; +import * as publicSupportQueueView from './pages/public-support-queue-view.js'; import * as profileView from './pages/profile-view.js'; import * as profileEditView from './pages/profile-edit-view.js'; @@ -110,6 +111,7 @@ const routes = { 'login-other-device-view': loginOtherDeviceView, 'login-password-view': loginPasswordView, 'key-storage-view': keyStorageView, + queue: publicSupportQueueView, 'profile-view': profileView, 'profile-edit-view': profileEditView, 'wallet-view': walletView, @@ -181,6 +183,7 @@ const GUEST_ALLOWED_PAGES = new Set([ 'channel-thread-view', 'user', 'contact-search-view', + 'queue', ]); setClientErrorTransport((payload) => authService.reportClientUiError(payload)); diff --git a/shine-UI/js/pages/chat-view.js b/shine-UI/js/pages/chat-view.js index 08460ce..4adb160 100644 --- a/shine-UI/js/pages/chat-view.js +++ b/shine-UI/js/pages/chat-view.js @@ -20,7 +20,7 @@ import { startOutgoingCall } from '../services/call-service.js'; import { openSpeechInputModal } from '../components/speech-input-modal.js'; import { isSpeechToTextConfigured, isTextToSpeechConfigured, speakTextBySettings } from '../services/speech-tools-service.js'; import { showToast } from '../services/channels-ux.js'; -import { parseDmTechBlocks, sanitizeUserDmTextForSend } from '../services/dm-tech-blocks.js'; +import { buildDmReplyTechBlock, parseDmTechBlocks, sanitizeUserDmTextForSend } from '../services/dm-tech-blocks.js'; export const pageMeta = { id: 'chat-view', title: 'Чат' }; const CONVERSATION_CLEAR_NOTICE_TEXT = 'История переписки очищена с этого места'; @@ -32,6 +32,12 @@ function truncatePreviewText(value, maxLen = 72) { return `${normalized.slice(0, Math.max(0, maxLen - 1)).trimEnd()}…`; } +function findMessageByBaseKey(messages, baseKey) { + const normalized = String(baseKey || '').trim(); + if (!normalized) return null; + return messages.find((row) => String(row?.baseKey || '').trim() === normalized) || null; +} + function openDeleteMessageConfirmModal({ onConfirm }) { const root = document.getElementById('modal-root'); if (!root) return; @@ -131,9 +137,11 @@ function openMessageActionsMenu({ anchorX = 0, anchorY = 0, messageText = '', + canReply = false, showReadAloud = true, canEdit = false, canDelete = false, + onReply, onReadAloud, onEdit, onDelete, @@ -145,6 +153,7 @@ function openMessageActionsMenu({ root.innerHTML = `