# Рефакторинг base.html
## Проблема
`base.html` содержит много chat-специфичной логики, которая должна быть только на страницах чатов.
## Принципы рефакторинга
### ✅ Что ДОЛЖНО быть в base.html (универсальное):
1. **Базовая структура** - navbar, sidebar, rightbar, main
2. **Глобальные утилиты** - stringUtils, timing, scroll
3. **Глобальные переменные** - `window.currentUserId`
4. **Универсальный WebSocket** - подключение к `ws/`, но БЕЗ chat-специфичной логики
5. **Notification Manager** - уведомления нужны везде
6. **Theme Initializer** - тема нужна везде
7. **Bootstrap, Icons** - базовые библиотеки
### ❌ Что НУЖНО убрать из base.html (chat-специфичное):
1. **chatAvatarMap** - нужен только на страницах чатов
2. **chatMarkRead** - только для chat_detail.html
3. **chatListFilter** - только для chat_list.html
4. **chatBadgeManager** - только для страниц с чатами
5. **chatListRealtime** - только для chat_list.html
6. **Sidebar badge logic** - должна быть в отдельном модуле
7. **Chat-специфичные обработчики в userWebSocket** - `onListUpdate`, `markReadApi`
## План действий
### Шаг 1: Создать chat-специфичные include файлы
**`includes/chat_scripts.html`** - общие скрипты для всех страниц чатов:
```django
{# Загружается на chat_list.html и chat_detail.html #}
- chatAvatarMap
- chatBadgeManager
- userWebSocket инициализация с chat-обработчиками
- Sidebar badge logic
```
**`includes/chat_detail_scripts.html`** - только для chat_detail.html:
```django
- chatMarkRead
- chatComposer
- chatHistoryLoader
- chat-detail-enhanced
```
**`includes/chat_list_scripts.html`** - только для chat_list.html:
```django
- chatListFilter
- chatListRealtime
```
### Шаг 2: Упростить base.html
**Что остаётся:**
```javascript
// Глобальные утилиты
import { esc, norm, ... } from 'stringUtils.js';
import { debounce, throttle } from 'timing.js';
import { smoothScrollTo, ... } from 'scroll.js';
// Базовые компоненты
import { initNavbarHeight } from 'navbarHeight.js';
import { initLikeHandler } from 'likeHandler.js';
// Универсальный WebSocket (БЕЗ chat-специфики)
import { initUserWebSocket } from 'userWebSocket.js';
// Базовая инициализация
const userWs = initUserWebSocket({
userId: {{ user.id }}
});
window.userWebSocket = userWs;
```
### Шаг 3: Обновить chat_detail.html
```django
{% extends "base.html" %}
{% block extra_js %}
{% include "includes/chat_scripts.html" %}
{% include "includes/chat_detail_scripts.html" %}
{% endblock %}
```
### Шаг 4: Обновить chat_list.html
```django
{% extends "base.html" %}
{% block extra_js %}
{% include "includes/chat_scripts.html" %}
{% include "includes/chat_list_scripts.html" %}
{% endblock %}
```
## Результат
### До:
- ❌ base.html: 250 строк, много chat-логики
- ❌ Все chat-модули загружаются на всех страницах
- ❌ Сложно понять, что где используется
### После:
- ✅ base.html: ~120 строк, только универсальное
- ✅ Chat-модули загружаются только на нужных страницах
- ✅ Чёткое разделение ответственности
- ✅ Легко добавлять новые модули
## Архитектура модулей
```
base.html (универсальные модули)
├─ stringUtils.js
├─ timing.js
├─ scroll.js
├─ navbarHeight.js
├─ likeHandler.js
├─ userWebSocket.js (базовое подключение)
└─ notification-manager.js
includes/chat_scripts.html (общее для всех chat-страниц)
├─ chatAvatarMap.js
├─ chatBadgeManager.js
├─ sidebarBadge.js (новый модуль)
└─ userWebSocket.js (расширенная инициализация с chat-обработчиками)
includes/chat_detail_scripts.html (только для chat_detail.html)
├─ chatMarkRead.js
├─ chatComposer.js
├─ chatHistoryLoader.js
└─ chat-detail-enhanced.js
├─ messageReactions.js
├─ messageContextMenu.js
├─ messageSelection.js
├─ chatPoll.js
└─ messageEditing.js
includes/chat_list_scripts.html (только для chat_list.html)
├─ chatListFilter.js
└─ chatListRealtime.js
```