Skip to content

v2.162.0: Native Linux Client for Yandex Messenger

Choose a tag to compare

@Bezooom Bezooom released this 29 Jun 19:52
· 15 commits to master since this release

Отчет по Sprint 6 — Yandex Messenger Native

В рамках Sprint 6 были решены критические проблемы интерфейса, передачи данных и отправки сообщений, а также реализована премиальная темная тема.


Решенные проблемы и багфиксы

1. Устранение критических GTK layout багов

  • Проблема: Контейнеры интерфейса (root GtkBox, ChatView, ChatListPanel) имели неверные настройки расширения hexpand(false) / vexpand(false). Из-за этого при изменении размеров окна GTK4 входил в бесконечный цикл расчета геометрии, пытаясь растянуть виджеты до максимального размера в 1048576 пикселей, что сопровождалось системными предупреждениями и зависанием UI.
  • Решение:
    • Настройки hexpand и vexpand для корневых контейнеров переведены в значение true.
    • Устаревший вертикальный разделитель заменен на интерактивный gtk::Paned с возможностью перетаскивания границы сайдбара.
    • Добавлена поддержка компактного режима сайдбара: при уменьшении его ширины ниже 180px к панели чатов применяется CSS-класс .compact, скрывающий текстовые превью и имена чатов, оставляя только круглые аватары.
    • Ширина сайдбара по умолчанию уменьшена до 260px для оптимизации пространства.
    • Минимальная высота горизонтального ползунка прокрутки CSS уменьшена до 4px (с увеличением до 8px при наведении) для предотвращения смещения элементов.

2. Исправление пропадания чатов и истории сообщений

  • Проблема: Ранее чаты загружались асинхронно через load_chats() в glib::spawn_future_local, но результат не передавался в компонент отображения списка, из-за чего список чатов оставался пустым. Также отсутствовал механизм мгновенного восстановления истории при переключении диалогов.
  • Решение:
    • Результаты сетевого вызова теперь корректно передаются в метод set_chats(chats) панели списка чатов.
    • Интегрировано асинхронное кэширование L2 в фоновом пуле потоков Tokio (load_cache_l2_async / save_cache_l2_async), которое сохраняет историю сообщений в JSON-файлы.
    • При выборе чата интерфейс мгновенно считывает сообщения из локального кэша через метод get_cached_messages_async и отображает их пользователю, пока идет фоновый запрос к API за свежей историей. Это полностью решило проблему визуального пропадания сообщений.

3. Исправление отправки сообщений

  • Проблема: Кнопка отправки сообщений не работала, так как в UI-компоненте ChatView не вызывался метод bind_callbacks(). Коллбек on_send оставался None, и попытки отправить сообщение игнорировались.
  • Решение:
    • Метод bind_callbacks() подключен при инициализации макета в main.rs.
    • Отправка текстовых сообщений переведена на асинхронную модель взаимодействия с WebSocket-клиентом без блокировки основного потока отрисовки интерфейса GTK.
    • Поле ввода переведено с однострочного Entry на многострочный TextView в ScrolledWindow с ограничением максимальной высоты (120px). Отправка сообщения выполняется по клавише Enter, перенос строки — по Shift+Enter.
    • Добавлена функция быстрого редактирования последнего сообщения по клавише Up при пустом вводе.
    • Элементы интерфейса для дополнительных действий (отправка файлов, создание опросов, планирование времени) вынесены в аккуратное всплывающее меню кнопки прикреплений (скрепки).

4. Реализация премиальной темной темы

  • Проблема: Старый интерфейс использовал контрастные сине-зеленые тона, которые не соответствовали современным стандартам приложений для обмена сообщениями.
  • Решение:
    • Перезаписана палитра цветов в файле theme.css. Основной фон приложения переведен в глубокие темные Obsidian-like тона (#09090b), а сайдбар — в темно-серый сланец (#111116).
    • Бабблы входящих сообщений получили нейтральный темно-серый цвет (#1e1e28), а исходящих — мягкий синий градиент (#2f80ed -> #0056b3).
    • Заменена заглушка аватаров на полноценный компонент adw::Avatar из Libadwaita с поддержкой автоматического подбора цвета и инициалов.
    • Внедрена система кэширования аватаров в памяти (AVATAR_CACHE), что устранило мерцание при прокрутке списка чатов и частые сетевые запросы.
    • Добавлены разделители дат («Сегодня», «Вчера») и увеличенные эмодзи без пузыря при отправке до 3 символов включительно.

Текущий статус проекта

  • Компиляция: ✅ Проходит успешно, без ошибок (cargo check завершен с 0 ошибок).
  • Слой UI: Переведен на Libadwaita (adw::Application / adw::ApplicationWindow). Layout стабилен, бесконечные циклы расчетов отсутствуют.
  • Основные функции: Авторизация, отображение списка чатов, асинхронное получение сообщений, отправка текста и стикеров работают в штатном режиме.