- Matrix: interactive device verification (SAS emoji flow), recovery-key
backup/restore, membership announcement moderation, member/room avatars,
power-level-aware moderation menu, and an encryption lock indicator on
the composer - verified live with two independent devices.
- Replace the single combined join panel with a dedicated page per
protocol (IrcJoinPanel/MatrixJoinPanel/DiscordJoinPanel), routed by
whichever account the "+" button was clicked for rather than listing
every account in one expandable page.
- Discord: friends list (Online/All, click-to-DM, add-friend, matches
READY's relationships + live PRESENCE_UPDATE), create-a-server, and
join-by-invite alongside the existing DM-by-ID flow.
- Discord: an expired attachment-link fallback ("Open in Discord") for
scrollback media whose signed cdn.discordapp.com URL has lapsed -
Discord's own /attachments/refresh-urls re-sign endpoint hard-rejects
this backend's user-token requests, confirmed live, so this opens the
real message instead of showing a broken embed.
- Discord: detect gateway close code 4004 (revoked token) as a distinct
ConnState::AuthFailed instead of retrying a dead credential forever;
the Accounts pane shows a clear "needs login" state that routes
straight to a fresh QR login, which upserts the same account id in
place (no lost buffers/scrollback).
- Fix the unread-DM pinned-buffer flash never reliably triggering: an
implicit property binding computed via nested closures over two
separate properties wasn't consistently re-evaluated by QML's
dependency tracker; replaced with an explicit recompute function called
at every actual mutation point.
- Fix ChatBarWidget.qml's pill double-padding against BasePill's own
padding.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
58 lines
1.5 KiB
QML
58 lines
1.5 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
import qs.Common
|
|
import qs.Widgets
|
|
|
|
// IRC's own join/DM page - the "+" button in BufferList.qml's bottom bar
|
|
// routes here when the currently active buffer's account is an IRC one
|
|
// (see ChatView.qml's joinPanelAccount). IRC's own mechanism: JOIN by
|
|
// channel name, or /msg someone by nick - no account picker here since
|
|
// this page always targets whichever single account the "+" was clicked
|
|
// for, matching the bottom bar's own "whose voice are you using right
|
|
// now" semantics.
|
|
ColumnLayout {
|
|
id: root
|
|
|
|
property var account: null
|
|
|
|
signal joinRequested(string channel)
|
|
signal messageRequested(string nick)
|
|
|
|
spacing: Theme.spacingS
|
|
|
|
StyledText {
|
|
Layout.fillWidth: true
|
|
text: "Join a channel"
|
|
color: Theme.surfaceVariantText
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
}
|
|
|
|
DankTextField {
|
|
Layout.fillWidth: true
|
|
placeholderText: "#channel"
|
|
onAccepted: {
|
|
if (text)
|
|
root.joinRequested(text);
|
|
text = "";
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
Layout.topMargin: Theme.spacingS
|
|
Layout.fillWidth: true
|
|
text: "Message someone"
|
|
color: Theme.surfaceVariantText
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
}
|
|
|
|
DankTextField {
|
|
Layout.fillWidth: true
|
|
placeholderText: "nick"
|
|
onAccepted: {
|
|
if (text)
|
|
root.messageRequested(text);
|
|
text = "";
|
|
}
|
|
}
|
|
}
|