2022-09-15 16:34:41 +00:00
|
|
|
import QtQuick 2.14
|
|
|
|
import QtQuick.Controls 2.14
|
2021-07-29 19:20:49 +00:00
|
|
|
import QtGraphicalEffects 1.13
|
2022-09-15 16:34:41 +00:00
|
|
|
import Qt.labs.qmlmodels 1.0
|
2022-07-13 12:29:38 +00:00
|
|
|
|
|
|
|
import StatusQ.Core 0.1
|
|
|
|
import StatusQ.Controls 0.1
|
|
|
|
|
2022-09-15 16:34:41 +00:00
|
|
|
import SortFilterProxyModel 0.2
|
|
|
|
|
2021-10-27 21:27:49 +00:00
|
|
|
import shared 1.0
|
2021-12-21 20:52:17 +00:00
|
|
|
import shared.popups 1.0
|
2022-07-26 14:23:45 +00:00
|
|
|
import shared.views.chat 1.0
|
|
|
|
|
2022-07-13 12:29:38 +00:00
|
|
|
import utils 1.0
|
2021-10-18 10:56:05 +00:00
|
|
|
|
2021-10-01 15:58:36 +00:00
|
|
|
import "../views"
|
|
|
|
import "../panels"
|
2021-09-28 15:04:06 +00:00
|
|
|
|
2021-05-28 17:35:21 +00:00
|
|
|
Popup {
|
2022-07-26 14:23:45 +00:00
|
|
|
id: root
|
|
|
|
|
2022-09-12 10:06:26 +00:00
|
|
|
enum ActivityCategory {
|
2021-05-28 17:35:21 +00:00
|
|
|
All,
|
2022-09-12 10:06:26 +00:00
|
|
|
Admin,
|
2021-05-28 17:35:21 +00:00
|
|
|
Mentions,
|
|
|
|
Replies,
|
2022-09-12 10:06:26 +00:00
|
|
|
ContactRequests,
|
|
|
|
IdentityVerification,
|
|
|
|
Transactions,
|
|
|
|
Membership,
|
|
|
|
System
|
2021-05-28 17:35:21 +00:00
|
|
|
}
|
2022-09-12 10:06:26 +00:00
|
|
|
property int currentActivityCategory: ActivityCenterPopup.ActivityCategory.All
|
2021-06-11 19:50:52 +00:00
|
|
|
property bool hasMentions: false
|
|
|
|
property bool hasReplies: false
|
2021-07-27 17:59:01 +00:00
|
|
|
// property bool hasContactRequests: false
|
2021-05-28 17:35:21 +00:00
|
|
|
|
2021-06-10 15:15:38 +00:00
|
|
|
property bool hideReadNotifications: false
|
2021-10-01 15:58:36 +00:00
|
|
|
property var store
|
2022-01-13 21:41:43 +00:00
|
|
|
property var chatSectionModule
|
2022-07-26 14:23:45 +00:00
|
|
|
property var messageContextMenu: MessageContextMenuView {
|
|
|
|
store: root.store
|
|
|
|
reactionModel: root.store.emojiReactionsModel
|
|
|
|
}
|
2021-06-10 15:15:38 +00:00
|
|
|
|
2022-09-15 16:34:41 +00:00
|
|
|
readonly property int unreadNotificationsCount : root.store.unreadNotificationsCount
|
|
|
|
|
|
|
|
function filterActivityCategories(notificationType) {
|
|
|
|
switch (root.currentActivityCategory) {
|
|
|
|
case ActivityCenterPopup.ActivityCategory.All:
|
|
|
|
return true
|
|
|
|
case ActivityCenterPopup.ActivityCategory.Mentions:
|
|
|
|
return notificationType === Constants.activityCenterNotificationTypeMention
|
|
|
|
case ActivityCenterPopup.ActivityCategory.Replies:
|
|
|
|
return notificationType === Constants.activityCenterNotificationTypeReply
|
|
|
|
case ActivityCenterPopup.ActivityCategory.ContactRequests:
|
|
|
|
return notificationType === Constants.activityCenterNotificationTypeContactRequest
|
|
|
|
default:
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onOpened: {
|
|
|
|
root.store.loadMoreNotifications()
|
|
|
|
Global.popupOpened = true
|
|
|
|
}
|
|
|
|
onClosed: {
|
|
|
|
Global.popupOpened = false
|
|
|
|
}
|
2022-05-19 12:33:17 +00:00
|
|
|
|
2021-07-29 19:20:49 +00:00
|
|
|
modal: false
|
2021-05-28 17:35:21 +00:00
|
|
|
|
|
|
|
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
|
|
|
parent: Overlay.overlay
|
2021-07-29 19:20:49 +00:00
|
|
|
|
2021-09-08 02:11:51 +00:00
|
|
|
dim: true
|
2022-08-05 13:57:06 +00:00
|
|
|
Overlay.modeless: MouseArea {
|
|
|
|
onClicked: activityCenter.close()
|
|
|
|
}
|
2021-09-08 02:11:51 +00:00
|
|
|
|
2021-05-28 17:35:21 +00:00
|
|
|
width: 560
|
|
|
|
background: Rectangle {
|
|
|
|
color: Style.current.background
|
|
|
|
radius: Style.current.radius
|
2021-07-29 19:20:49 +00:00
|
|
|
layer.enabled: true
|
|
|
|
layer.effect: DropShadow {
|
|
|
|
verticalOffset: 3
|
|
|
|
radius: Style.current.radius
|
|
|
|
samples: 15
|
|
|
|
fast: true
|
|
|
|
cached: true
|
|
|
|
color: Style.current.dropShadow
|
|
|
|
}
|
2021-05-28 17:35:21 +00:00
|
|
|
}
|
2022-07-26 14:23:45 +00:00
|
|
|
x: Global.applicationWindow.width - root.width - Style.current.halfPadding
|
2021-05-28 17:35:21 +00:00
|
|
|
padding: 0
|
|
|
|
|
2021-10-01 15:58:36 +00:00
|
|
|
ActivityCenterPopupTopBarPanel {
|
2021-05-28 17:35:21 +00:00
|
|
|
id: activityCenterTopBar
|
2022-09-12 10:06:26 +00:00
|
|
|
width: parent.width
|
2022-07-26 14:23:45 +00:00
|
|
|
hasReplies: root.hasReplies
|
|
|
|
hasMentions: root.hasMentions
|
|
|
|
hideReadNotifications: root.hideReadNotifications
|
2022-09-12 10:06:26 +00:00
|
|
|
currentActivityCategory: root.currentActivityCategory
|
|
|
|
onCategoryTriggered: {
|
|
|
|
root.currentActivityCategory = category;
|
2021-10-01 15:58:36 +00:00
|
|
|
}
|
|
|
|
onMarkAllReadClicked: {
|
2022-07-26 14:23:45 +00:00
|
|
|
errorText = root.store.activityCenterModuleInst.markAllActivityCenterNotificationsRead()
|
2021-10-01 15:58:36 +00:00
|
|
|
}
|
2021-05-28 17:35:21 +00:00
|
|
|
}
|
|
|
|
|
2022-09-15 16:34:41 +00:00
|
|
|
StatusListView {
|
|
|
|
id: listView
|
2022-09-12 10:06:26 +00:00
|
|
|
anchors.left: parent.left
|
|
|
|
anchors.right: parent.right
|
2021-05-28 17:35:21 +00:00
|
|
|
anchors.top: activityCenterTopBar.bottom
|
2021-06-11 17:41:59 +00:00
|
|
|
anchors.bottom: parent.bottom
|
2022-09-15 16:34:41 +00:00
|
|
|
anchors.margins: Style.current.smallPadding
|
2021-05-28 17:35:21 +00:00
|
|
|
|
2022-09-15 16:34:41 +00:00
|
|
|
model: SortFilterProxyModel {
|
|
|
|
sourceModel: root.store.activityCenterList
|
2021-05-28 19:01:46 +00:00
|
|
|
|
2022-09-15 16:34:41 +00:00
|
|
|
filters: ExpressionFilter { expression: filterActivityCategories(model.notificationType) }
|
|
|
|
}
|
2021-06-11 17:41:59 +00:00
|
|
|
|
2022-09-15 16:34:41 +00:00
|
|
|
delegate: DelegateChooser {
|
|
|
|
role: "notificationType"
|
2021-05-28 17:35:21 +00:00
|
|
|
|
2022-09-15 16:34:41 +00:00
|
|
|
DelegateChoice {
|
|
|
|
roleValue: Constants.activityCenterNotificationTypeMention
|
|
|
|
ActivityNotificationMention { store: root.store; notification: model }
|
2021-05-28 17:35:21 +00:00
|
|
|
}
|
2022-09-15 16:34:41 +00:00
|
|
|
DelegateChoice {
|
|
|
|
roleValue: Constants.activityCenterNotificationTypeReply
|
|
|
|
ActivityNotificationReply { store: root.store; notification: model }
|
|
|
|
}
|
|
|
|
DelegateChoice {
|
|
|
|
roleValue: Constants.activityCenterNotificationTypeContactRequest
|
|
|
|
ActivityNotificationContactRequest { store: root.store; notification: model }
|
2021-06-08 18:05:49 +00:00
|
|
|
}
|
2021-06-11 17:41:59 +00:00
|
|
|
}
|
2021-05-28 17:35:21 +00:00
|
|
|
}
|
|
|
|
}
|
2022-09-15 16:34:41 +00:00
|
|
|
|
|
|
|
// // TODO: replace with StatusListView
|
|
|
|
// StatusScrollView {
|
|
|
|
// id: scrollView
|
|
|
|
// anchors.left: parent.left
|
|
|
|
// anchors.right: parent.right
|
|
|
|
// anchors.top: activityCenterTopBar.bottom
|
|
|
|
// anchors.topMargin: 13
|
|
|
|
// anchors.bottom: parent.bottom
|
|
|
|
// anchors.bottomMargin: Style.current.smallPadding
|
|
|
|
// width: parent.width
|
|
|
|
|
|
|
|
// ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
|
|
|
|
|
|
|
|
// Column {
|
|
|
|
// id: notificationsContainer
|
|
|
|
// width: scrollView.availableWidth
|
|
|
|
// spacing: 0
|
|
|
|
|
|
|
|
// Repeater {
|
|
|
|
// model: notifDelegateList
|
|
|
|
// }
|
|
|
|
|
|
|
|
// DelegateModelGeneralized {
|
|
|
|
// id: notifDelegateList
|
|
|
|
|
|
|
|
// lessThan: [
|
|
|
|
// function(left, right) { return left.timestamp > right.timestamp }
|
|
|
|
// ]
|
|
|
|
|
|
|
|
// model: root.store.activityCenterList
|
|
|
|
|
|
|
|
// delegate: Item {
|
|
|
|
// id: notificationDelegate
|
|
|
|
// width: parent.availableWidth
|
|
|
|
// height: notifLoader.active ? childrenRect.height : 0
|
|
|
|
|
|
|
|
// property int idx: DelegateModel.itemsIndex
|
|
|
|
|
|
|
|
// Component.onCompleted: {
|
|
|
|
// switch (model.notificationType) {
|
|
|
|
// case Constants.activityCenterNotificationTypeMention:
|
|
|
|
// if (!hasMentions) {
|
|
|
|
// hasMentions = true
|
|
|
|
// }
|
|
|
|
// break
|
|
|
|
|
|
|
|
// case Constants.activityCenterNotificationTypeReply:
|
|
|
|
// if (!hasReplies) {
|
|
|
|
// hasReplies = true
|
|
|
|
// }
|
|
|
|
// break
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// Loader {
|
|
|
|
// property int previousNotificationIndex: {
|
|
|
|
// if (notificationDelegate.idx === 0) {
|
|
|
|
// return 0
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // This is used in order to have access to the previous message and determine the timestamp
|
|
|
|
// // we can't rely on the index because the sequence of messages is not ordered on the nim side
|
|
|
|
// if (notificationDelegate.idx < notifDelegateList.items.count - 1) {
|
|
|
|
// return notifDelegateList.items.get(notificationDelegate.idx - 1).model.index
|
|
|
|
// }
|
|
|
|
// return -1;
|
|
|
|
// }
|
|
|
|
// readonly property string previousNotificationTimestamp: notificationDelegate.idx === 0 ? "" :
|
|
|
|
// root.store.activityCenterList.getNotificationData(previousNotificationIndex, "timestamp")
|
|
|
|
// onPreviousNotificationTimestampChanged: {
|
|
|
|
// root.store.messageStore.prevMsgTimestamp = previousNotificationTimestamp;
|
|
|
|
// }
|
|
|
|
|
|
|
|
// id: notifLoader
|
|
|
|
// anchors.top: parent.top
|
|
|
|
// active: !!sourceComponent
|
|
|
|
// width: parent.width
|
|
|
|
// sourceComponent: {
|
|
|
|
// switch (model.notificationType) {
|
|
|
|
// case Constants.activityCenterNotificationTypeOneToOne:
|
|
|
|
// case Constants.activityCenterNotificationTypeMention:
|
|
|
|
// case Constants.activityCenterNotificationTypeReply: return messageNotificationComponent
|
|
|
|
// case Constants.activityCenterNotificationTypeGroupRequest: return groupRequestNotificationComponent
|
|
|
|
// default: return null
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// onLoaded: {
|
|
|
|
// if (model.notificationType === Constants.activityCenterNotificationTypeReply ||
|
|
|
|
// model.notificationType === Constants.activityCenterNotificationTypeGroupRequest) {
|
|
|
|
// item.previousNotificationIndex = Qt.binding(() => notifLoader.previousNotificationIndex);
|
|
|
|
// item.previousNotificationTimestamp = Qt.binding(() => notifLoader.previousNotificationTimestamp);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// Component {
|
|
|
|
// id: messageNotificationComponent
|
|
|
|
|
|
|
|
// ActivityCenterMessageComponentView {
|
|
|
|
// id: activityCenterMessageView
|
|
|
|
// store: root.store
|
|
|
|
// acCurrentActivityCategory: root.currentActivityCategory
|
|
|
|
// chatSectionModule: root.chatSectionModule
|
|
|
|
// messageContextMenu: root.messageContextMenu
|
|
|
|
// hideReadNotifications: root.hideReadNotifications
|
|
|
|
// Connections {
|
|
|
|
// target: root
|
|
|
|
// onOpened: activityCenterMessageView.reevaluateItemBadge()
|
|
|
|
// }
|
|
|
|
// onActivityCenterClose: {
|
|
|
|
// root.close();
|
|
|
|
// }
|
|
|
|
// Component.onCompleted: {
|
|
|
|
// activityCenterMessageView.reevaluateItemBadge()
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// Component {
|
|
|
|
// id: groupRequestNotificationComponent
|
|
|
|
|
|
|
|
// ActivityCenterGroupRequest {
|
|
|
|
// store: root.store
|
|
|
|
// hideReadNotifications: root.hideReadNotifications
|
|
|
|
// acCurrentActivityCategoryAll: root.currentActivityCategory === ActivityCenter.ActivityCategory.All
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// Item {
|
|
|
|
// visible: root.store.activityCenterModuleInst.hasMoreToShow
|
|
|
|
// width: parent.width
|
|
|
|
// height: visible ? showMoreBtn.height + showMoreBtn.anchors.topMargin : 0
|
|
|
|
// StatusButton {
|
|
|
|
// id: showMoreBtn
|
|
|
|
// text: qsTr("Show more")
|
|
|
|
// anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
// anchors.top: parent.top
|
|
|
|
// anchors.topMargin: Style.current.smallPadding
|
|
|
|
// onClicked: root.store.activityCenterModuleInst.loadMoreNotifications()
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|