status-desktop/ui/app/mainui/activitycenter/popups/ActivityCenterPopup.qml

293 lines
11 KiB
QML
Raw Normal View History

import QtQuick 2.14
import QtQuick.Controls 2.14
import QtGraphicalEffects 1.13
import Qt.labs.qmlmodels 1.0
import StatusQ.Core 0.1
import StatusQ.Controls 0.1
import SortFilterProxyModel 0.2
import shared 1.0
import shared.popups 1.0
import shared.views.chat 1.0
import utils 1.0
import "../views"
import "../panels"
Popup {
id: root
enum ActivityCategory {
All,
Admin,
Mentions,
Replies,
ContactRequests,
IdentityVerification,
Transactions,
Membership,
System
}
property int currentActivityCategory: ActivityCenterPopup.ActivityCategory.All
property bool hasMentions: false
property bool hasReplies: false
// property bool hasContactRequests: false
property bool hideReadNotifications: false
property var store
property var chatSectionModule
property var messageContextMenu: MessageContextMenuView {
store: root.store
reactionModel: root.store.emojiReactionsModel
}
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
}
modal: false
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
parent: Overlay.overlay
dim: true
Overlay.modeless: MouseArea {
onClicked: activityCenter.close()
}
width: 560
background: Rectangle {
color: Style.current.background
radius: Style.current.radius
layer.enabled: true
layer.effect: DropShadow {
verticalOffset: 3
radius: Style.current.radius
samples: 15
fast: true
cached: true
color: Style.current.dropShadow
}
}
x: Global.applicationWindow.width - root.width - Style.current.halfPadding
padding: 0
ActivityCenterPopupTopBarPanel {
id: activityCenterTopBar
width: parent.width
hasReplies: root.hasReplies
hasMentions: root.hasMentions
hideReadNotifications: root.hideReadNotifications
currentActivityCategory: root.currentActivityCategory
onCategoryTriggered: {
root.currentActivityCategory = category;
}
onMarkAllReadClicked: {
errorText = root.store.activityCenterModuleInst.markAllActivityCenterNotificationsRead()
}
}
StatusListView {
id: listView
anchors.left: parent.left
anchors.right: parent.right
anchors.top: activityCenterTopBar.bottom
anchors.bottom: parent.bottom
anchors.margins: Style.current.smallPadding
model: SortFilterProxyModel {
sourceModel: root.store.activityCenterList
filters: ExpressionFilter { expression: filterActivityCategories(model.notificationType) }
}
delegate: DelegateChooser {
role: "notificationType"
DelegateChoice {
roleValue: Constants.activityCenterNotificationTypeMention
ActivityNotificationMention { store: root.store; notification: model }
}
DelegateChoice {
roleValue: Constants.activityCenterNotificationTypeReply
ActivityNotificationReply { store: root.store; notification: model }
}
DelegateChoice {
roleValue: Constants.activityCenterNotificationTypeContactRequest
ActivityNotificationContactRequest { store: root.store; notification: model }
}
}
}
}
// // 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()
// }
// }
// }
// }
// }