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 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 sourceModel: root.rootStore.contactsModel 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() } }