Corp/BASE_TEMPLATE_REFACTORING.md

144 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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