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.
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 33 KiB |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
//
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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...")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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.")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||