Data model / backend (migration 1720000000007): - video_note as a first-class MediaRef kind — round video messages are explicit, no filename heuristics; mime-validated, own push label. - Delete for me (message_hidden tombstones) alongside delete-for-everyone; group owners can moderate-delete any message in their groups. - Clear history / delete chat per user (cleared_up_to_seq + hidden_at on conversation_members); deleted chats return on new activity. - Manual chat folders + per-folder pins (chat_folders, chat_folder_items, chat_pins; folderId null = "All" tab). Every mutation returns and broadcasts a full snapshot on the personal channel (folders.update), syncing devices. New events: message.hidden, conversation.cleared, conversation.hidden. - Shared-media listing: GET /conversations/:id/media?tab=media|files|voice. Web: - Right-click context menus (shared ContextMenu/ConfirmDialog): messages get a reactions row + copy/edit/delete; chats get pin/unpin per folder scope, folder membership, clear, delete; folder tabs get rename/delete. - Telegram-style editing in the composer (banner + prefill), hover toolbar removed; delete dialog offers for-me / for-everyone per permissions. - Folder tabs in the rail with per-folder pinned-first ordering. - Profile panel (avatar, name, last seen, username, Message button) with shared media tabs; back arrow on mobile. - Settings page (avatar, display name edit, theme, log out); contacts as a separate page; Telegram-style mobile bottom nav (Contacts|Chats|Settings) with total-unread badge. - Chat scroll: opens at newest (ResizeObserver keeps bottom pinned while media loads), per-chat position memory, jump-to-newest button. - Responsive single-pane layout under 900px. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFRyKxkKEjfAgpXygzoNiD |
||
|---|---|---|
| .. | ||
| db | ||
| modules | ||
| plugins | ||
| routes | ||
| shared | ||
| app.ts | ||
| config.ts | ||
| server.ts | ||
| worker.ts | ||