feat(chat): read-only Chat sidebar tab (Phase 3)
Add the first user-visible HushChat surface: a Chat tab in the sidebar with a
two-pane, read-only conversation view — a conversation list on the left and the
selected thread on the right — reading from the App-owned ChatService store.
- New src/ui/windows/chat_tab.{h,cpp} (RenderChatTab(App*), mirroring the
Contacts tab). Conversations are sorted by most-recent activity; peer
z-addresses resolve to contact names via the address book when known; each
message shows sender + timestamp + wrapped body, with a contact-request tag
and a read-only footer (composing arrives in a later phase). Empty states
cover "wallet locked / identity not ready" and "no conversations yet".
- Sidebar wiring: NavPage::Chat + registry entry (static_assert stays balanced),
NavPageSurface + GetNavIconMD (ICON_MD_CHAT), dispatch in app.cpp, trace/sweep
page names, and App::chatService() accessor. The tab is gated on the new
WalletUiSurface::Chat, which returns DRAGONX_ENABLE_CHAT != 0 — so it only
appears in chat-enabled builds and is hidden (and unreachable) by default.
- i18n: English defaults for the chat nav label + hint strings.
Verified: Linux + Windows(mingw) build with chat ON, ctest 100%, hygiene clean;
caches restored to the OFF default. The screenshot sweep now includes the Chat
tab (sweepPageName "chat") for per-theme visual review.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,7 @@ enum class NavPage {
|
||||
Receive,
|
||||
History,
|
||||
Contacts,
|
||||
Chat,
|
||||
// --- separator ---
|
||||
Mining,
|
||||
Market,
|
||||
@@ -53,6 +54,7 @@ inline const NavItem kNavItems[] = {
|
||||
{ "Receive", NavPage::Receive, nullptr, "receive", nullptr },
|
||||
{ "History", NavPage::History, nullptr, "history", nullptr },
|
||||
{ "Contacts", NavPage::Contacts, nullptr, "contacts", nullptr },
|
||||
{ "Chat", NavPage::Chat, nullptr, "chat", nullptr },
|
||||
{ "Mining", NavPage::Mining, "TOOLS", "mining", "tools" },
|
||||
{ "Market", NavPage::Market, nullptr, "market", nullptr },
|
||||
{ "Console", NavPage::Console, "ADVANCED","console", "advanced" },
|
||||
@@ -81,6 +83,7 @@ inline wallet::WalletUiSurface NavPageSurface(NavPage page)
|
||||
case NavPage::Receive: return wallet::WalletUiSurface::Receive;
|
||||
case NavPage::History: return wallet::WalletUiSurface::History;
|
||||
case NavPage::Contacts: return wallet::WalletUiSurface::Contacts;
|
||||
case NavPage::Chat: return wallet::WalletUiSurface::Chat;
|
||||
case NavPage::Mining: return wallet::WalletUiSurface::Mining;
|
||||
case NavPage::Market: return wallet::WalletUiSurface::Market;
|
||||
case NavPage::Console: return wallet::WalletUiSurface::Console;
|
||||
@@ -107,6 +110,7 @@ inline const char* GetNavIconMD(NavPage page)
|
||||
case NavPage::Receive: return ICON_MD_CALL_RECEIVED;
|
||||
case NavPage::History: return ICON_MD_HISTORY;
|
||||
case NavPage::Contacts: return ICON_MD_CONTACTS;
|
||||
case NavPage::Chat: return ICON_MD_CHAT;
|
||||
case NavPage::Mining: return ICON_MD_CONSTRUCTION;
|
||||
case NavPage::Market: return ICON_MD_TRENDING_UP;
|
||||
case NavPage::Console: return ICON_MD_TERMINAL;
|
||||
|
||||
Reference in New Issue
Block a user