We design a professional front-end for a messenger

WILD

Administrator
Staff member
ADMIN
SELLER
SUPREME
MEMBER
Joined
Jan 21, 2025
Messages
220
Reaction score
631
Deposit
0$
Демо

Демо
Ранее я написал статью "Создание высокопроизводительного окна просмотра для мессенджера" / Habr , в которой демонстрировалось создание простого окна просмотра для мессенджера, и оно не было основано на кроссплатформенном решении.

Выбор технологий​

Прежде чем создавать наш будущий мессенджер, нам необходимо определиться с технологией, которую мы будем использовать для его разработки. Среди инструментов веб-разработки для одностраничных приложений (SPA) явными фаворитами являются Angular и React . Я не буду подробно останавливаться на преимуществах каждого из этих инструментов, а сосредоточусь на Angular, поскольку ранее я проводил исследования неклассических виртуализированных списков и обнаружил, что он справляется с этой задачей лучше, чем React.

Решение для создания неклассических виртуализированных списков с использованием Angular ng-virtual-list и React rcx-virtual-list (пока не кроссплатформенное, так как Angular лучше справляется с этой задачей).

Технические требования​

  1. Мы создадим зону для группового просмотра, которая будет выходить прямо с причала.
  2. Область просмотра сообщений, отсортированных по дате создания.
  3. Процесс редактирования и удаления сообщений.
  4. Блок создания сообщения.
  5. Поиск сообщений по подстроке.
  6. Уникальный дизайн с тематической отделкой.
  7. Решение, поддерживающее различные браузеры и платформы.

Разработка решения​

Давайте создадим новый проект Angular; в этом примере мы будем использовать версию 20.x. Добавьте пакет ng-virtual-list и настройте его, как описано.

Я сразу же предоставлю исходный код проекта ng-virtual-list-chat-demo . Позже я выделю ключевые моменты в коде репозитория, чтобы объяснить их более подробно.

Проект полностью работает на основе моков, а транспортировка реализована с использованием мок-сервисов.

Услуги

  • Сервис для работы с группами сообщений ( groups-mock.service.ts ). Реализует методы getGroups, createGroup, updateGroup и deleteGroup.
  • Сервис для переключения между чатами ( message.service.ts )
  • Имитационный сервис для работы с сообщениями ( messages-mock.service.ts ). Этот сервис предоставляет функциональность getMessages, createMessage, updateMessage, patchMessages и deleteMessage для указанного chatId.
  • Сервис для работы с уведомлениями о новых сообщениях (имитация веб-сервиса) ( messages-notification-mock.service.ts ) реализует два Observable: $typing (сигнализирует о том, что пользователь с указанным userId набрал сообщение) и $messages (сигнализирует о добавлении сообщения, передавая в качестве значения версию изменений).
  • Сервис тем оформления ( theme.service.ts )
  • Сервис локализации ( localization.service.ts ). Важно отметить, что интерфейс может быть адаптирован для языков с письмом справа налево, таких как иврит. За это отвечает директива locale-sensitive.directive.ts .
Основные компоненты

  • Главная страница мессенджера: chat.component.ts
  • Компонент группы чата: groups.component.ts
  • Компонент области просмотра сообщений: messages.component.ts . Реализация коллекции основана на ProxyCollection. При получении необработанных данных они преобразуются в ProxyCollection<IMessageItemData>, который при изменении генерирует новый список элементов для <ng-virtual-list>.
    Важно отметить, что ng-virtual-list может кэшировать сообщения по типу. Для этого он вводит такие типы элементов, как typing-indicator, unmailed-separator, group, quote и message, которые отображаются как элементы определенного типа.
    <ng-template #itemRenderer let-index="index" let-data="data" let-prevData="prevData" let-nextData="nextData" let-measures="measures" let-config="config" let-reseted="reseted">
    <div staticClick [maxStaticClickDistance]="maxStaticClickDistance" class="message-template" (onStaticClick)="config.select(data.edited ? true : undefined)">
    @if (data?.data) {
    @switch (data.data.type) {
    @case ("typing-indicator") {
    <x-messages-typing-indicator ... />
    }
    @case ("unmailed-separator") {
    <x-message-unmailed-separator ... />
    }
    @case ("group") {
    <x-message-group ... />
    }
    @case ("quote") {
    <x-message-box [messageType]="'quote'"... />
    }
    @Default {
    <x-message-box ... />
    }
    }
    }
    </div>
    </ng-template>
 
Top Bottom