Immobile 26.1500.0: личные закрепления и серверная очистка истории
Мобильный мессенджер 26.1500.0 догоняет серверный Im 26.1400.0: личные закрепы, поиск по всем чатам, скрытие папок и очистка истории, которая теперь идёт через сервер. Ещё в приложении появились вкладка встреч и отметка из чата. Почти всё включается серверными флагами, так что после обновления портал выглядит как раньше, пока вы их не включите.
Новое
Закрепляйте сообщения для себя
Личный закреп не зависит от общего, на одном сообщении могут стоять оба. Функцию включает серверный isPersonalPinAvailable === true, по умолчанию она выключена. Права писать в чат не нужно, но в комментариях личных закрепов нет. В списке закрепов появились фильтры «личные» и «общие» и поиск. Лимиты приходят в IM_FEATURES.pinLimits, если их нет, клиент считает по 20.
В своём расширении закреп ставит MessageService из im/messenger/provider/services/message, его создают так же, как штатный диалог:
const { MessageService } = require('im/messenger/provider/services/message');
const messageService = new MessageService({ store, chatId, dialogId });
const pinned = await messageService.pinMessagePersonally(messageId).catch(() => false);
pinMessagePersonally() и unpinMessagePersonally() возвращают Promise<boolean>, отдают ошибку наверх и сами откатывают оптимистичное изменение, если сервер отказал.
Наведите порядок в папках
Экран папок разделяет видимые и скрытые пользователем, порядок и видимость сохраняются вместе. Если уйти с экрана, не сохранив изменения, приложение предложит их сохранить. Скрыть папку можно, только если сервер прислал canHide === true, а папки, скрытые системой, в списки не попадают. Чаты можно закреплять внутри папки: pin и unpin принимают необязательный folderId, нужен флаг isFolderScopedPinsAvailable. Без папки работает общий recent.pinned.
Ищите сообщения по всем чатам
Глобальный поиск стартует с трёх символов, отдаёт по 20 результатов и сортирует по релевантности или дате, текущая папка его не ограничивает. Нужны withMessageSection в конфигурации и серверный messageSearchAvailable === true, для гостей поиск закрыт всегда. После просмотра найденного сообщения поиск возвращается к прежним результатам. Найденный комментарий открывается вместе с родительским каналом, а открытую линию, которую приложение не показывает, предложат открыть в браузере.
Для своих экранов есть MessageServerSearchStrategy из im/messenger/lib/chat-search с пагинацией, повтором и отменой запроса и createOpenChannelCommentsOptions() из im/messenger/lib/channel-comments-opener, который возвращает null, если комментарий открыть нельзя.
Очищайте историю через сервер
Очистка теперь вызывает im.v2.Chat.clearHistory (для себя) или im.v2.Chat.clearHistoryForAll (для всех), локальное состояние меняется после ответа сервера. Кто может очищать, решает минимальная роль, присланная сервером: без роли пункт недоступен. Сообщения новее границы lastId и ещё не отправленные остаются. Вместе с историей уходят связанные локальные закрепы, файлы и ссылки, а запоздавшая подгрузка не вернёт удалённое. Клиентские обёртки — ChatService.clearChatHistoryForSelf(dialogId) и clearChatHistoryForAll(dialogId).
Встречи, отметки и звонки
- Вкладка встреч
Bitrix\ImMobile\NavigationTab\Tab\Meetingподключена по коду папкиmeeting(клиентский ID —calendar), доступность определяетSystemFolder. Во вкладке видны и встречи проектов, создаются они через событие календаря. - Отметиться можно из меню вложений чата через
stafftrack:entry. Пункт видит внутренний пользователь с правом писать в чате с людьми: гостям, коллаберам, экстранету, ботам, общему чату, каналам, комментариям, тредам, открытым линиям и CoPilot он недоступен. Саму отметку проверяет сервер StaffTrack. НовыйBitrix\ImMobile\Settings::hasCheckInHistory(): boolскажет, есть ли у сотрудника отметки, и вернётfalse, если модуляstafftrackнет или его версия старая. - Исходящие гостевые звонки получили отдельные серверные флаги для личного и группового звонка, на клиенте оба по умолчанию
false. Начать групповой звонок в одиночку можно в чате типаchat,openилиcalendarбез родительского чата, где пользователь не гость и пока единственный участник, при доступных гостях, праве их приглашать и положительном времени ожидания изcall. - Текущие звонки не пропадают из списка при фильтрации. Общая вкладка показывает все звонки, вкладка проекта — звонки проекта и звонок пользователя на этом устройстве.
Файлы, видео и Markdown
- Скачать видеосообщение можно, только если сервер вернул
isVideoNoteDownloadAvailable === trueи в приложении есть native-функцияchat_video_note_download. На отказVIDEO_NOTE_DOWNLOAD_RESTRICTEDпользователь увидит «Видеосообщение нельзя скачать или сохранить в Битрикс24». - При
DISK_QUOTA_EXCEEDEDили прежнемQUOTA_BADотправка пачки файлов останавливается, уже загруженные файлы удаляются. Баннер предлагает повторить, подпись и цитата не теряются, кнопка расширения лимита появляется только с сервернымinfoHelperCode. В боковой панели чата файлы можно удалять с подтверждением. - Markdown-блоки показывают текст, код, цитаты и таблицы. Для этого нужны серверный Markdown parser и native-renderer и native-функции
chat_markdown_native_renderer_v1иchat_builder_markdown_v1.
БД
Серверная схема не меняется, всё происходит в SQLite на устройстве. Миграция 39 добавляет в b_im_folder поля hiddenBySystem и hiddenByUser и переносит старое visible = '0' в hiddenBySystem = '1', столбец visible остаётся. Миграция 40 создаёт b_im_link_personal_pin и b_im_link_personal_pin_message, миграция 41 добавляет индекс b_im_message(chatId, id). Таблица b_im_folder_pin с ключом (folderId, chatId) создаётся через schema, без номерной миграции.
Мелочи и находки
- Свои JN-расширения проверьте на удалённых символах.
FolderService.sortFolders()изim/messenger/provider/services/folderзаменён наsaveFolderList({ folderIds, foldersToShow?, foldersToHide? }),folderIdsобязателен и должен быть массивом, а результат приходит массивом папок.showClearHistoryCollabAlertизim/messenger/lib/ui/alertзаменён наshowClearHistoryChatAlert({ forAll, deleteCallback, cancelCallback }),ErrorType.recent.maxPinизim/messenger/const— наErrorType.folder.pinsLimitExceeded(FOLDER_PINS_LIMIT_EXCEEDED). - Меню сообщения показывает, кто и когда прочитал сообщение в личном чате, реакции и список пользователей. Стопке аватаров нужна native-функция
popup_menu_icon_stack, без неё выводится счётчик. - Кнопка повторной генерации ответа AI-ассистента требует
isAiAssistantRegenerateAvailableи личного чата с ассистентом, во время генерации она скрыта. - Системная медиасессия при проигрывании аудиосообщения показывает название записи, а не
ajax.php.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
im/messenger/provider/services/folder: FolderService.sortFolders()
|
Удалено |
im/messenger/provider/services/folder: FolderService.saveFolderList()
|
im/messenger/lib/ui/alert: showClearHistoryCollabAlert
|
Удалено |
im/messenger/lib/ui/alert: showClearHistoryChatAlert
|
im/messenger/const: ErrorType.recent.maxPin
|
Удалено |
im/messenger/const: ErrorType.folder.pinsLimitExceeded
|