# Умный автоскролл в чате
## ✅ Реализовано
Добавлен "умный автоскролл" по аналогии с современными мессенджерами (Telegram, WhatsApp, Discord).
## 🎯 Как это работает
### Логика автоскролла при получении нового сообщения:
```
НОВОЕ СООБЩЕНИЕ ПРИШЛО
↓
Проверяем условия:
↓
├─ Это МОЁ сообщение? → ДА → Скролл вниз ✅
│
└─ Это ЧУЖОЕ сообщение?
↓
├─ Я внизу чата (< 100px)? → ДА → Скролл вниз ✅
│
└─ Читаю историю? → ДА → Показать индикатор "Новые сообщения" 🔔
```
### Три сценария:
1. **Я отправил сообщение** → всегда скроллим вниз
2. **Пришло чужое сообщение + я внизу** → скроллим вниз (активно читаю)
3. **Пришло чужое сообщение + читаю историю** → показываем индикатор
## 📁 Изменённые файлы
### 1. `chatController.js` - основная логика
**Добавлено:**
- Свойства `newMessagesCount` и `newMessagesBtn` в конструктор
- Метод `_showNewMessagesIndicator()` - показать индикатор
- Метод `_hideNewMessagesIndicator()` - скрыть индикатор
- Метод `_findOrCreateNewMessagesButton()` - создать кнопку
- Метод `_initScrollWatcher()` - отслеживание скролла
- Вызов `_initScrollWatcher()` в `init()`
**Изменено:**
- `_handleMessageAdded()` - умная логика автоскролла:
```javascript
// ДО (неправильно):
const shouldScroll = message.author_id === this.currentUserId;
// ПОСЛЕ (правильно):
const isMyMessage = message.author_id === this.currentUserId;
const isAtBottom = this.scrollManager.isNearBottom();
const shouldScroll = isMyMessage || isAtBottom;
if (shouldScroll) {
this.scrollManager.scrollToBottom({ instant: false });
this._hideNewMessagesIndicator();
} else {
this._showNewMessagesIndicator();
}
```
### 2. `chat-new-messages-indicator.css` - стили
**Создан новый файл:** `backend/static/css/components/chat-new-messages-indicator.css`
Включает:
- Позиционирование кнопки (правый нижний угол)
- Анимацию появления/исчезновения
- Hover/Active эффекты
- Адаптив для мобильных
- Поддержку тёмной темы
### 3. `chat_detail.html` - подключение стилей
**Добавлено:**
```django
```
## 🔧 Технические детали
### Порог "близко к низу"
```javascript
// ScrollManager.js
BOTTOM_THRESHOLD: 100 // пикселей
```
Если пользователь в пределах 100px от низа чата - считается что "внизу".
### Кнопка индикатора
Создаётся автоматически в JS:
```javascript
```
При клике:
- Скроллит вниз с `force: true`
- Сбрасывает счётчик
- Скрывает кнопку
### Автоматическое скрытие
При ручном скролле вниз (debounce 150ms):
```javascript
if (this.scrollManager.isNearBottom()) {
this._hideNewMessagesIndicator();
}
```
## 🎨 Внешний вид
### Кнопка:
- 📍 Позиция: правый нижний угол (20px отступ)
- 🎨 Цвет: синий (primary)
- 📏 Размер: 180px × 40px
- ✨ Анимация: плавное появление с pulse эффектом
- 🔢 Счётчик: бейдж с количеством новых сообщений
### Адаптив:
- На мобильных: меньше размер, меньше отступы
- Тёмная тема: более тёмный синий фон
## 📊 Сравнение с популярными мессенджерами
| Мессенджер | Порог | Индикатор | Наша реализация |
|------------|-------|-----------|-----------------|
| **Telegram** | ~150px | "↓ 5 новых" | ✅ 100px + счётчик |
| **WhatsApp** | ~100px | Зелёная стрелка | ✅ Синяя с счётчиком |
| **Discord** | ~50px | "New Messages" | ✅ "X новых сообщения" |
| **Slack** | ~100px | "Jump" button | ✅ Скролл вниз |
## 🧪 Тестирование
### Сценарий 1: Отправка своего сообщения
1. Прокрутить вверх (история)
2. Отправить сообщение
3. ✅ Должен автоматически скроллить вниз
### Сценарий 2: Получение чужого сообщения (внизу)
1. Находиться внизу чата
2. Получить чужое сообщение
3. ✅ Должен автоматически скроллить вниз
### Сценарий 3: Получение чужого сообщения (читаю историю)
1. Прокрутить вверх на 200px+
2. Получить чужое сообщение
3. ✅ Должна появиться кнопка "X новых сообщения"
### Сценарий 4: Клик по индикатору
1. Показан индикатор
2. Кликнуть по кнопке
3. ✅ Скроллит вниз + кнопка исчезает
### Сценарий 5: Ручной скролл вниз
1. Показан индикатор
2. Вручную прокрутить вниз
3. ✅ Кнопка автоматически исчезает
## 🐛 Известные особенности
1. Кнопка создаётся динамически в JS (не в HTML шаблоне)
2. Счётчик увеличивается на каждое новое сообщение пока читаем историю
3. Сбрасывается при скролле вниз или клике по кнопке
## 🔄 Связанные файлы
- `backend/static/js/controllers/chatController.js` - основная логика
- `backend/static/js/managers/scrollManager.js` - `isNearBottom()`
- `backend/static/css/components/chat-new-messages-indicator.css` - стили
- `backend/templates/communications/chat_detail.html` - подключение CSS
## 📝 Логирование
Все действия логируются в консоль:
```javascript
[ChatController] New message: {
id: 123,
isMyMessage: false,
isAtBottom: false,
shouldScroll: false
}
[ChatController] New messages indicator shown: 1
```
## 🚀 Следующие шаги (опционально)
- [ ] Добавить звуковое уведомление при новом сообщении
- [ ] Добавить вибрацию на мобильных
- [ ] Сделать порог настраиваемым (в настройках пользователя)
- [ ] Добавить плавную анимацию скролла (smooth scroll)
- [ ] Показывать preview последнего сообщения в индикаторе