The current text has invited a lot of confusion around how notifications work in NeoChat, because it mentions "push notifications". Some users take it to mean that somehow the notifications appear in the background, but that's only supported if built with KUnifiedPush. To make it super clear, let's change the description dynamically based on whether: 1. NeoChat is built with KUnifiedPush support. 2. We were able to connect with the KUnifiedPush daemon and your server has a push gateway.
194 lines
6.4 KiB
QML
194 lines
6.4 KiB
QML
// SPDX-FileCopyrightText: 2022 James Graham <james.h.graham@protonmail.com>
|
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
|
|
import QtQuick
|
|
import QtQuick.Controls as QQC2
|
|
import QtQuick.Layouts
|
|
|
|
import org.kde.kirigami as Kirigami
|
|
import org.kde.kirigamiaddons.formcard as FormCard
|
|
import org.kde.kitemmodels
|
|
|
|
import org.kde.neochat
|
|
|
|
FormCard.FormCardPage {
|
|
id: root
|
|
|
|
required property NeoChatConnection connection
|
|
|
|
title: i18nc("@title:window", "Notifications")
|
|
|
|
property PushRuleModel pushRuleModel: PushRuleModel {
|
|
connection: root.connection
|
|
}
|
|
|
|
FormCard.FormCard {
|
|
Layout.topMargin: Kirigami.Units.largeSpacing * 4
|
|
FormCard.FormCheckDelegate {
|
|
text: i18n("Enable notifications for this account")
|
|
description: {
|
|
if (connection.pushNotificationsAvailable) {
|
|
if (connection.enablePushNotifications) {
|
|
return i18n("Notifications can appear even when NeoChat isn't running.");
|
|
} else {
|
|
return i18n("Push notifications are available but could not be enabled.");
|
|
}
|
|
} else {
|
|
return i18n("Notifications will only appear when NeoChat is running.");
|
|
}
|
|
}
|
|
checked: root.pushRuleModel.globalNotificationsEnabled
|
|
enabled: root.pushRuleModel.globalNotificationsSet
|
|
onToggled: {
|
|
root.pushRuleModel.globalNotificationsEnabled = checked;
|
|
}
|
|
}
|
|
}
|
|
|
|
FormCard.FormHeader {
|
|
title: i18nc("@title:group", "Room Notifications")
|
|
}
|
|
FormCard.FormCard {
|
|
Repeater {
|
|
model: KSortFilterProxyModel {
|
|
sourceModel: root.pushRuleModel
|
|
filterRowCallback: function (source_row, source_parent) {
|
|
let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole);
|
|
return sectionRole == PushRuleSection.Room;
|
|
}
|
|
}
|
|
|
|
delegate: ruleDelegate
|
|
}
|
|
}
|
|
|
|
FormCard.FormHeader {
|
|
title: i18nc("@title:group", "@Mentions")
|
|
}
|
|
FormCard.FormCard {
|
|
Repeater {
|
|
model: KSortFilterProxyModel {
|
|
sourceModel: root.pushRuleModel
|
|
filterRowCallback: function (source_row, source_parent) {
|
|
let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole);
|
|
return sectionRole == PushRuleSection.Mentions;
|
|
}
|
|
}
|
|
|
|
delegate: ruleDelegate
|
|
}
|
|
}
|
|
|
|
FormCard.FormHeader {
|
|
title: i18nc("@title:group", "Keywords")
|
|
}
|
|
FormCard.FormCard {
|
|
Repeater {
|
|
model: KSortFilterProxyModel {
|
|
sourceModel: root.pushRuleModel
|
|
|
|
filterRowCallback: function (source_row, source_parent) {
|
|
let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole);
|
|
return sectionRole == PushRuleSection.Keywords;
|
|
}
|
|
}
|
|
|
|
delegate: ruleDelegate
|
|
}
|
|
FormCard.AbstractFormDelegate {
|
|
Layout.fillWidth: true
|
|
|
|
contentItem: RowLayout {
|
|
Kirigami.ActionTextField {
|
|
id: keywordAddField
|
|
|
|
Layout.fillWidth: true
|
|
|
|
placeholderText: i18n("Keyword…")
|
|
enabled: NotificationsManager.keywordNotificationAction !== PushRuleAction.Unknown
|
|
|
|
rightActions: Kirigami.Action {
|
|
icon.name: "edit-clear"
|
|
visible: keywordAddField.text.length > 0
|
|
onTriggered: {
|
|
keywordAddField.text = "";
|
|
}
|
|
}
|
|
|
|
onAccepted: {
|
|
root.pushRuleModel.addKeyword(keywordAddField.text);
|
|
keywordAddField.text = "";
|
|
}
|
|
}
|
|
QQC2.Button {
|
|
id: addButton
|
|
|
|
text: i18n("Add keyword")
|
|
Accessible.name: text
|
|
icon.name: "list-add"
|
|
display: QQC2.AbstractButton.IconOnly
|
|
enabled: NotificationsManager.keywordNotificationAction !== PushRuleAction.Unknown
|
|
|
|
onClicked: {
|
|
root.pushRuleModel.addKeyword(keywordAddField.text);
|
|
keywordAddField.text = "";
|
|
}
|
|
|
|
QQC2.ToolTip {
|
|
text: addButton.text
|
|
delay: Kirigami.Units.toolTipDelay
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
FormCard.FormHeader {
|
|
title: i18nc("@title:group", "Invites")
|
|
}
|
|
FormCard.FormCard {
|
|
Repeater {
|
|
model: KSortFilterProxyModel {
|
|
sourceModel: root.pushRuleModel
|
|
filterRowCallback: function (source_row, source_parent) {
|
|
let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole);
|
|
return sectionRole == PushRuleSection.Invites;
|
|
}
|
|
}
|
|
|
|
delegate: ruleDelegate
|
|
}
|
|
}
|
|
|
|
FormCard.FormHeader {
|
|
title: i18nc("@title:group", "Unknown")
|
|
visible: unknownModel.rowCount() > 0
|
|
}
|
|
FormCard.FormCard {
|
|
visible: unknownModel.rowCount() > 0
|
|
|
|
Repeater {
|
|
model: KSortFilterProxyModel {
|
|
id: unknownModel
|
|
sourceModel: root.pushRuleModel
|
|
filterRowCallback: function (source_row, source_parent) {
|
|
let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole);
|
|
return sectionRole == PushRuleSection.Unknown;
|
|
}
|
|
}
|
|
|
|
delegate: ruleDelegate
|
|
}
|
|
}
|
|
|
|
property Component ruleDelegate: Component {
|
|
id: ruleDelegate
|
|
NotificationRuleItem {
|
|
onDeleteRule: {
|
|
root.pushRuleModel.removeKeyword(id);
|
|
}
|
|
onNotificatonActionChanged: action => root.pushRuleModel.setPushRuleAction(id, action)
|
|
}
|
|
}
|
|
}
|