2024-10-15 19:26:12 +00:00
|
|
|
import QtQuick 2.15
|
|
|
|
import QtQuick.Controls 2.15
|
|
|
|
import QtQuick.Layouts 1.15
|
2021-09-28 15:04:06 +00:00
|
|
|
|
2022-07-13 12:29:38 +00:00
|
|
|
import StatusQ.Core 0.1
|
2022-08-23 14:57:37 +00:00
|
|
|
import StatusQ.Controls 0.1
|
|
|
|
import StatusQ.Components 0.1
|
|
|
|
import StatusQ.Core.Theme 0.1
|
2022-07-13 12:29:38 +00:00
|
|
|
|
2021-09-28 15:04:06 +00:00
|
|
|
import utils 1.0
|
2021-10-27 21:27:49 +00:00
|
|
|
import shared.status 1.0
|
2021-12-08 21:20:43 +00:00
|
|
|
import shared.stores 1.0
|
2021-03-31 19:14:09 +00:00
|
|
|
// TODO move Contact into shared to get rid of that import
|
2022-03-08 18:49:33 +00:00
|
|
|
import AppLayouts.Chat.controls 1.0
|
2024-05-22 08:13:39 +00:00
|
|
|
import AppLayouts.stores 1.0 as AppLayoutStores
|
2021-02-08 12:21:23 +00:00
|
|
|
|
2022-12-01 23:04:28 +00:00
|
|
|
import SortFilterProxyModel 0.2
|
|
|
|
|
2021-02-08 12:21:23 +00:00
|
|
|
Item {
|
|
|
|
id: root
|
2022-01-04 12:06:05 +00:00
|
|
|
|
2024-05-22 08:13:39 +00:00
|
|
|
property AppLayoutStores.RootStore rootStore
|
2024-10-28 10:40:58 +00:00
|
|
|
|
|
|
|
property var contactsModel
|
2022-09-16 08:30:08 +00:00
|
|
|
property string communityId
|
2022-01-04 12:06:05 +00:00
|
|
|
|
2021-02-08 12:21:23 +00:00
|
|
|
property string filterText: ""
|
|
|
|
property bool expanded: true
|
2021-03-31 19:14:09 +00:00
|
|
|
property bool showCheckbox: false
|
2021-05-17 09:56:55 +00:00
|
|
|
property bool hideCommunityMembers: false
|
2021-03-31 19:14:09 +00:00
|
|
|
property var pubKeys: ([])
|
2022-07-25 13:22:09 +00:00
|
|
|
|
2022-07-25 15:07:19 +00:00
|
|
|
readonly property alias count: contactListView.count
|
|
|
|
|
2021-02-08 12:21:23 +00:00
|
|
|
signal contactClicked(var contact)
|
|
|
|
|
|
|
|
function matchesAlias(name, filter) {
|
|
|
|
let parts = name.split(" ")
|
|
|
|
return parts.some(p => p.startsWith(filter))
|
|
|
|
}
|
|
|
|
|
2022-07-25 15:07:19 +00:00
|
|
|
implicitWidth: contactListView.implicitWidth + contactListView.margins
|
2022-07-25 13:22:09 +00:00
|
|
|
implicitHeight: visible ? Math.min(contactListView.contentHeight, (expanded ? 320 : 192)) : 0
|
|
|
|
|
2022-07-14 11:03:36 +00:00
|
|
|
StatusListView {
|
|
|
|
id: contactListView
|
2022-10-25 18:39:21 +00:00
|
|
|
objectName: "ExistingContacts_ListView"
|
2021-02-08 12:21:23 +00:00
|
|
|
anchors.fill: parent
|
2022-07-25 15:07:19 +00:00
|
|
|
rightMargin: 0
|
2022-08-23 14:57:37 +00:00
|
|
|
leftMargin: 0
|
2024-10-15 19:26:12 +00:00
|
|
|
spacing: Theme.padding
|
2021-02-08 12:21:23 +00:00
|
|
|
|
2022-12-01 23:04:28 +00:00
|
|
|
model: SortFilterProxyModel {
|
2024-10-28 10:40:58 +00:00
|
|
|
sourceModel: root.contactsModel
|
2022-12-01 23:04:28 +00:00
|
|
|
filters: [
|
|
|
|
ExpressionFilter {
|
|
|
|
expression: {
|
|
|
|
root.filterText
|
|
|
|
root.hideCommunityMembers
|
|
|
|
root.communityId
|
|
|
|
|
|
|
|
if (!model.isContact || model.isBlocked)
|
|
|
|
return false
|
|
|
|
|
|
|
|
const filter = root.filterText.toLowerCase()
|
|
|
|
const filterAccepted = root.filterText === ""
|
|
|
|
|| root.matchesAlias(model.alias.toLowerCase(), filter)
|
|
|
|
|| model.displayName.toLowerCase().includes(filter)
|
|
|
|
|| model.ensName.toLowerCase().includes(filter)
|
|
|
|
|| model.localNickname.toLowerCase().includes(filter)
|
|
|
|
|| model.pubKey.toLowerCase().includes(filter)
|
|
|
|
|
|
|
|
if (!filterAccepted)
|
|
|
|
return false
|
|
|
|
|
|
|
|
return !root.hideCommunityMembers ||
|
|
|
|
!root.rootStore.communityHasMember(root.communityId, model.pubKey)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
2022-08-23 14:57:37 +00:00
|
|
|
delegate: StatusMemberListItem {
|
2024-11-05 08:43:50 +00:00
|
|
|
objectName: "statusMemberListItem-%1".arg(model.compressedPubKey)
|
2022-07-25 13:22:09 +00:00
|
|
|
width: contactListView.availableWidth
|
2024-10-29 12:54:11 +00:00
|
|
|
pubKey: model.isEnsVerified ? "" : model.compressedPubKey
|
2022-07-14 11:03:36 +00:00
|
|
|
isContact: model.isContact
|
2022-08-23 14:57:37 +00:00
|
|
|
status: model.onlineStatus
|
|
|
|
height: visible ? implicitHeight : 0
|
2024-09-06 13:11:47 +00:00
|
|
|
color: hovered ? Theme.palette.baseColor2 : "transparent"
|
2022-12-05 09:56:44 +00:00
|
|
|
nickName: model.localNickname
|
|
|
|
userName: ProfileUtils.displayName("", model.ensName, model.displayName, model.alias)
|
2024-09-06 13:11:47 +00:00
|
|
|
icon.name: model.icon
|
|
|
|
icon.width: 40
|
|
|
|
icon.height: 40
|
|
|
|
icon.color: Utils.colorForColorId(model.colorId)
|
2023-04-19 16:48:57 +00:00
|
|
|
ringSettings.ringSpecModel: model.colorHash
|
2022-08-23 14:57:37 +00:00
|
|
|
|
|
|
|
onClicked: {
|
2022-07-25 13:22:09 +00:00
|
|
|
root.contactClicked(model);
|
2021-02-08 12:21:23 +00:00
|
|
|
}
|
2022-08-23 14:57:37 +00:00
|
|
|
|
|
|
|
StatusCheckBox {
|
|
|
|
id: contactCheckbox
|
2024-11-05 08:43:50 +00:00
|
|
|
objectName: "contactCheckbox-%1".arg(model.displayName)
|
2022-08-23 14:57:37 +00:00
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
anchors.right: parent.right
|
|
|
|
checked: root.pubKeys.indexOf(model.pubKey) > -1
|
|
|
|
onClicked: {
|
|
|
|
root.contactClicked(model);
|
|
|
|
}
|
|
|
|
}
|
2021-02-08 12:21:23 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|