144 lines
4.9 KiB
Markdown
144 lines
4.9 KiB
Markdown
# Рефакторинг 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
|
||
```
|