status-desktop/ui/app/AppLayouts/Chat/popups/community/CommunityDetailPopup.qml

224 lines
7.2 KiB
QML
Raw Normal View History

2020-12-11 20:29:46 +00:00
import QtQuick 2.12
import QtQuick.Controls 2.3
2020-12-11 20:29:46 +00:00
import QtQuick.Dialogs 1.3
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Components 0.1
import StatusQ.Controls 0.1
import StatusQ.Popups 0.1
import utils 1.0
2020-12-11 20:29:46 +00:00
StatusModal {
id: root
property var store
property QtObject community: root.store.communitiesModuleInst.observedCommunity
2020-12-11 20:29:46 +00:00
property string communityId: community.id
property string name: community.name
property string description: community.description
2020-12-11 20:38:10 +00:00
property int access: community.access
property string source: community.image
property int nbMembers: community.members.count
property bool ensOnly: community.ensOnly
property bool canJoin: community.canJoin
property bool canRequestAccess: community.canRequestAccess
fix(Communities): don't crash on rejoin attempt Prior to this commit there was a scenario where the application would crash due a memory bug when attempting to (re)join a community. The scenario is as follows: 1. User creates or has been invited to community with `ON_REQUEST` permissions 2. User leaves community 3. User decides to rejoin, so she selects the community she's been part of and hits the "Join" button At this point Status Desktop would send a new `RequestToJoin` request, as the community has a corresponding permissions setting. This would then result in an `already a member` error in status-go, because status-go checks whether the requestee is already part of the members list of the community. The error isn't handled inside Status Desktop which causes a crash because we're trying to access data in memory that doesn't exist. Why is this happening? While this might be unexpected, when leaving a community (as done on step 2 of the mentioned scenario), users don't actually lose membership but simply "unsubscribe" from all channels in the community in question and their `joined` flag is set to `false`. From that point on, re-joininng a community is done by sending a `JoinCommunity` request (instead of `RequestToJoin`), which will then set the `joined` flag to `true` and doesn't actually check the membership in the database. This commit ensures we're calling the right API by checking whether not only whether the community is needs `ON _REQUEST` permissions, but also whether the user isn't already a member of it. Fixes #2017
2021-03-09 11:50:45 +00:00
property bool isMember: community.isMember
property string communityColor: community.color || Style.current.blue
2020-12-11 20:29:46 +00:00
header.title: name
header.subTitle: {
let subTitle = ""
switch(access) {
case Constants.communityChatPublicAccess:
subTitle = qsTr("Public community");
break;
2022-02-09 09:43:23 +00:00
case Constants.communityChatInvitationOnlyAccess:
subTitle = qsTr("Invitation only community");
break;
2022-02-09 09:43:23 +00:00
case Constants.communityChatOnRequestAccess:
subTitle = qsTr("On request community");
break;
default:
subTitle = qsTr("Unknown community");
break;
}
if (ensOnly) {
subTitle += qsTr(" - ENS only")
}
return subTitle
}
contentItem: Column {
width: root.width
Item {
height: childrenRect.height + 8
width: parent.width - 32
anchors.horizontalCenter: parent.horizontalCenter
StatusBaseText {
id: description
anchors.top: parent.top
anchors.topMargin: 16
text: root.description
font.pixelSize: 15
color: Theme.palette.directColor1
wrapMode: Text.WordWrap
width: parent.width
textFormat: Text.PlainText
}
2020-12-11 20:29:46 +00:00
StatusIcon {
id: statusIcon
anchors.top: description.bottom
anchors.topMargin: 16
anchors.left: parent.left
icon: "tiny/contact"
width: 16
color: Theme.palette.directColor1
}
2020-12-11 20:29:46 +00:00
StatusBaseText {
text: qsTr("%1 members").arg(nbMembers)
font.pixelSize: 15
font.weight: Font.Medium
color: Theme.palette.directColor1
anchors.left: statusIcon.right
anchors.leftMargin: 2
anchors.verticalCenter: statusIcon.verticalCenter
2020-12-11 20:38:10 +00:00
}
2020-12-11 20:29:46 +00:00
}
StatusModalDivider {
topPadding: 8
bottomPadding: 8
}
2020-12-11 20:29:46 +00:00
Item {
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width - 32
height: 34
StatusBaseText {
text: qsTr("Channels")
anchors.bottom: parent.bottom
anchors.bottomMargin: 4
font.pixelSize: 15
color: Theme.palette.baseColor1
}
2020-12-11 20:29:46 +00:00
}
StatusScrollView {
width: root.width
height: 300
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
ListView {
id: chatList
anchors.fill: parent
model: community.chats
boundsBehavior: Flickable.StopAtBounds
delegate: StatusListItem {
anchors.horizontalCenter: parent.horizontalCenter
title: "#" + model.name
subTitle: model.description
icon.isLetterIdenticon: true
icon.background.color: root.communityColor
}
}
2020-12-11 20:29:46 +00:00
}
}
2020-12-11 20:38:10 +00:00
2020-12-11 20:29:46 +00:00
leftButtons: [
StatusRoundButton {
2020-12-11 20:29:46 +00:00
id: backButton
icon.name: "arrow-right"
icon.height: 16
icon.width: 20
rotation: 180
2020-12-11 20:29:46 +00:00
onClicked: {
root.close()
2020-12-11 20:29:46 +00:00
}
}
]
2020-12-11 20:29:46 +00:00
rightButtons: [
2020-12-11 20:29:46 +00:00
StatusButton {
property bool isPendingRequest: {
if (access !== Constants.communityChatOnRequestAccess) {
return false
}
2022-01-28 20:44:52 +00:00
return false
// Not Refactored Yet
// return root.store.chatsModelInst.communities.isCommunityRequestPending(root.communityId)
}
text: {
// Not Refactored Yet
// if (root.ensOnly && !root.store.profileModelInst.profile.ensVerified) {
// return qsTr("Membership requires an ENS username")
// }
if (root.canJoin) {
return qsTr("Join %1").arg(root.name);
}
if (isPendingRequest) {
return qsTr("Pending")
}
switch(root.access) {
case Constants.communityChatPublicAccess: return qsTr("Join %1").arg(root.name);
case Constants.communityChatInvitationOnlyAccess: return qsTr("You need to be invited");
case Constants.communityChatOnRequestAccess: return qsTr("Request to join %1").arg(root.name);
default: return qsTr("Unknown community");
}
}
enabled: {
// Not Refactored Yet
// if (root.ensOnly && !root.store.profileModelInst.profile.ensVerified) {
// return false
// }
if (root.access === Constants.communityChatInvitationOnlyAccess || isPendingRequest) {
return false
}
if (canJoin) {
return true
}
return true
}
2020-12-11 20:29:46 +00:00
onClicked: {
// Not Refactored Yet
let error
2022-01-28 20:44:52 +00:00
if (access === Constants.communityChatOnRequestAccess &&
!root.community.amISectionAdmin
&& !root.isMember) {
// TODO refactor
return
// error = root.store.chatsModelInst.communities.requestToJoinCommunity(root.communityId, userProfile.name)
// if (!error) {
// enabled = false
// text = qsTr("Pending")
// }
} else {
error = root.store.communitiesModuleInst.joinCommunity(root.communityId, root.store.userProfileInst.ensName)
}
if (error) {
joiningError.text = error
return joiningError.open()
}
root.close()
2020-12-11 20:29:46 +00:00
}
}
]
MessageDialog {
id: joiningError
title: qsTr("Error joining the community")
icon: StandardIcon.Critical
standardButtons: StandardButton.Ok
2020-12-11 20:29:46 +00:00
}
}