@qor/chat-layer

Компоненты

Vue-компоненты чат-мессенджера — 27 компонентов для полнофункционального интерфейса.

Все компоненты авто-импортируются (pathPrefix отключён). Компоненты используют Nuxt UI 4 с темой @qor/ui.

Основные компоненты

ChatMessages

Область отображения сообщений с виртуальным скроллом (DynamicScroller).

<ChatMessages
  :messages="messages"
  :loading="loading"
  :has-more="hasMore"
  :current-user-id="currentUserId"
  :participants="participantsMap"
  :typing-users="typingUserNames"
  :unread-count="unreadCount"
  @load-more="loadMore"
  @reply="handleReply"
  @copy="handleCopy"
  @delete="handleDelete"
  @edit="handleEdit"
  @forward="handleForward"
  @react="handleReact"
  @retry="handleRetry"
  @pin="handlePin"
/>
PropТипОписание
messagesChatMessage[]Массив сообщений
loadingbooleanИндикатор загрузки
hasMorebooleanЕсть ли ещё история
currentUserIdstringID текущего пользователя
participantsMap<string, { name, avatar? }>Карта участников
typingUsersstring[]Имена пользователей, которые печатают
unreadCountnumberКоличество непрочитанных

ChatInput

Поле ввода сообщения с поддержкой вложений, эмодзи и голосовых сообщений.

<ChatInput
  ref="chatInputRef"
  :reply-to="replyTo"
  :editing-message="editingMessage"
  :chat-id="chatId"
  @send="handleSend"
  @cancel-reply="replyTo = null"
  @cancel-edit="editingMessage = null"
/>
PropТипОписание
replyToChatMessage | nullСообщение, на которое отвечают
editingMessageChatMessage | nullРедактируемое сообщение
chatIdstringID текущего чата
EmitPayloadОписание
send[body, attachments?, files?]Отправка сообщения
cancel-replyОтмена ответа
cancel-editОтмена редактирования

ChatHeader

Шапка диалога с именем, аватаром, статусом и действиями.

<ChatHeader
  :conversation="conversation"
  :show-back="isMobile"
  @back="navigateTo('/chats')"
  @search="searchOpen = !searchOpen"
  @info="infoOpen = true"
  @mute="handleMute"
  @clear-chat="handleClearChat"
  @leave-group="handleLeaveGroup"
/>

ChatListItem

Элемент списка чатов с аватаром, превью, временем и счётчиком непрочитанных.

<ChatListItem
  :conversation="conv"
  :active="conv.id === activeChatId"
  @click="selectChat(conv)"
/>

ChatMessageBubble

Пузырь сообщения с контекстным меню (reply, edit, delete, forward, react, pin).

<ChatMessageBubble
  :message="msg"
  :is-own="isOwn"
  :show-avatar="showAvatar"
  :show-name="showName"
  :sender-name="senderName"
  :current-user-id="currentUserId"
  @reply="$emit('reply', msg)"
  @edit="$emit('edit', msg)"
  @delete="$emit('delete', msg)"
  @copy="$emit('copy', msg)"
  @forward="$emit('forward', msg)"
  @react="$emit('react', { messageId: msg.id, emoji })"
  @retry="$emit('retry', msg)"
  @pin="$emit('pin', msg)"
/>

Вспомогательные компоненты

Область ввода

КомпонентОписание
ChatEmojiPickerПанель выбора эмодзи
ChatVoiceRecorderЗапись голосовых сообщений
ChatFilePreviewПревью прикреплённого файла перед отправкой
ChatInputPreviewBarПанель превью (reply-to / editing) над полем ввода

Контент сообщений

КомпонентОписание
ChatBubbleContentСодержимое сообщения (текст, изображение, файл, аудио, видео)
ChatAudioPlayerПлеер для аудио/голосовых сообщений
ChatImageLightboxПолноэкранный просмотр изображений

Навигация и статус

КомпонентОписание
ChatConnectionStatusБаннер статуса подключения (reconnecting/error)
ChatTypingIndicatorАнимация "печатает..."
ChatSearchBarПанель поиска по сообщениям
ChatSearchПоиск по списку чатов
ChatPinnedBarЗакреплённое сообщение
ChatScrollButtonКнопка "вниз" со счётчиком непрочитанных
ChatDropOverlayОверлей при drag & drop файлов
ChatEmptyПустое состояние (нет чатов / чат не найден)

Информация о чате

КомпонентОписание
ChatInfoБоковая панель информации о диалоге (slideOver)
ChatInfoProfileПрофиль пользователя/группы
ChatInfoParticipantsСписок участников группы
ChatInfoMediaМедиа-файлы чата
ChatInfoActionsДействия (mute, clear, leave)

Диалоги

КомпонентОписание
ChatForwardDialogМодальное окно пересылки сообщения
ChatListСписок всех диалогов (RecycleScroller)

Страницы

Layer предоставляет готовые страницы:

СтраницаПутьОписание
chats.vue/chatsLayout: dual-panel (desktop) / single (mobile)
chats/index.vue/chatsПустое состояние "Выберите чат"
chats/[id].vue/chats/:idДиалог с конкретным чатом

Desktop layout

┌──────────────┬───────────────────────────────┐
│  Chat List   │  Chat Conversation            │
│  (resizable) │                               │
│              │  ┌─────────────────────────┐   │
│  ┌────────┐  │  │ ChatHeader              │   │
│  │ Search │  │  ├─────────────────────────┤   │
│  ├────────┤  │  │                         │   │
│  │ Filter │  │  │ ChatMessages            │   │
│  ├────────┤  │  │ (virtual scroll)        │   │
│  │        │  │  │                         │   │
│  │ Items  │  │  ├─────────────────────────┤   │
│  │        │  │  │ ChatInput               │   │
│  └────────┘  │  └─────────────────────────┘   │
└──────────────┴───────────────────────────────┘

Mobile layout

Полноэкранная навигация: список чатов → диалог (кнопка "назад").