diff --git a/ROADMAP.md b/ROADMAP.md index 693b7fd..5809a50 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -425,3 +425,253 @@ - `s` / `ы` - остановить воспроизведение - `←` / `→` - перемотка -5с / +5с (во время воспроизведения) - `↑` / `↓` - громкость +/- 10% (во время воспроизведения) + +## Фаза 13: Глубокий рефакторинг архитектуры [PLANNED] + +**Мотивация:** Код вырос до критических размеров - некоторые файлы содержат >1000 строк, что затрудняет поддержку и навигацию. Необходимо разбить монолитные файлы на логические модули. + +**Проблемы:** +- `src/input/main_input.rs` - 1199 строк (самый большой файл!) +- `src/app/mod.rs` - 1015 строк, 116 функций (God Object) +- `src/ui/messages.rs` - 893 строки +- `src/tdlib/messages.rs` - 833 строки +- `src/config/mod.rs` - 642 строки + +### Этап 1: Разбить input/main_input.rs (1199 → <200 строк) [TODO] + +**Текущая проблема:** +- Весь input handling в одном файле +- Функции по 300-400 строк +- Невозможно быстро найти нужный handler + +**План:** +- [ ] Создать `src/input/handlers/` директорию +- [ ] Создать `handlers/chat.rs` - обработка ввода в открытом чате + - Переместить `handle_open_chat_keyboard_input()` + - Обработка скролла, выбора сообщений + - ~300-400 строк +- [ ] Создать `handlers/chat_list.rs` - обработка в списке чатов + - Переместить `handle_chat_list_keyboard_input()` + - Навигация по чатам, папки + - ~200-300 строк +- [ ] Создать `handlers/compose.rs` - режимы edit/reply/forward + - Обработка ввода в режимах редактирования + - Input field управление (курсор, backspace, delete) + - ~200 строк +- [ ] Создать `handlers/modal.rs` - модалки + - Delete confirmation + - Emoji picker + - Profile modal + - ~150 строк +- [ ] Создать `handlers/search.rs` - поиск + - Search mode в чате + - Search mode в списке чатов + - ~100 строк +- [ ] Обновить `main_input.rs` - только роутинг + - Определение текущего режима + - Делегация в нужный handler + - <200 строк + +**Результат:** 1199 строк → 6 файлов по <400 строк + +### Этап 2: Уменьшить app/mod.rs (116 функций → traits) [TODO] + +**Текущая проблема:** +- God Object с 116 функциями +- Сложно найти нужный метод +- Нарушение Single Responsibility Principle + +**План:** +- [ ] Создать `app/methods/` директорию +- [ ] Создать trait `NavigationMethods` + - `next_chat()`, `previous_chat()` + - `scroll_up()`, `scroll_down()` + - `select_chat()`, `open_chat()` + - ~15 методов +- [ ] Создать trait `MessageMethods` + - `send_message()`, `edit_message()`, `delete_message()` + - `reply_to_message()`, `forward_message()` + - `select_message()`, `deselect_message()` + - ~20 методов +- [ ] Создать trait `ComposeMethods` + - `enter_edit_mode()`, `enter_reply_mode()`, `enter_forward_mode()` + - `handle_input_char()`, `move_cursor_left()`, `move_cursor_right()` + - ~15 методов +- [ ] Создать trait `SearchMethods` + - `start_search()`, `search_next()`, `search_previous()` + - `clear_search()` + - ~5 методов +- [ ] Создать trait `ModalMethods` + - `show_delete_confirmation()`, `show_emoji_picker()` + - `show_profile()`, `close_modal()` + - ~10 методов +- [ ] Оставить в `app/mod.rs` только: + - Struct definition + - Constructor (new, with_client) + - Getters/setters для полей + - ~30-40 методов + +**Структура:** +```rust +// app/mod.rs - только core +impl App { + pub fn new() -> Self { ... } + pub fn config(&self) -> &Config { ... } +} + +// app/methods/navigation.rs +pub trait NavigationMethods { + fn next_chat(&mut self); + fn previous_chat(&mut self); +} +impl NavigationMethods for App { ... } + +// app/methods/messages.rs +pub trait MessageMethods { + async fn send_message(&mut self, text: String); +} +impl MessageMethods for App { ... } +``` + +**Результат:** 116 функций → 6 trait impl блоков + +### Этап 3: Разбить ui/messages.rs (893 → <300 строк) [TODO] + +**Текущая проблема:** +- Весь UI рендеринг сообщений в одном файле +- Модалки смешаны с основным рендерингом +- Compose bar (input field) в том же файле + +**План:** +- [ ] Создать `ui/modals/` директорию +- [ ] Создать `modals/delete_confirm.rs` + - Рендеринг модалки подтверждения удаления + - Обработка y/n input + - ~50 строк +- [ ] Создать `modals/emoji_picker.rs` + - Рендеринг сетки эмодзи + - Навигация по сетке + - ~100 строк +- [ ] Создать `modals/search_modal.rs` + - Поиск в чате + - Подсветка результатов + - Навигация по совпадениям + - ~80 строк +- [ ] Создать `modals/profile_modal.rs` + - Профиль пользователя/чата + - Отображение информации + - ~100 строк +- [ ] Создать `ui/compose_bar.rs` + - Поле ввода сообщения + - Превью для edit/reply/forward + - Курсор, автоматический wrap + - ~150 строк +- [ ] Оставить в `messages.rs`: + - Основной layout сообщений + - Рендеринг списка message bubbles + - Группировка по дате + - Pinned message + - ~300 строк + +**Результат:** 893 строки → 6 файлов по <150 строк + +### Этап 4: Разбить tdlib/messages.rs (833 → 2 файла) [TODO] + +**Текущая проблема:** +- Смешивается конвертация из TDLib и операции +- Большой файл сложно читать + +**План:** +- [ ] Создать `tdlib/messages/` директорию +- [ ] Создать `messages/convert.rs` + - Конвертация MessageContent из TDLib + - Парсинг всех типов (Text, Photo, Video, Voice, etc.) + - Обработка форматирования (entities) + - ~500 строк +- [ ] Создать `messages/operations.rs` + - send_message(), edit_message(), delete_message() + - forward_message(), reply_to_message() + - get_chat_history(), load_older_messages() + - ~300 строк +- [ ] Обновить `tdlib/messages.rs` → `tdlib/messages/mod.rs` + - Re-export публичных типов + - ~30 строк + +**Результат:** 833 строки → 2 файла по <500 строк + +### Этап 5: Разбить config/mod.rs (642 → 3 файла) [TODO] + +**Текущая проблема:** +- Много default_* функций (по 1-3 строки каждая) +- Validation logic смешана с определениями +- Сложно найти нужную секцию конфига + +**План:** +- [ ] Создать `config/defaults.rs` + - Все default_* функции + - ~100 строк +- [ ] Создать `config/validation.rs` + - Валидация timezone + - Валидация цветов + - Валидация notification settings + - ~150 строк +- [ ] Создать `config/loader.rs` + - Загрузка из файла + - Поиск путей (XDG, home, etc.) + - Обработка ошибок чтения + - ~100 строк +- [ ] Оставить в `config/mod.rs`: + - Struct definitions + - Default impls (вызывают defaults.rs) + - Re-exports + - ~200-300 строк + +**Результат:** 642 строки → 4 файла по <200 строк + +### Этап 6: Code Duplication Cleanup [TODO] + +**План:** +- [ ] Найти дублированный код в handlers + - Общая логика обработки клавиш + - Вынести в `input/common.rs` +- [ ] Найти дублированный код в UI + - Общие компоненты рендеринга + - Вынести в `ui/components/` +- [ ] Использовать DRY принцип везде + +### Этап 7: Documentation Update [TODO] + +**План:** +- [ ] Обновить CONTEXT.md с новой структурой +- [ ] Обновить PROJECT_STRUCTURE.md +- [ ] Добавить module-level документацию +- [ ] Создать architecture diagram (ASCII) + +### Метрики успеха + +**До рефакторинга:** +``` +input/main_input.rs: 1199 строк +app/mod.rs: 1015 строк (116 функций) +ui/messages.rs: 893 строки +tdlib/messages.rs: 833 строки +config/mod.rs: 642 строки +ИТОГО: 4582 строки в 5 файлах +``` + +**После рефакторинга:** +``` +input/handlers/*.rs: ~6 файлов по <400 строк +app/methods/*.rs: ~6 traits с impl блоками +ui/modals/*.rs: ~4 файла по <150 строк +tdlib/messages/*.rs: 2 файла по <500 строк +config/*.rs: 4 файла по <200 строк +ИТОГО: те же строки, но в ~20+ файлах +``` + +**Преимущества:** +- ✅ Легче найти нужный код +- ✅ Легче тестировать модули +- ✅ Меньше конфликтов при работе в команде +- ✅ Лучше читаемость и поддерживаемость +- ✅ Соблюдение Single Responsibility Principle