46 lines
2.4 KiB
Markdown
46 lines
2.4 KiB
Markdown
# feature:conversations
|
|
|
|
## Screen
|
|
`ConversationListScreen` -- the drawer content showing all conversations. Sealed interface: `ConversationsRoute : NavKey` with routes `Conversations` and `ArchivedConversations` (both `@Serializable` data objects).
|
|
|
|
## Pagination
|
|
- Cursor-based via `ConversationRepository.loadNextPage(cursor, tags)`
|
|
- `nextCursor: String?` in UI state; null = no more pages
|
|
- `loadMore()` called when LazyColumn nears the end
|
|
- Pull-to-refresh via `refresh()` which resets to first page
|
|
|
|
## Date Grouping
|
|
- `DateGroupHeader` renders section labels: Today, Yesterday, Previous 7 Days, Previous 30 Days, month-year
|
|
- Conversations are flattened into a sealed `ConversationListItem` (DateHeader | ConvoItem)
|
|
|
|
## Search
|
|
- `ConversationSearchBar` with 500ms debounce (via coroutine delay)
|
|
- `onSearchQueryChanged()` cancels previous search job, waits 500ms, calls `SearchRepository.search()`
|
|
- When search is active, normal pagination is disabled (`hasMore = false`)
|
|
- Clear search restores normal conversation list
|
|
|
|
## Tags
|
|
- `TagFilterBar` displays `FilterChip` per tag (multi-select toggle)
|
|
- `TagPicker` for assigning tags to a conversation
|
|
- Tags observed via `TagRepository.observeTags()` (Room-backed Flow); `SAVED_TAG` and `count == 0` tags are filtered out in the ViewModel
|
|
- `toggleTag()` / `clearTagFilter()` reload conversations with new filter
|
|
|
|
## CRUD Actions (via `ConversationActions` component)
|
|
| Action | API | Notes |
|
|
|--------|-----|-------|
|
|
| Rename | `POST /api/convos/update` | Inline rename, max 100 chars |
|
|
| Archive | `POST /api/convos/archive` | `{ conversationId, isArchived: true }` |
|
|
| Delete | `DELETE /api/convos` | Confirmation dialog required |
|
|
| Duplicate | `POST /api/convos/duplicate` | Navigates to new conversation |
|
|
| Fork | `POST /api/convos/fork` | From message context menu in chat, not here |
|
|
| Share | `POST /api/share` | Only if `sharedLinksEnabled` in server config |
|
|
|
|
## Export / Import
|
|
- `ConversationExporter` supports `ExportFormat.JSON` and `ExportFormat.MARKDOWN`
|
|
- Export is client-side: fetches messages, serializes locally, emits `ExportReady` event
|
|
- `ExportFormatPicker` component for format selection
|
|
- `ConversationImporter` parses JSON (LibreChat/ChatGPT format) via `POST /api/convos/import`
|
|
- File I/O uses SAF (Storage Access Framework)
|
|
|
|
## Events
|
|
`ConversationListEvent` sealed interface for one-shot UI events: `ShareLinkCopied`, `NavigateToConversation`, `ShowError`, `ExportReady`, `ImportSuccess`
|