feat(nav): send existing users through support bot CR flow

When the Status support bot is not yet a contact, clicking its primary
navigation icon opens the standard contact request modal.

Once a request is pending or the bot is a contact, the icon opens the
existing 1:1 conversation. Keep the button badge-free.
This commit is contained in:
Jonathan Rainville
2026-08-26 09:27:40 -04:00
parent 3eacde1080
commit c55e929316
15 changed files with 83 additions and 7 deletions
@@ -134,6 +134,7 @@ Item {
controlUnderTest.statusSupportBotEnabled = true
tryCompare(supportBotButton, "visible", true)
compare(supportBotButton.showBadge, false)
}
function test_activity_center_button() {
@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.71529 12.8445C11.4492 12.7467 12.536 13.1441 14.27 13.0456C14.6697 13.0253 15.0668 12.9663 15.4545 12.8679C15.4856 12.8591 15.5241 12.8491 15.5551 12.8396C15.3018 16.0127 13.0227 18.8173 9.93697 18.9939L9.5815 18.9997C7.871 18.9561 6.25427 17.9013 6.06197 16.24L6.04732 16.0661C5.97317 14.6487 6.79092 13.5899 8.23873 13.115L8.53658 13.028C8.82575 12.9523 9.12026 12.8988 9.41744 12.8679L9.71529 12.8445ZM11.8442 14.3376C11.1375 14.2626 10.5343 14.2001 9.79342 14.2419L9.78951 14.2429C9.48598 14.259 9.18445 14.3056 8.89107 14.3825L8.88716 14.3835C8.2896 14.5382 7.9296 14.7884 7.72896 15.031C7.54103 15.2582 7.42292 15.56 7.44478 15.99C7.48942 16.8104 8.41618 17.6785 9.85689 17.5964L10.0629 17.5788C11.6801 17.3966 13.0908 16.1745 13.7622 14.4597C13.0299 14.4629 12.4039 14.397 11.8442 14.3376ZM14.0688 5.00657C15.9633 4.89867 17.8559 6.05588 17.9585 7.9343C18.0414 9.44624 17.1016 10.5499 15.4692 10.9734C15.0837 11.0744 14.6886 11.1359 14.2905 11.157C12.5565 11.2547 11.4697 10.8569 9.7358 10.9538C9.33605 10.9741 8.93902 11.0341 8.55123 11.1325C8.5202 11.1421 8.48171 11.1523 8.45064 11.1618C8.70403 7.98865 10.983 5.18298 14.0688 5.00657ZM16.56 8.01047C16.5151 7.19009 15.5888 6.32222 14.1489 6.40403C12.447 6.50132 10.9427 7.75301 10.2426 9.53977C10.9755 9.53702 11.6017 9.60414 12.1616 9.66379C12.868 9.73906 13.4707 9.80125 14.2114 9.75949H14.2163C14.5198 9.74343 14.8204 9.69574 15.1137 9.61887L15.1176 9.61789C15.716 9.46268 16.0777 9.21235 16.2788 8.96946C16.4671 8.74187 16.5835 8.43947 16.56 8.01047Z" fill="#4360DF"/>
<path d="M21.5005 12C21.5005 3.5 20.5005 2.5 12.0005 2.5C3.50049 2.5 2.50049 3.5 2.50049 12C2.50049 20.5 3.50049 21.5 12.0005 21.5C20.5005 21.5 21.5005 20.5 21.5005 12ZM22.9009 12C22.9009 14.128 22.84 15.8921 22.5903 17.3125C22.3386 18.7446 21.8694 19.9865 20.9282 20.9277C19.987 21.8689 18.7451 22.3381 17.313 22.5898C15.8926 22.8395 14.1285 22.9004 12.0005 22.9004C9.87246 22.9004 8.10841 22.8395 6.68799 22.5898C5.25585 22.3381 4.01395 21.8689 3.07275 20.9277C2.13156 19.9865 1.66235 18.7446 1.41064 17.3125C1.16101 15.8921 1.1001 14.128 1.1001 12C1.1001 9.87197 1.16101 8.10792 1.41064 6.6875C1.66235 5.25536 2.13156 4.01346 3.07275 3.07227C4.01395 2.13107 5.25585 1.66187 6.68799 1.41016C8.10841 1.16053 9.87246 1.09961 12.0005 1.09961C14.1285 1.09961 15.8926 1.16053 17.313 1.41016C18.7451 1.66187 19.987 2.13107 20.9282 3.07227C21.8694 4.01346 22.3386 5.25536 22.5903 6.6875C22.84 8.10792 22.9009 9.87197 22.9009 12Z" fill="#4360DF"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+1
View File
@@ -258,6 +258,7 @@
<file>icons/speech.svg</file>
<file>icons/star-icon-outline.svg</file>
<file>icons/star-icon.svg</file>
<file>icons/status-flat.svg</file>
<file>icons/status-logo-icon.png</file>
<file>icons/status-update.svg</file>
<file>icons/status.svg</file>
+42 -3
View File
@@ -262,6 +262,20 @@ Item {
readonly property var allContacsAdaptor: contactInfrastructureLoader.item?.allContactsAdaptor ?? null
readonly property var contactsModelAdaptor: contactInfrastructureLoader.item?.contactsAdaptor ?? null
Loader {
id: supportBotContactLoader
active: appMain.mainReady
&& appMain.featureFlagsStore.statusSupportBotEnabled
&& !!appMain.contactsStore
&& !!d.supportBotPublicKey
sourceComponent: ContactModelEntry {
publicKey: d.supportBotPublicKey
contactsModel: appMain.contactsStore.contactsModel
onPopulateContactDetailsRequested: appMain.contactsStore.populateContactDetails(d.supportBotPublicKey)
}
}
Loader {
id: toastsManagerLoader
active: appMain.mainReady
@@ -914,6 +928,24 @@ Item {
id: d
readonly property string myPublicKey: userProfile.pubKey // we need it very soon, before all the stores
readonly property string supportBotPublicKey: {
const chatKey = Constants.statusSupportBotChatKey
return chatKey && appMain.utilsStore ? appMain.utilsStore.getDecompressedPk(chatKey) : ""
}
readonly property var supportBotContact: supportBotContactLoader.status === Loader.Ready
? supportBotContactLoader.item : null
readonly property bool supportBotConversationAvailable: {
const contact = d.supportBotContact
if (!contact?.available)
return false
const details = contact.contactDetails
return details.isBlocked
|| details.isContact
|| details.contactRequestState === Constants.ContactRequestState.Mutual
|| details.contactRequestState === Constants.ContactRequestState.Sent
|| details.contactRequestState === Constants.ContactRequestState.Received
}
property bool messagingNetworkDisconnected: !appMain.rootStore.isMessagingNetworkConnected
property bool doShowMessagingBanner: false
@@ -2645,12 +2677,19 @@ Item {
onSettingsRequested: d.openSettingsRoot()
onSupportBotChatRequested: {
const publicKey = appMain.utilsStore.getDecompressedPk(Constants.statusSupportBotChatKey)
if (!publicKey) {
if (!d.supportBotPublicKey) {
console.warn("Unable to resolve the Status support bot chat key")
return
}
appMain.contactsStore.joinPrivateChat(publicKey)
if (d.supportBotConversationAvailable) {
appMain.contactsStore.joinPrivateChat(d.supportBotPublicKey)
return
}
Global.openContactRequestPopupWithDefaultMessage(
d.supportBotPublicKey,
null,
qsTr("Send the Status Team bot a contact request to get useful Status tips, important updates, and share your feedback, ideas, or issues directly with the Status team.")
)
}
onItemActivated: function(sectionType, sectionId) {
+6 -2
View File
@@ -357,9 +357,13 @@ QtObject {
}, cb)
}
function openContactRequestPopup(publicKey, cb) {
function openContactRequestPopup(publicKey, cb, defaultMessage = "") {
const contactEntry = getContactModelEntry(publicKey)
const properties = { publicKey, contactDetails: contactEntry.contactDetails }
const properties = {
publicKey,
contactDetails: contactEntry.contactDetails,
defaultMessage: defaultMessage || ""
}
openPopup(sendContactRequestPopupComponent, properties, cb)
}
+1 -1
View File
@@ -280,7 +280,7 @@ Control {
Layout.alignment: Qt.AlignHCenter
visible: root.statusSupportBotEnabled
icon.name: "chatbot"
icon.name: "status-flat"
tooltipText: qsTr("Status Help Bot")
thirdpartyServicesEnabled: root.thirdpartyServicesEnabled
@@ -183,6 +183,9 @@ Loader {
function onOpenContactRequestPopup(publicKey, cb) {
root.invoke(() => root.item.openContactRequestPopup(publicKey, cb))
}
function onOpenContactRequestPopupWithDefaultMessage(publicKey, cb, defaultMessage) {
root.invoke(() => root.item.openContactRequestPopup(publicKey, cb, defaultMessage))
}
function onOpenReviewContactRequestPopup(publicKey, cb) {
root.invoke(() => root.item.openReviewContactRequestPopup(publicKey, cb))
}
+4
View File
@@ -1830,6 +1830,10 @@ from &quot;%1&quot; to &quot;%2&quot;</source>
<source>This channel no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Send the Status Team bot a contact request to get useful Status tips, important updates, and share your feedback, ideas, or issues directly with the Status team.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invite People</source>
<translation type="unfinished"></translation>
+4
View File
@@ -1842,6 +1842,10 @@ z &quot;%1&quot; na &quot;%2&quot;</translation>
<source>This channel no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Send the Status Team bot a contact request to get useful Status tips, important updates, and share your feedback, ideas, or issues directly with the Status team.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invite People</source>
<translation>Pozvat lidi</translation>
+4
View File
@@ -1831,6 +1831,10 @@ de &quot;%1&quot; a &quot;%2&quot;</translation>
<source>This channel no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Send the Status Team bot a contact request to get useful Status tips, important updates, and share your feedback, ideas, or issues directly with the Status team.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invite People</source>
<translation>Invitar personas</translation>
+4
View File
@@ -1831,6 +1831,10 @@ de &quot;%1&quot; à &quot;%2&quot;</translation>
<source>This channel no longer exists</source>
<translation>Ce canal nexiste plus</translation>
</message>
<message>
<source>Send the Status Team bot a contact request to get useful Status tips, important updates, and share your feedback, ideas, or issues directly with the Status team.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invite People</source>
<translation>Inviter des personnes</translation>
+4
View File
@@ -1815,6 +1815,10 @@ from &quot;%1&quot; to &quot;%2&quot;</source>
<source>This channel no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Send the Status Team bot a contact request to get useful Status tips, important updates, and share your feedback, ideas, or issues directly with the Status team.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invite People</source>
<translation> </translation>
@@ -21,12 +21,15 @@ CommonContactDialog {
property string labelText: qsTr("Why should they accept your contact request?")
property string challengeText: qsTr("Write a short message telling them who you are...")
property string buttonText: qsTr("Send contact request")
property string defaultMessage: ""
signal accepted(string message)
title: qsTr("Send contact request")
onAboutToShow: {
if (root.defaultMessage)
messageInput.text = root.defaultMessage
messageInput.input.edit.forceActiveFocus()
// (request) update from mailserver
+1
View File
@@ -34,6 +34,7 @@ QtObject {
signal openMarkAsIDVerifiedPopup(string publicKey, var cb)
signal openRemoveIDVerificationDialog(string publicKey, var cb)
signal openContactRequestPopup(string publicKey, var cb)
signal openContactRequestPopupWithDefaultMessage(string publicKey, var cb, string defaultMessage)
signal openReviewContactRequestPopup(string publicKey, var cb)
signal markAsUntrustedRequested(string publicKey)
signal removeContactRequested(string publicKey)