status-desktop/ui/app/AppLayouts/Chat/views/private/MembersSelectorBase.qml

90 lines
2.9 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import StatusQ 0.1
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import AppLayouts.Chat.stores 1.0 as ChatStores
import AppLayouts.Chat.panels 1.0
import utils 1.0
import shared.controls.delegates 1.0
import SortFilterProxyModel 0.2
InlineSelectorPanel {
id: root
property ChatStores.RootStore rootStore
property alias contactsModel: suggestionsModel.sourceModel
readonly property int membersLimit: 20 // see: https://github.com/status-im/status-mobile/issues/13066
property bool limitReached: model.count >= membersLimit
property string pastedChatKey: ""
label.text: qsTr("To:")
warningLabel.text: qsTr("%1 USER LIMIT REACHED").arg(membersLimit)
warningLabel.visible: limitReached
suggestionsModel: SortFilterProxyModel {
id: suggestionsModel
function searchPredicate(displayName, localNickname, nameAlias) {
return displayName.toLowerCase().includes(root.edit.text.toLowerCase()) ||
localNickname.toLowerCase().includes(root.edit.text.toLowerCase()) ||
(!displayName && nameAlias.toLowerCase().includes(root.edit.text.toLowerCase()))
}
function notAMemberPredicate(pubKey) {
for(var i = 0; i < model.count; i++) {
var item = model.get(i)
if(item.pubKey === pubKey) return false
}
return true
}
filters: [
FastExpressionFilter {
enabled: root.edit.text !== "" && root.pastedChatKey == ""
expression: {
root.edit.text // ensure expression is reevaluated when edit.text changes
return suggestionsModel.searchPredicate(model.displayName, model.localNickname, model.alias)
}
expectedRoles: ["displayName", "localNickname", "alias"]
},
FastExpressionFilter {
expression: {
root.model.count // ensure expression is reevaluated when members model changes
return suggestionsModel.notAMemberPredicate(model.pubKey)
}
expectedRoles: ["pubKey"]
},
ValueFilter {
roleName: "pubKey"
value: root.pastedChatKey
enabled: root.pastedChatKey !== ""
}
]
sorters: StringSorter {
roleName: "preferredDisplayName"
caseSensitivity: Qt.CaseInsensitive
}
}
suggestionsDelegate: ContactListItemDelegate {
highlighted: ListView.isCurrentItem
height: root.suggestionsDelegateSize.height
width: root.suggestionsDelegateSize.width
onClicked: root.entryAccepted(this)
}
Component.onCompleted: {
root.edit.forceActiveFocus()
}
}