feat: rename the 1:1 flow to "DM" (#42)

The button that starts a one-to-one conversation read as "New chat" directly beneath the "Chat" pane title, so the name of the conversation type collided with the name of the application; calling that type a DM tells the two conversation types apart at a glance.

"conversation" stays the umbrella term covering both DMs and groups, and "Chat" stays the product name, so the pane header and the backend status strings keep their wording.
This commit is contained in:
osmaczko
2026-07-21 13:03:08 +02:00
committed by GitHub
parent 46e7f84049
commit 7d504eeadf
15 changed files with 21 additions and 21 deletions
+3 -3
View File
@@ -20,8 +20,8 @@ Core functionality:
- **Identity** — on startup, initializes a chat identity and displays the user's ID in the status bar
- **Addresses** — show your address (the **Show My Address** button) and share it with others to let them start a conversation with you
- **New conversations** — paste another user's address to open a private (1:1) conversation
- **Group conversations** — start a group with **Group**, then invite peers by address from the members panel (see below)
- **Direct messages** — paste another user's address into **New DM** to open a private (1:1) conversation
- **Group conversations** — start a group with **New group**, then invite peers by address from the members panel (see below)
- **Messaging** — send and receive messages in real-time over the Logos network
- **Chat lifecycle** — auto-initializes and starts on launch; status shown in the bottom bar
@@ -76,7 +76,7 @@ port (`chat_c` / `60002`, and so on).
Each node joins the `logos.test` Waku fleet and publishes its key package during
init, so this needs internet and ~5-20s per window to reach **Online**. Then
share one window's address (**Show My Address**) and paste it into another
(**New** for a 1:1, or **Group** then the members panel for a group). For
(**New DM** for a 1:1, or **New group** then the members panel for a group). For
the full walkthrough with screenshots, and the scripted drivers that automate it
(`doctests/exchange/run-exchange.sh` for a two-party exchange,
`doctests/group/run-group.sh` for a three-party group), see
Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 33 KiB

+2 -2
View File
@@ -39,7 +39,7 @@ CHAT_MODULE_INSTANCE_PATH=~/.local/share/chat_b CHAT_MODULE_DELIVERY_PORT=60001
Both nodes join the `logos.test` Waku fleet (and publish their key packages to
the key-package registry during `init`), so this needs internet and ~5-20s to
reach **Online**. Then, in window A tap **Show My Address** and copy it; in
window B tap **New chat** and paste A's address — the conversation opens on B's
window B tap **New DM** and paste A's address — the conversation opens on B's
side and the invite goes out. Once it appears in A's list (she has joined),
send the first message from B; reply from either side.
@@ -67,7 +67,7 @@ lets a peer open a conversation with her.
### 2. Bob opens a conversation and sends the first message
Bob pastes Alice's address into **New chat**. The backend calls
Bob pastes Alice's address into **New DM**. The backend calls
`create_conversation(address)`, which fetches her key package from the registry
and sends her the cryptographic invite; the new thread opens empty. Once Alice
has joined (the conversation shows up in her list), Bob sends the first
+1 -1
View File
@@ -5,7 +5,7 @@ release: ""
intro: |
A conversation takes two people: one shares their address, the other pastes
it into **New chat**, sends a first message, and the reply flows back. That
it into **New DM**, sends a first message, and the reply flows back. That
round-trip spans **two** app instances, so the single-window walkthrough in
*The Logos Chat UI* tutorial can't express it — and neither can the doc-test
`ui_test` driver on its own, which works against one instance and can only set
+2 -2
View File
@@ -4,7 +4,7 @@ project_name: logos-chat-ui
release: ""
intro: |
A group conversation goes further than a 1:1 chat: one person creates it,
A group conversation goes further than a DM: one person creates it,
invites others by address, and every message fans out to the whole roster with
the sender attributed. That spans **three** app instances and grows by
membership commits over the live network — more than the single-window
@@ -22,7 +22,7 @@ what_you_build: "A verified three-member, end-to-end-encrypted group conversatio
what_you_learn:
- "How the `group` app forms a three-member group and fans a message out to it, headless over the live network"
- "How the group UI adds a members pane and per-message sender attribution over a 1:1 chat"
- "How the group UI adds a members pane and per-message sender attribution over a DM"
- "Why a multi-window group needs a dedicated runner rather than the single-instance `ui_test` driver"
prerequisites:
+2 -2
View File
@@ -64,7 +64,7 @@ sections:
The window is a two-pane messenger:
- **Left:** your conversations, a `Chat` header with a connection dot,
a **New chat** button (start a conversation from someone's address), and a
a **New DM** button (start a DM from someone's address), and a
**Show My Address** button (share your own).
- **Right:** the message thread for the selected conversation and a
composer (the **Send** button).
@@ -105,7 +105,7 @@ sections:
text: |
`init` returned right away and the delivery node bootstrapped in
the background. When it connects, the `delivery_state_changed`
event lands and the status flips to **Online** — the **New chat**
event lands and the status flips to **Online** — the **New DM**
and **Show My Address** buttons enable.
screenshot: "connected.png"
- name: "Open your address"
+1 -1
View File
@@ -7,7 +7,7 @@
// logos-qt-mcp inspector protocol to all three instances: Alice creates a group,
// invites Bob and Carol by address, waits for the roster to converge, then sends
// one message that fans out to both — exercising the members pane and the
// per-message sender attribution the group UI adds over a 1:1 chat. Launch and
// per-message sender attribution the group UI adds over a DM. Launch and
// teardown of the three apps is handled by run-group.sh; this script attaches to
// the three inspector ports it is given.
//
+4 -4
View File
@@ -277,12 +277,12 @@ void ChatBackend::createConversation(QString peerAddress)
return;
}
setStatusMessage(QStringLiteral("Creating new conversation..."));
setStatusMessage(QStringLiteral("Creating DM..."));
const LogosResult res = modules().chat_module.create_conversation(peerAddress);
if (!res.success) {
const QString reason = res.getError<QString>();
setStatusMessage(QStringLiteral("Failed to create conversation: ") + reason);
emit error(QStringLiteral("Failed to create conversation: ") + reason);
setStatusMessage(QStringLiteral("Failed to create DM: ") + reason);
emit error(QStringLiteral("Failed to create DM: ") + reason);
}
// The conversation_created event surfaces via the push subscription — the
// appliers handle the UI side from there.
@@ -594,7 +594,7 @@ QString ChatBackend::fallbackDisplayName(const QString& convoId, const QString&
bool isGroup)
{
const QString label = peerLabel.isEmpty() ? convoId.left(8) : peerLabel;
return (isGroup ? QStringLiteral("Group ") : QStringLiteral("Chat ")) + label;
return (isGroup ? QStringLiteral("Group ") : QStringLiteral("DM ")) + label;
}
QString ChatBackend::shortSenderLabel(const QString& sender)
+4 -4
View File
@@ -47,14 +47,14 @@ Rectangle {
id: newButton
implicitWidth: 84
implicitHeight: 30
//: Button that starts a new one-to-one conversation
text: qsTr("New chat")
//: Button that starts a new direct message (1:1) conversation
text: qsTr("New DM")
enabled: root.online
onClicked: root.newConversationRequested()
Layout.alignment: Qt.AlignVCenter
LogosToolTip {
text: qsTr("New conversation")
text: qsTr("New direct message")
placement: LogosToolTip.Bottom
visible: newButton.hovered
}
@@ -106,7 +106,7 @@ Rectangle {
anchors.centerIn: parent
width: parent.width - 2 * Theme.spacing.large
visible: convList.count === 0
text: root.online ? qsTr("No conversations yet. Start one with New chat, or share your address so someone can reach you.") : qsTr("Waiting for connection...")
text: root.online ? qsTr("No conversations yet. Start one with New DM, or share your address so someone can reach you.") : qsTr("Waiting for connection...")
}
}
+1 -1
View File
@@ -91,7 +91,7 @@ Rectangle {
anchors.centerIn: parent
width: parent.width - 2 * Theme.spacing.large
visible: threadList.count === 0
text: root.hasConversation ? qsTr("No messages yet") : root.hasConversations ? qsTr("Select a conversation to start chatting") : qsTr("No conversations yet. Start one with New chat or New group in the sidebar.")
text: root.hasConversation ? qsTr("No messages yet") : root.hasConversations ? qsTr("Select a conversation to start chatting") : qsTr("No conversations yet. Start one with New DM or New group in the sidebar.")
}
}
+1 -1
View File
@@ -16,7 +16,7 @@ LogosDialog {
// Emitted with the trimmed address when the user confirms a non-empty entry.
signal addressEntered(string address)
title: qsTr("New Conversation")
title: qsTr("New DM")
modal: true
focus: true
closePolicy: Popup.CloseOnEscape