status-desktop/ui/imports/shared/views/profile/ProfileShowcaseView.qml

320 lines
11 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQml.Models 2.15
import StatusQ 0.1
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import StatusQ.Popups.Dialog 0.1
import StatusQ.Core.Utils 0.1 as StatusQUtils
import SortFilterProxyModel 0.2
import utils 1.0
import AppLayouts.Wallet.stores 1.0 as WalletStores
Control {
id: root
property alias currentTabIndex: stackLayout.currentIndex
property int maxVisibility: Constants.ShowcaseVisibility.Everyone
property alias communitiesModel: communitiesProxyModel.sourceModel
property alias accountsModel: accountsProxyModel.sourceModel
property alias collectiblesModel: collectiblesProxyModel.sourceModel
property alias assetsModel: assetsProxyModel.sourceModel
property alias socialLinksModel: socialLinksProxyModel.sourceModel
property var globalAssetsModel
property var globalCollectiblesModel
property WalletStores.RootStore walletStore
required property string mainDisplayName
required property bool readOnly
required property bool sendToAccountEnabled
signal closeRequested()
signal copyToClipboard(string text)
signal sendToAccountRequested(string recipientAddress)
horizontalPadding: readOnly ? 20 : 40 // smaller in settings/preview
topPadding: Theme.bigPadding
StatusQUtils.QObject {
id: d
property int delegateWidthS: 152
property int delegateHeightS: 152
property int delegateWidthM: 202
property int delegateHeightM: 160
readonly property string displayNameVerySmallEmoji: StatusQUtils.Emoji.parse(root.mainDisplayName, StatusQUtils.Emoji.size.verySmall)
}
component PositionSFPM: SortFilterProxyModel {
sorters: [
RoleSorter {
roleName: "showcasePosition"
}
]
filters: [
AnyOf {
inverted: true
UndefinedFilter {
roleName: "showcaseVisibility"
}
ValueFilter {
roleName: "showcaseVisibility"
value: Constants.ShowcaseVisibility.NoOne
}
},
FastExpressionFilter {
expression: model.showcaseVisibility >= root.maxVisibility
expectedRoles: ["showcaseVisibility"]
}
]
}
PositionSFPM {
id: communitiesProxyModel
}
PositionSFPM {
id: accountsProxyModel
}
PositionSFPM {
id: collectiblesProxyModel
}
PositionSFPM {
id: assetsProxyModel
}
PositionSFPM {
id: socialLinksProxyModel
}
background: StatusDialogBackground {
color: Theme.palette.baseColor4
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: parent.radius
color: parent.color
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: 1
color: Theme.palette.baseColor2
}
}
contentItem: StackLayout {
id: stackLayout
anchors.fill:parent
ProfileShowcaseCommunitiesView {
width: parent.width
height: parent.height
cellWidth: d.delegateWidthM
cellHeight: d.delegateHeightM
mainDisplayName: d.displayNameVerySmallEmoji
readOnly: root.readOnly
globalAssetsModel: root.globalAssetsModel
globalCollectiblesModel: root.globalCollectiblesModel
communitiesProxyModel: communitiesProxyModel
onCloseRequested: root.closeRequested()
onCopyToClipboard: root.copyToClipboard(text)
}
ProfileShowcaseAccountsView {
width: parent.width
height: parent.height
mainDisplayName: d.displayNameVerySmallEmoji
sendToAccountEnabled: root.sendToAccountEnabled
accountsModel: accountsProxyModel
walletStore: root.walletStore
cellWidth: d.delegateWidthM
cellHeight: d.delegateHeightM
onCopyToClipboard: root.copyToClipboard(text)
onSendToAccountRequested: root.sendToAccountRequested(recipientAddress)
}
ProfileShowcaseCollectiblesView {
width: parent.width
height: parent.height
cellWidth: d.delegateWidthS
cellHeight: d.delegateHeightS
mainDisplayName: d.displayNameVerySmallEmoji
collectiblesModel: collectiblesProxyModel
walletStore: root.walletStore
onCloseRequested: root.closeRequested()
onVisitCommunity: {
Global.openPopup(visitComunityPopupComponent, {communityId: model.communityId, communityName: model.communityName,
communityLogo: model.communityImage, tokenName: model.name,
tokenImage: model.imageUrl, isAssetType: false });
}
}
// ProfileShowcaseAssetsView {
// width: parent.width
// height: parent.height
// mainDisplayName: root.mainDisplayName
// assetsModel: assetsProxyModel
// sendToAccountEnabled: root.sendToAccountEnabled
// delegatesActionsMenu: delegatesActionsMenu
// cellHeight: d.delegateHeightS
// cellWidth: d.delegateWidthS
// onCloseRequested: root.closeRequested()
// onVisitCommunity: {
// Global.openPopup(visitComunityPopupComponent, {communityId: model.communityId, communityName: model.communityName,
// communityLogo: model.communityImage, tokenName: model.name,
// tokenImage: Constants.tokenIcon(model.symbol), isAssetType: false });
// }
// }
ProfileShowcaseSocialLinksView {
width: parent.width
height: parent.height
cellWidth: d.delegateWidthS
cellHeight: d.delegateHeightS
mainDisplayName: d.displayNameVerySmallEmoji
socialLinksModel: socialLinksProxyModel
onCopyToClipboard: root.copyToClipboard(text)
}
}
Component {
id: visitComunityPopupComponent
StatusDialog {
id: visitComunityPopup
// Community related props:
property string communityId
property string communityName
property string communityLogo
// Token related props:
property string tokenName
property string tokenImage
property bool isAssetType: false
width: 521 // by design
padding: 0
destroyOnClose: true
contentItem: StatusScrollView {
id: scrollView
padding: Theme.padding
contentWidth: availableWidth
ColumnLayout {
width: scrollView.availableWidth
spacing: Theme.padding
StatusBaseText {
Layout.fillWidth: true
text: visitComunityPopup.isAssetType ? qsTr("%1 is a community minted asset. Would you like to visit the community that minted it?").arg(visitComunityPopup.tokenName) :
qsTr("%1 is a community minted collectible. Would you like to visit the community that minted it?").arg(visitComunityPopup.tokenName)
textFormat: Text.RichText
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
lineHeight: 1.2
}
// Navigate to community button
StatusListItem {
Layout.fillWidth: true
Layout.bottomMargin: Theme.halfPadding
title: visitComunityPopup.communityName
border.color: Theme.palette.baseColor2
asset.name: visitComunityPopup.communityLogo
asset.isImage: true
asset.isLetterIdenticon: !asset.name
components: [
RowLayout {
StatusIcon {
Layout.alignment: Qt.AlignVCenter
icon: "arrow-right"
color: Theme.palette.primaryColor1
}
StatusBaseText {
Layout.alignment: Qt.AlignVCenter
Layout.rightMargin: Theme.padding
text: visitComunityPopup.tokenName
font.pixelSize: Theme.additionalTextSize
color: Theme.palette.primaryColor1
}
}
]
onClicked: {
Global.switchToCommunity(visitComunityPopup.communityId);
visitComunityPopup.close();
root.closeRequested();
}
}
}
}
header: StatusDialogHeader {
leftComponent: StatusRoundedImage {
Layout.alignment: Qt.AlignHCenter
Layout.margins: Theme.padding
Layout.preferredWidth: 68
Layout.preferredHeight: Layout.preferredWidth
radius: visitComunityPopup.isAssetType ? width / 2 : 8
image.source: visitComunityPopup.tokenImage
showLoadingIndicator: false
image.fillMode: Image.PreserveAspectCrop
}
headline.title: visitComunityPopup.tokenName
headline.subtitle: qsTr("Minted by %1").arg(visitComunityPopup.communityName)
actions.closeButton.onClicked: { visitComunityPopup.close(); }
}
footer: StatusDialogFooter {
spacing: Theme.padding
rightButtons: ObjectModel {
StatusFlatButton {
text: qsTr("Cancel")
onClicked: {
visitComunityPopup.close();
}
}
}
}
}
}
}