216 lines
6.8 KiB
QML
216 lines
6.8 KiB
QML
import QtQuick 2.14
|
|
import QtQuick.Controls 2.14
|
|
import QtQuick.Layouts 1.14
|
|
|
|
import utils 1.0
|
|
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Core.Theme 0.1
|
|
import StatusQ.Controls 0.1
|
|
import StatusQ.Components 0.1
|
|
|
|
import shared.panels 1.0
|
|
import shared.popups 1.0
|
|
|
|
Control {
|
|
id: root
|
|
|
|
implicitWidth: d.invitedCommunity || d.loading ? 270 /*by design*/ : 0
|
|
padding: 1
|
|
|
|
property var store
|
|
property string communityId
|
|
|
|
QtObject {
|
|
id: d
|
|
|
|
property var invitedCommunity
|
|
|
|
readonly property string communityName: !!d.invitedCommunity ? d.invitedCommunity.name : ""
|
|
readonly property string communityDescription: !!d.invitedCommunity ? d.invitedCommunity.description : ""
|
|
readonly property string communityImage: !!d.invitedCommunity ? d.invitedCommunity.image : ""
|
|
readonly property string communityColor: !!d.invitedCommunity ? d.invitedCommunity.color : ""
|
|
readonly property int communityNbMembers: !!d.invitedCommunity ? d.invitedCommunity.nbMembers : 0
|
|
readonly property bool communityVerified: false //!!d.invitedCommunity ? d.invitedCommunity.verified : false TODO: add this to the community object if we should support verified communities
|
|
readonly property bool communityJoined: !!d.invitedCommunity ? d.invitedCommunity.joined : false
|
|
readonly property bool communitySpectated: !!d.invitedCommunity ? d.invitedCommunity.spectated : false
|
|
|
|
readonly property int margin: 12
|
|
readonly property int radius: Style.current.padding
|
|
|
|
readonly property bool loading: !d.invitedCommunity
|
|
|
|
function getCommunity() {
|
|
try {
|
|
const communityJson = root.store.getSectionByIdJson(communityId)
|
|
|
|
if (!communityJson) {
|
|
// we don't have the shard info, so we will try to fetch it on waku
|
|
root.store.requestCommunityInfo(communityId, -1, -1)
|
|
return null
|
|
}
|
|
|
|
return JSON.parse(communityJson);
|
|
} catch (e) {
|
|
console.error("Error parsing community", e)
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
function reevaluate() {
|
|
invitedCommunity = getCommunity()
|
|
}
|
|
}
|
|
|
|
Component.onCompleted: {
|
|
d.reevaluate()
|
|
}
|
|
|
|
Connections {
|
|
target: root.store.communitiesModuleInst
|
|
function onCommunityChanged(communityId) {
|
|
if (communityId === root.communityId) {
|
|
d.reevaluate()
|
|
}
|
|
}
|
|
function onCommunityAdded(communityId) {
|
|
if (communityId === root.communityId) {
|
|
d.reevaluate()
|
|
}
|
|
}
|
|
}
|
|
|
|
background: Rectangle {
|
|
radius: d.radius
|
|
color: Style.current.background
|
|
border.color: Style.current.border
|
|
border.width: 1
|
|
}
|
|
|
|
contentItem: ColumnLayout {
|
|
spacing: 0
|
|
|
|
StatusBaseText {
|
|
id: title
|
|
|
|
Layout.fillWidth: true
|
|
Layout.leftMargin: d.margin
|
|
Layout.rightMargin: d.margin
|
|
Layout.topMargin: 8
|
|
Layout.bottomMargin: 8
|
|
|
|
text: d.communityVerified ? qsTr("Verified community invitation") : qsTr("Community invitation")
|
|
color: d.communityVerified ? Theme.palette.primaryColor1 : Theme.palette.baseColor1
|
|
font.weight: Font.Medium
|
|
font.pixelSize: 13
|
|
}
|
|
|
|
Rectangle {
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: 1
|
|
color: Style.current.separator
|
|
}
|
|
|
|
RowLayout {
|
|
id: communityDescriptionLayout
|
|
|
|
Layout.leftMargin: d.margin
|
|
Layout.rightMargin: d.margin
|
|
Layout.topMargin: 12
|
|
Layout.bottomMargin: 12
|
|
|
|
spacing: 12
|
|
|
|
StatusSmartIdenticon {
|
|
Layout.alignment: Qt.AlignTop
|
|
Layout.preferredWidth: 40
|
|
Layout.preferredHeight: 40
|
|
|
|
name: d.communityName
|
|
|
|
asset {
|
|
width: 40
|
|
height: 40
|
|
name: d.communityImage
|
|
color: d.communityColor
|
|
isImage: true
|
|
}
|
|
|
|
visible: d.communityColor && d.communityName
|
|
}
|
|
|
|
ColumnLayout {
|
|
spacing: 2
|
|
|
|
StatusBaseText {
|
|
Layout.fillWidth: true
|
|
objectName: "communityName"
|
|
text: d.communityName
|
|
font.weight: Font.Bold
|
|
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
|
|
font.pixelSize: 17
|
|
color: Theme.palette.directColor1
|
|
}
|
|
|
|
StatusBaseText {
|
|
Layout.fillWidth: true
|
|
objectName: "communityDescription"
|
|
text: d.communityDescription
|
|
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
|
|
color: Theme.palette.directColor1
|
|
}
|
|
|
|
StatusBaseText {
|
|
Layout.fillWidth: true
|
|
objectName: "communityMembers"
|
|
text: qsTr("%n member(s)", "", d.communityNbMembers)
|
|
font.pixelSize: 13
|
|
font.weight: Font.Medium
|
|
color: Theme.palette.baseColor1
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: 1
|
|
color: Style.current.separator
|
|
}
|
|
|
|
Item {
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: 44
|
|
clip: true
|
|
|
|
StatusFlatButton {
|
|
id: joinBtn
|
|
width: parent.width
|
|
height: (parent.height+d.radius)
|
|
anchors.top: parent.top
|
|
anchors.topMargin: -d.radius
|
|
loading: d.loading
|
|
radius: d.radius - 1 // We do -1, otherwise there's a gap between border and button
|
|
contentItem: Item {
|
|
StatusBaseText {
|
|
anchors.centerIn: parent
|
|
anchors.verticalCenterOffset: d.radius/2
|
|
visible: !joinBtn.loading
|
|
font: joinBtn.font
|
|
color: joinBtn.enabled ? joinBtn.textColor : joinBtn.disabledTextColor
|
|
text: qsTr("Go to Community")
|
|
}
|
|
}
|
|
|
|
onClicked: {
|
|
if (d.communityJoined || d.communitySpectated) {
|
|
root.store.setActiveCommunity(communityId)
|
|
} else {
|
|
root.store.spectateCommunity(communityId)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|