feat(chat): explain the no-identity state and why a send is stuck

- Chat tab no longer shows "Unlock your wallet" for every missing-identity
  case. A new App::chatIdentityStatus() distinguishes Locked (real),
  Preparing (unlocked, deriving the identity) and Unavailable (view-only or a
  legacy wallet with no exportable secret — correctly latched). Each gets its
  own icon + message, and the Unavailable prompt points at Back up / Migrate
  instead of telling the user to unlock an already-unlocked wallet.
- A chat message that sits queued ("Sending") because the wallet is offline or
  has no shielded funds for the fee now surfaces the reason (throttled, after a
  short dwell), wiring the ready-made chat_toast_not_connected /
  chat_toast_need_funds strings that were never shown. The send stays queued
  and goes out when the condition clears.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-10-17 16:41:30 -05:00
co-authored by Claude Opus 4.8
parent 6efe3c0f5c
commit e27d88eca4
4 changed files with 73 additions and 3 deletions
+3
View File
@@ -225,6 +225,9 @@ void I18n::loadBuiltinEnglish()
strings_["contacts"] = "Contacts";
strings_["chat"] = "Chat";
strings_["chat_locked_hint"] = "Unlock your wallet to load your chats.";
strings_["chat_preparing_hint"] = "Setting up secure chat…";
strings_["chat_unavailable_hint"] = "Chat isn't available for this wallet";
strings_["chat_unavailable_sub"] = "Chat needs a wallet with a spending key. A view-only wallet can't chat; a legacy wallet may need to be migrated to a seed phrase first (Settings → Back up & data).";
strings_["chat_empty_hint"] = "No conversations yet. Messages you receive will appear here.";
strings_["chat_you"] = "You";
strings_["chat_contact_request"] = "contact request";