status-desktop/ui/app/AppLayouts/Wallet/stores/CollectiblesStore.qml

138 lines
5.6 KiB
QML

import QtQuick 2.15
import StatusQ 0.1
import StatusQ.Models 0.1
import utils 1.0
import SortFilterProxyModel 0.2
import StatusQ.Core.Utils 0.1 as SQUtils
QtObject {
id: root
/* PRIVATE: Modules used to get data from backend */
readonly property var _allCollectiblesModule: !!walletSectionAllCollectibles ? walletSectionAllCollectibles : null
/* This list contains the complete list of collectibles with separate
entry per collectible which has a unique [network + contractAddress + tokenID] */
readonly property var _allCollectiblesModel: !!root._allCollectiblesModule ? root._allCollectiblesModule.allCollectiblesModel : null
readonly property var allCollectiblesModel: RolesRenamingModel {
objectName: "allCollectiblesModel"
sourceModel: root._allCollectiblesModel
mapping: [
RoleRename {
from: "uid"
to: "symbol"
}
]
}
readonly property var collectiblesController: ManageTokensController {
sourceModel: root.jointCollectiblesBySymbolModel
settingsKey: "WalletCollectibles"
serializeAsCollectibles: true
onRequestSaveSettings: (jsonData) => {
savingStarted()
_allCollectiblesModule.updateCollectiblePreferences(jsonData)
savingFinished()
}
onRequestLoadSettings: {
loadingStarted()
let jsonData = _allCollectiblesModule.getCollectiblePreferencesJson()
loadingFinished(jsonData)
}
onCommunityTokenGroupHidden: (communityName) => Global.displayToastMessage(
qsTr("%1 community collectibles successfully hidden").arg(communityName), "", "checkmark-circle",
false, Constants.ephemeralNotificationType.success, "")
onTokenShown: (symbol, name) => Global.displayToastMessage(qsTr("%1 is now visible").arg(name), "", "checkmark-circle",
false, Constants.ephemeralNotificationType.success, "")
onCommunityTokenGroupShown: (communityName) => Global.displayToastMessage(
qsTr("%1 community collectibles are now visible").arg(communityName), "", "checkmark-circle",
false, Constants.ephemeralNotificationType.success, "")
}
/* PRIVATE: This model renames the roles
1. "id" to "communityId"
2. "name" to "communityName"
3. "image" to "communityImage"
4. "description" to "communityDescription"
in communitiesModule.model so that it can be easily
joined with the Collectibles model */
readonly property var _renamedCommunitiesModel: RolesRenamingModel {
sourceModel: communitiesModule.model
mapping: [
RoleRename {
from: "id"
to: "communityId"
},
RoleRename {
from: "name"
to: "communityName"
},
RoleRename {
from: "image"
to: "communityImage"
},
RoleRename {
from: "description"
to: "communityDescription"
}
]
}
/* TODO: move all transformations to a dedicated adaptors */
readonly property LeftJoinModel jointCollectiblesBySymbolModel: LeftJoinModel {
objectName: "jointCollectiblesBySymbolModel"
leftModel: allCollectiblesModel
rightModel: _renamedCommunitiesModel
joinRole: "communityId"
}
readonly property bool areCollectiblesFetching: !!root._allCollectiblesModel ? root._allCollectiblesModel.isFetching : true
readonly property bool areCollectiblesUpdating: !!root._allCollectiblesModel ? root._allCollectiblesModel.isUpdating : false
readonly property bool areCollectiblesError: !!root._allCollectiblesModel ? root._allCollectiblesModel.isError : false
/* The following are used to display the detailed view of a collectible */
readonly property var detailedCollectible: Global.appIsReady ? walletSection.collectibleDetailsController.detailedEntry : null
readonly property var detailedCollectibleStatus: Global.appIsReady ? walletSection.collectibleDetailsController.status : null
readonly property bool isDetailedCollectibleLoading: Global.appIsReady ? walletSection.collectibleDetailsController.isDetailedEntryLoading : true
function getDetailedCollectible(chainId, contractAddress, tokenId) {
walletSection.collectibleDetailsController.getDetailedCollectible(chainId, contractAddress, tokenId)
}
function resetDetailedCollectible() {
walletSection.collectibleDetailsController.resetDetailedCollectible()
}
function hasNFT(ownerAddress, chainId, tokenId, tokenAddress) {
const uid = getUidForData(tokenId, tokenAddress, chainId)
ownerAddress = ownerAddress.toLowerCase()
const ownership = SQUtils.ModelUtils.getByKey(_allCollectiblesModel, "uid", uid, "ownership")
if (!ownership)
return false
for (let i = 0; i < ownership.count; i++) {
const accountAddress = SQUtils.ModelUtils.get(ownership, i, "accountAddress").toLowerCase()
if (accountAddress !== ownerAddress)
continue
const tokenBalanceStr = SQUtils.ModelUtils.get(ownership, i, "balance").toLowerCase()
if (tokenBalanceStr !== "")
return true
}
return false
}
function getUidForData(tokenId, tokenAddress, chainId) {
return _allCollectiblesModel.getUidForData(tokenId, tokenAddress, chainId)
}
}