feat(chat): mark outgoing messages that fail to send
Outgoing echoes were recorded optimistically regardless of whether the broadcast was actually submitted. Now broadcastChatMemos / broadcastChatMemosLite return whether the send was submitted (false on immediate failures: not connected, no spendable z-address, or a lite send already in progress), and the echo records a ChatDelivery status (Sent / Failed). The Chat tab shows a "not sent" marker in the error color on failed messages. The status persists in the DB (backward- compatible: old rows deserialize as Sent). (A later async failure — an opid that fails after submission — still surfaces via the existing send-progress notification; only the submit gate is reflected here.) Also removes the now-unused chat_readonly_note string (the composer replaced the read-only footer). Test: delivery status round-trips through the DB. Verified: Linux + Windows build with chat ON, ctest 100%, hygiene clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -226,14 +226,16 @@ void RenderChatTab(App* app)
|
||||
for (const auto& m : messages) {
|
||||
const bool outgoing = (m.direction == chat::ChatDirection::Outgoing);
|
||||
const bool request = (m.kind == chat::ChatMessageKind::ContactRequest);
|
||||
// Meta line: who + time (+ request tag).
|
||||
const bool failed = outgoing && m.delivery == chat::ChatDelivery::Failed;
|
||||
// Meta line: who + time (+ request tag / failed marker).
|
||||
std::string who = outgoing ? std::string(TR("chat_you")) : sel->peerName;
|
||||
const std::string when = formatTime(m.timestamp);
|
||||
if (!when.empty()) who += " " + when;
|
||||
if (request) who += " [" + std::string(TR("chat_contact_request")) + "]";
|
||||
if (failed) who += " · " + std::string(TR("chat_send_failed"));
|
||||
ImGui::PushFont(metaFont);
|
||||
ImGui::PushStyleColor(ImGuiCol_Text,
|
||||
outgoing ? material::Primary() : material::OnSurfaceMedium());
|
||||
failed ? material::Error() : (outgoing ? material::Primary() : material::OnSurfaceMedium()));
|
||||
ImGui::TextUnformatted(who.c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopFont();
|
||||
|
||||
Reference in New Issue
Block a user