refactor: extract message grouping logic (P3.9)

- Create src/message_grouping.rs module (255 lines)
- Add MessageGroup enum (DateSeparator, SenderHeader, Message)
- Add group_messages() function for date/sender grouping
- Write 5 unit tests (all passing)
- Add full rustdoc documentation with examples
- Update REFACTORING_ROADMAP.md (Priority 3: 3/4 tasks, 75%)
- Update CONTEXT.md with refactoring progress
- Overall refactoring progress: 11/17 tasks (65%)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Kilin
2026-01-31 23:30:41 +03:00
parent c5896b7f14
commit 0ca3da54e7
4 changed files with 343 additions and 33 deletions

View File

@@ -338,39 +338,41 @@ let message = MessageBuilder::new(MessageId::new(123))
## Приоритет 3: Архитектурные улучшения
### 7. Выделить UI компоненты
### 7. Выделить UI компоненты ✅ ЧАСТИЧНО ЗАВЕРШЕНО!
**Статус**: ЧАСТИЧНО ЗАВЕРШЕНО (4/5 компонентов, 2026-01-31)
**Проблема**: Код рендеринга дублируется, сложно переиспользовать.
**Решение**: Создать `src/ui/components/`:
**Решение**: Создано `src/ui/components/`:
```
src/ui/components/
├── mod.rs
├── modal.rs # Базовый компонент модалки
├── input_field.rs # Поле ввода с курсором
├── message_bubble.rs # Пузырь сообщения
├── chat_list_item.rs # Элемент списка чатов
└── emoji_picker.rs # Picker эмодзи
├── mod.rs
├── modal.rs ✅ (87 строк, полностью реализовано)
├── input_field.rs ✅ (54 строк, полностью реализовано)
├── message_bubble.rs ⚠️ (27 строк, placeholder, блокируется P3.8 и P3.9)
├── chat_list_item.rs ✅ (78 строк, полностью реализовано)
└── emoji_picker.rs ✅ (112 строк, полностью реализовано)
```
Каждый компонент — функция:
```rust
pub fn render_modal<F>(
frame: &mut Frame,
area: Rect,
title: &str,
render_content: F,
) where
F: FnOnce(&mut Frame, Rect),
{
// Общий код для всех модалок
}
```
**Что сделано**:
- ✅ Создана структура модулей `src/ui/components/`
- ✅ Реализовано 4 из 5 компонентов:
- `modal.rs` — базовые модалки с центрированием
- `input_field.rs` — текстовое поле с курсором
- `chat_list_item.rs` — элемент списка чатов
- `emoji_picker.rs` — picker реакций
- ⚠️ `message_bubble.rs` — placeholder (требует P3.8 ✅ и P3.9 ✅)
-Все компоненты используются в UI
**Что осталось**:
- ⏳ Реализовать `message_bubble.rs` (теперь разблокировано!)
- ⏳ Интегрировать `message_grouping` в `messages.rs`
**Преимущества**:
- Переиспользуемые компоненты
- Консистентный UI
- Проще тестировать
- Переиспользуемые компоненты
- Консистентный UI
- Проще тестировать
---
@@ -400,15 +402,17 @@ pub fn format_text_entities(
---
### 9. Вынести логику группировки сообщений
### 9. Вынести логику группировки сообщений ✅ ЗАВЕРШЕНО!
**Статус**: ЗАВЕРШЕНО (2026-01-31)
**Проблема**: Логика группировки сообщений смешана с рендерингом в `messages.rs`.
**Решение**: Создать `src/message_grouping.rs`:
**Решение**: Создан `src/message_grouping.rs`:
```rust
pub enum MessageGroup {
DateSeparator(String),
SenderHeader(String),
DateSeparator(i32),
SenderHeader { is_outgoing: bool, sender_name: String },
Message(MessageInfo),
}
@@ -417,10 +421,20 @@ pub fn group_messages(messages: &[MessageInfo]) -> Vec<MessageGroup> {
}
```
**Что сделано**:
- ✅ Создан модуль `src/message_grouping.rs` (255 строк)
- ✅ Реализован enum `MessageGroup` с тремя вариантами
- ✅ Реализована функция `group_messages()` для группировки по дате и отправителю
- ✅ Добавлена полная документация с примерами
- ✅ Написано 5 unit тестов (все проходят)
- ✅ Модуль добавлен в `src/lib.rs`
- ✅ Код компилируется успешно
**Преимущества**:
- Чистое разделение логики и представления
- Легче тестировать группировку
- Можно переиспользовать
- Чистое разделение логики и представления
- Легче тестировать группировку (покрыто тестами)
- Можно переиспользовать
- ✅ Готово для интеграции в `messages.rs`
---
@@ -685,11 +699,15 @@ tracing-subscriber = "0.3"
- [x] P2.4 — Newtype для ID
- [x] P2.6 — MessageInfo реструктуризация
- [x] P2.7 — MessageBuilder pattern
- [ ] Priority 3: 0/4 задач
- [ ] Priority 3: 3/4 задач (75%)
- [x] P3.7 — UI компоненты (частично, 4/5 компонентов)
- [x] P3.8 — Formatting модуль ✅
- [x] P3.9 — Message Grouping ✅
- [ ] P3.10 — Hotkey Mapping
- [ ] Priority 4: 0/4 задач
- [ ] Priority 5: 0/3 задач
**Всего**: 8/17 задач (47%)
**Всего**: 11/17 задач (65%)
---