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:
@@ -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%)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user