refactor(contactDetailsAsJson): Adding `ContactDetails` component to replace `getContactDetailsAsJson`
This component has live data and its purpose is to replace getContactDetailsAsJson + adding storybook page + adding tests
This commit is contained in:
parent
6560f27d99
commit
afcb7608e0
|
@ -0,0 +1,207 @@
|
||||||
|
import QtQml 2.15
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.15
|
||||||
|
import QtQuick.Layouts 1.15
|
||||||
|
import SortFilterProxyModel 0.2
|
||||||
|
import StatusQ.Components 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
import StatusQ.Core 0.1
|
||||||
|
import StatusQ.Core.Theme 0.1
|
||||||
|
import StatusQ.Core.Utils 0.1
|
||||||
|
import Storybook 1.0
|
||||||
|
import utils 1.0
|
||||||
|
import Models 1.0
|
||||||
|
|
||||||
|
import AppLayouts.Profile.helpers 1.0
|
||||||
|
import AppLayouts.Profile.stores 1.0
|
||||||
|
|
||||||
|
import QtTest 1.15
|
||||||
|
|
||||||
|
SplitView {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
SplitView.fillWidth: true
|
||||||
|
SplitView.fillHeight: true
|
||||||
|
clip: true
|
||||||
|
spacing: 5
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "publicKey: " + contactDetails.publicKey
|
||||||
|
font.bold: true
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "loading: " + contactDetails.loading
|
||||||
|
font.bold: true
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "displayName: " + contactDetails.displayName
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "ensName: " + contactDetails.ensName
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "ensVerified: " + contactDetails.ensVerified
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "localNickname: " + contactDetails.localNickname
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "alias: " + contactDetails.alias
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "icon: " + contactDetails.icon
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "colorId: " + contactDetails.colorId
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "colorHash: " + contactDetails.colorHash
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "onlineStatus: " + contactDetails.onlineStatus
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "isContact: " + contactDetails.isContact
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "isCurrentUser: " + contactDetails.isCurrentUser
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "isVerified: " + contactDetails.isVerified
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "isUntrustworthy: " + contactDetails.isUntrustworthy
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "isBlocked: " + contactDetails.isBlocked
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "contactRequestState: " + contactDetails.contactRequestState
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "incomingVerificationStatus: " + contactDetails.incomingVerificationStatus
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "outgoingVerificationStatus: " + contactDetails.outgoingVerificationStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
Pane {
|
||||||
|
contentItem: RowLayout {
|
||||||
|
ComboBox {
|
||||||
|
id: pubKeySelector
|
||||||
|
model: [...ModelUtils.modelToFlatArray(myContactsModel, "pubKey"), "myPubKey", "none"]
|
||||||
|
ModelChangeTracker {
|
||||||
|
id: modelChangeTracker
|
||||||
|
model: myContactsModel
|
||||||
|
onRevisionChanged: {
|
||||||
|
pubKeySelector.model = [...ModelUtils.modelToFlatArray(myContactsModel, "pubKey"), "myPubKey", "none"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UsersModelEditor {
|
||||||
|
id: myContactsModelEditor
|
||||||
|
SplitView.fillHeight: true
|
||||||
|
SplitView.preferredWidth: 500
|
||||||
|
model: myContactsModel
|
||||||
|
|
||||||
|
onRemoveClicked: (index) => {
|
||||||
|
myContactsModel.remove(index, 1)
|
||||||
|
}
|
||||||
|
onRemoveAllClicked: () => {
|
||||||
|
myContactsModel.clear()
|
||||||
|
}
|
||||||
|
onAddClicked: () => {
|
||||||
|
myContactsModel.append(getNewUser(myContactsModel.count))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UsersModel {
|
||||||
|
id: myContactsModel
|
||||||
|
}
|
||||||
|
|
||||||
|
ContactsStore {
|
||||||
|
id: contactsStoreMock
|
||||||
|
readonly property string myPublicKey: "0x123"
|
||||||
|
readonly property UsersModel contactsModel: myContactsModel
|
||||||
|
function requestContactInfo(pubKey) {
|
||||||
|
myContactsModel.append({
|
||||||
|
pubKey: pubKey,
|
||||||
|
displayName: "displayName",
|
||||||
|
ensName: "ensName",
|
||||||
|
ensVerified: true,
|
||||||
|
localNickname: "localNickname",
|
||||||
|
alias: "alias",
|
||||||
|
icon: "icon",
|
||||||
|
colorId: 1,
|
||||||
|
colorHash: [],
|
||||||
|
onlineStatus: 1,
|
||||||
|
isContact: true,
|
||||||
|
isCurrentUser: false,
|
||||||
|
isVerified: true,
|
||||||
|
isUntrustworthy: false,
|
||||||
|
isBlocked: false,
|
||||||
|
contactRequestState: 3,
|
||||||
|
incomingVerificationStatus: 3,
|
||||||
|
outgoingVerificationStatus: 2,
|
||||||
|
defaaaultDisplayName: "defaultDisplayName",
|
||||||
|
optionalName: "optionalName",
|
||||||
|
lastUpdated: 1234567890,
|
||||||
|
lastUpdatedLocally: 1234567890,
|
||||||
|
thumbnailImage: "thumbnailImage",
|
||||||
|
largeImage: "largeImage",
|
||||||
|
isContactRequestReceived: false,
|
||||||
|
isContactRequestSent: false,
|
||||||
|
isSyncing: false,
|
||||||
|
removed: false,
|
||||||
|
trustStatus: 1,
|
||||||
|
bio: "bio"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ProfileStore {
|
||||||
|
id: profileStoreMock
|
||||||
|
readonly property string displayName: "myDisplayName"
|
||||||
|
readonly property string name: "myEnsName"
|
||||||
|
readonly property string username: "myUsername"
|
||||||
|
readonly property string icon: "myIcon"
|
||||||
|
readonly property int colorId: 1
|
||||||
|
readonly property var colorHash: {}
|
||||||
|
readonly property int currentUserStatus: 1
|
||||||
|
readonly property string defaultDisplayName: "myDefaultDisplayName"
|
||||||
|
readonly property string thumbnailImage: "myThumbnailImage"
|
||||||
|
readonly property string largeImage: "myLargeImage"
|
||||||
|
readonly property string bio: "myBio"
|
||||||
|
}
|
||||||
|
|
||||||
|
ContactDetails {
|
||||||
|
id: contactDetails
|
||||||
|
contactsStore: contactsStoreMock
|
||||||
|
profileStore: profileStoreMock
|
||||||
|
publicKey: pubKeySelector.currentText === "myPubKey" ? "0x123" : pubKeySelector.currentText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// category: Contacts
|
|
@ -0,0 +1,336 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtTest 1.15
|
||||||
|
import QtQml 2.15
|
||||||
|
|
||||||
|
import AppLayouts.Profile.helpers 1.0
|
||||||
|
import AppLayouts.Profile.stores 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: testComponent
|
||||||
|
ContactDetails {
|
||||||
|
id: contactDetails
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: failingTestComponent
|
||||||
|
ContactDetails {
|
||||||
|
id: contactDetails
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: contactsStore
|
||||||
|
ContactsStore {
|
||||||
|
readonly property string myPublicKey: "0x123"
|
||||||
|
readonly property ListModel contactsModel: ListModel { id: myContactsModel }
|
||||||
|
property var requestContactInfo: requestContactInfoCall
|
||||||
|
function requestContactInfoCall(pubKey) {
|
||||||
|
myContactsModel.append({
|
||||||
|
pubKey: pubKey,
|
||||||
|
displayName: "displayName",
|
||||||
|
ensName: "ensName",
|
||||||
|
isEnsVerified: true,
|
||||||
|
localNickname: "localNickname",
|
||||||
|
alias: "alias",
|
||||||
|
icon: "icon",
|
||||||
|
colorId: 1,
|
||||||
|
colorHash: [],
|
||||||
|
onlineStatus: 1,
|
||||||
|
isContact: true,
|
||||||
|
isCurrentUser: false,
|
||||||
|
isVerified: true,
|
||||||
|
isUntrustworthy: false,
|
||||||
|
isBlocked: false,
|
||||||
|
contactRequest: 3,
|
||||||
|
incomingVerificationStatus: 3,
|
||||||
|
outgoingVerificationStatus: 2,
|
||||||
|
defaultDisplayName: "defaultDisplayName",
|
||||||
|
optionalName: "optionalName",
|
||||||
|
lastUpdated: 1234567890,
|
||||||
|
lastUpdatedLocally: 1234567890,
|
||||||
|
thumbnailImage: "thumbnailImage",
|
||||||
|
largeImage: "largeImage",
|
||||||
|
isContactRequestReceived: false,
|
||||||
|
isContactRequestSent: false,
|
||||||
|
isSyncing: false,
|
||||||
|
isRemoved: false,
|
||||||
|
trustStatus: 1,
|
||||||
|
bio: "bio"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: profileStore
|
||||||
|
ProfileStore {
|
||||||
|
id: profileStoreMock
|
||||||
|
readonly property string displayName: "myDisplayName"
|
||||||
|
readonly property string name: "myEnsName"
|
||||||
|
readonly property string username: "myUsername"
|
||||||
|
readonly property string icon: "myIcon"
|
||||||
|
readonly property int colorId: 1
|
||||||
|
readonly property var colorHash: {1}
|
||||||
|
readonly property int currentUserStatus: 1
|
||||||
|
readonly property string defaultDisplayName: "myDefaultDisplayName"
|
||||||
|
readonly property string thumbnailImage: "myThumbnailImage"
|
||||||
|
readonly property string largeImage: "myLargeImage"
|
||||||
|
readonly property string bio: "myBio"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TestCase {
|
||||||
|
name: "ContactDetailsTest"
|
||||||
|
function test_initialization() {
|
||||||
|
const contactDetails = createTemporaryObject(testComponent, root, {
|
||||||
|
contactsStore: createTemporaryObject(contactsStore, root),
|
||||||
|
profileStore: createTemporaryObject(profileStore, root),
|
||||||
|
publicKey: ""
|
||||||
|
})
|
||||||
|
|
||||||
|
verify(!!contactDetails, "Expected the contact details to initialize")
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_initializationOwnProfile() {
|
||||||
|
const contactDetails = createTemporaryObject(testComponent, root, {
|
||||||
|
contactsStore: createTemporaryObject(contactsStore, root),
|
||||||
|
profileStore: createTemporaryObject(profileStore, root),
|
||||||
|
publicKey: "0x123"
|
||||||
|
})
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x123", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.contactsStore.myPublicKey,"0x123", "Expected the contacts store to be set")
|
||||||
|
compare(contactDetails.profileStore.displayName,"myDisplayName", "Expected the profile store to be set")
|
||||||
|
compare(contactDetails.displayName, contactDetails.profileStore.displayName, "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, contactDetails.profileStore.name, "Expected the ens name to be set")
|
||||||
|
compare(contactDetails.ensVerified, true, "Expected the ensVerified to be set")
|
||||||
|
compare(contactDetails.localNickname, "", "Expected the local nickname to be empty")
|
||||||
|
compare(contactDetails.alias, contactDetails.profileStore.username, "Expected the alias to be set")
|
||||||
|
compare(contactDetails.icon, contactDetails.profileStore.icon, "Expected the icon to be set")
|
||||||
|
compare(contactDetails.colorId, contactDetails.profileStore.colorId, "Expected the color id to be set")
|
||||||
|
compare(contactDetails.colorHash, contactDetails.profileStore.colorHash, "Expected the color hash to be empty")
|
||||||
|
compare(contactDetails.onlineStatus, contactDetails.profileStore.currentUserStatus, "Expected the online status to be set")
|
||||||
|
compare(contactDetails.thumbnailImage, contactDetails.profileStore.thumbnailImage, "Expected the is contact flag to be set")
|
||||||
|
compare(contactDetails.largeImage, contactDetails.profileStore.largeImage, "Expected the is contact flag to be set")
|
||||||
|
compare(contactDetails.bio, contactDetails.profileStore.bio, "Expected the is contact flag to be set")
|
||||||
|
compare(contactDetails.isContact, false, "Expected the is contact flag to be set")
|
||||||
|
compare(contactDetails.isCurrentUser, true, "Expected the is contact flag to be set")
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_initializationWithContact() {
|
||||||
|
const contactsStoreMock = createTemporaryObject(contactsStore, root)
|
||||||
|
contactsStoreMock.requestContactInfo("0x321") //appending new contact to the model
|
||||||
|
|
||||||
|
const contactDetails = createTemporaryObject(testComponent, root, {
|
||||||
|
contactsStore: contactsStoreMock,
|
||||||
|
profileStore: createTemporaryObject(profileStore, root),
|
||||||
|
publicKey: "0x321"
|
||||||
|
})
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x321", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.displayName, "displayName", "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, "ensName", "Expected the ens name to be set")
|
||||||
|
compare(contactDetails.ensVerified, true, "Expected the ensVerified to be set")
|
||||||
|
compare(contactDetails.localNickname, "localNickname", "Expected the local nickname to be set")
|
||||||
|
compare(contactDetails.alias, "alias", "Expected the alias to be set")
|
||||||
|
compare(contactDetails.icon, "icon", "Expected the icon to be set")
|
||||||
|
compare(contactDetails.colorId, 1, "Expected the color id to be set")
|
||||||
|
compare(contactDetails.onlineStatus, 1, "Expected the online status to be set")
|
||||||
|
compare(contactDetails.thumbnailImage, "thumbnailImage", "Expected the thumbnailImage to be set")
|
||||||
|
compare(contactDetails.largeImage, "largeImage", "Expected the largeImage to be set")
|
||||||
|
compare(contactDetails.bio, "bio", "Expected the bio to be set")
|
||||||
|
compare(contactDetails.isContact, true, "Expected the is contact flag to be set")
|
||||||
|
compare(contactDetails.isCurrentUser, false, "Expected the isCurrentUser flag to be set")
|
||||||
|
compare(contactDetails.isVerified, true, "Expected the isVerified flag to be set")
|
||||||
|
compare(contactDetails.isUntrustworthy, false, "Expected the isUntrustworthy flag to be set")
|
||||||
|
compare(contactDetails.isBlocked, false, "Expected the isBlocked flag to be set")
|
||||||
|
compare(contactDetails.contactRequestState, 3, "Expected the contactRequestState flag to be set")
|
||||||
|
compare(contactDetails.incomingVerificationStatus, 3, "Expected the incomingVerificationStatus flag to be set")
|
||||||
|
compare(contactDetails.outgoingVerificationStatus, 2, "Expected the outgoingVerificationStatus flag to be set")
|
||||||
|
compare(contactDetails.defaultDisplayName, "defaultDisplayName", "Expected the defaultDisplayName to be set")
|
||||||
|
compare(contactDetails.optionalName, "optionalName", "Expected the optionalName to be set")
|
||||||
|
compare(contactDetails.lastUpdated, 1234567890, "Expected the lastUpdated to be set")
|
||||||
|
compare(contactDetails.lastUpdatedLocally, 1234567890, "Expected the lastUpdatedLocally to be set")
|
||||||
|
compare(contactDetails.isContactRequestReceived, false, "Expected the isContactRequestReceived flag to be set")
|
||||||
|
compare(contactDetails.isContactRequestSent, false, "Expected the isContactRequestSent flag to be set")
|
||||||
|
compare(contactDetails.isSyncing, false, "Expected the isSyncing to be set")
|
||||||
|
compare(contactDetails.removed, false, "Expected the removed flag to be set")
|
||||||
|
compare(contactDetails.trustStatus, 1, "Expected the trustStatus flag to be set")
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_initFails() {
|
||||||
|
ignoreWarning(new RegExp("Required property publicKey was not initialized"))
|
||||||
|
ignoreWarning(new RegExp("Required property contactsStore was not initialized"))
|
||||||
|
ignoreWarning(new RegExp("Required property profileStore was not initialized"))
|
||||||
|
|
||||||
|
const contactDetails = createTemporaryObject(failingTestComponent, root)
|
||||||
|
verify(!contactDetails, "Expected the contact details to fail to initialize")
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_initWithEmptyContacts() {
|
||||||
|
const contactsStoreMock = createTemporaryObject(contactsStore, root)
|
||||||
|
let requestContactInfoCallCount = 0
|
||||||
|
contactsStoreMock.requestContactInfo = function(pubKey) {
|
||||||
|
requestContactInfoCallCount++
|
||||||
|
}
|
||||||
|
const contactDetails = createTemporaryObject(testComponent, root, {
|
||||||
|
contactsStore: contactsStoreMock,
|
||||||
|
profileStore: createTemporaryObject(profileStore, root),
|
||||||
|
publicKey: "0x1234"
|
||||||
|
})
|
||||||
|
|
||||||
|
compare(requestContactInfoCallCount, 1, "Expected the requestContactInfo to be called")
|
||||||
|
compare(contactDetails.loading, true, "Expected the loading flag to be true")
|
||||||
|
compare(contactDetails.publicKey,"0x1234", "Expected the public key to be set")
|
||||||
|
|
||||||
|
//add the contact
|
||||||
|
contactsStoreMock.requestContactInfo = contactsStoreMock.requestContactInfoCall
|
||||||
|
contactsStoreMock.requestContactInfo("0x1234")
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x1234", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.displayName, "displayName", "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, "ensName", "Expected the ens name to be set")
|
||||||
|
compare(contactDetails.ensVerified, true, "Expected the ensVerified to be set")
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_contactRemovedFromModel() {
|
||||||
|
const contactsStoreMock = createTemporaryObject(contactsStore, root)
|
||||||
|
contactsStoreMock.requestContactInfo("0x1234") //appending new contact to the model
|
||||||
|
|
||||||
|
const contactDetails = createTemporaryObject(testComponent, root, {
|
||||||
|
contactsStore: contactsStoreMock,
|
||||||
|
profileStore: createTemporaryObject(profileStore, root),
|
||||||
|
publicKey: "0x1234"
|
||||||
|
})
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x1234", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.displayName, "displayName", "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, "ensName", "Expected the ens name to be set")
|
||||||
|
compare(contactDetails.ensVerified, true, "Expected the ensVerified to be set")
|
||||||
|
|
||||||
|
// removing from model should not clear the contact details
|
||||||
|
contactsStoreMock.contactsModel.remove(0)
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be true")
|
||||||
|
compare(contactDetails.publicKey,"0x1234", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.displayName, "displayName", "Expected the display name to be empty")
|
||||||
|
compare(contactDetails.ensName, "ensName", "Expected the ens name to be empty")
|
||||||
|
compare(contactDetails.ensVerified, true, "Expected the ensVerified to be false")
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_liveUpdate() {
|
||||||
|
const contactsStoreMock = createTemporaryObject(contactsStore, root)
|
||||||
|
contactsStoreMock.requestContactInfo("0x1234") //appending new contact to the model
|
||||||
|
|
||||||
|
const contactDetails = createTemporaryObject(testComponent, root, {
|
||||||
|
contactsStore: contactsStoreMock,
|
||||||
|
profileStore: createTemporaryObject(profileStore, root),
|
||||||
|
publicKey: "0x1234"
|
||||||
|
})
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x1234", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.displayName, "displayName", "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, "ensName", "Expected the ens name to be set")
|
||||||
|
compare(contactDetails.ensVerified, true, "Expected the ensVerified to be set")
|
||||||
|
|
||||||
|
// updating the contact should update the contact details
|
||||||
|
contactsStoreMock.contactsModel.set(0, {
|
||||||
|
pubKey: "0x1234",
|
||||||
|
displayName: "newDisplayName",
|
||||||
|
ensName: "newEnsName",
|
||||||
|
isEnsVerified: false,
|
||||||
|
localNickname: "newLocalNickname",
|
||||||
|
alias: "newAlias",
|
||||||
|
icon: "newIcon",
|
||||||
|
colorId: 2,
|
||||||
|
colorHash: [],
|
||||||
|
onlineStatus: 2,
|
||||||
|
isContact: false,
|
||||||
|
isCurrentUser: true,
|
||||||
|
isVerified: false,
|
||||||
|
isUntrustworthy: true,
|
||||||
|
isBlocked: true,
|
||||||
|
contactRequest: 2,
|
||||||
|
incomingVerificationStatus: 2,
|
||||||
|
outgoingVerificationStatus: 1,
|
||||||
|
defaultDisplayName: "newDefaultDisplayName",
|
||||||
|
optionalName: "newOptionalName",
|
||||||
|
lastUpdated: 1234567891,
|
||||||
|
lastUpdatedLocally: 1234567891,
|
||||||
|
thumbnailImage: "newThumbnailImage",
|
||||||
|
largeImage: "newLargeImage",
|
||||||
|
isContactRequestReceived: true,
|
||||||
|
isContactRequestSent: true,
|
||||||
|
isSyncing: true,
|
||||||
|
isRemoved: true,
|
||||||
|
trustStatus: 2,
|
||||||
|
bio: "newBio"
|
||||||
|
})
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x1234", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.displayName, "newDisplayName", "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, "newEnsName", "Expected the ens name to be set")
|
||||||
|
compare(contactDetails.ensVerified, false, "Expected the ensVerified to be set")
|
||||||
|
compare(contactDetails.localNickname, "newLocalNickname", "Expected the local nickname to be set")
|
||||||
|
compare(contactDetails.alias, "newAlias", "Expected the alias to be set")
|
||||||
|
compare(contactDetails.icon, "newIcon", "Expected the icon to be set")
|
||||||
|
compare(contactDetails.colorId, 2, "Expected the color id to be set")
|
||||||
|
compare(contactDetails.onlineStatus, 2, "Expected the online status to be set")
|
||||||
|
compare(contactDetails.thumbnailImage, "newThumbnailImage", "Expected the thumbnailImage to be set")
|
||||||
|
compare(contactDetails.largeImage, "newLargeImage", "Expected the largeImage to be set")
|
||||||
|
compare(contactDetails.bio, "newBio", "Expected the bio to be set")
|
||||||
|
compare(contactDetails.isContact, false, "Expected the is contact flag to be set")
|
||||||
|
compare(contactDetails.isCurrentUser, true, "Expected the isCurrentUser flag to be set")
|
||||||
|
compare(contactDetails.isVerified, false, "Expected the isVerified flag to be set")
|
||||||
|
compare(contactDetails.isUntrustworthy, true, "Expected the isUntrustworthy flag to be set")
|
||||||
|
compare(contactDetails.isBlocked, true, "Expected the isBlocked flag to be set")
|
||||||
|
compare(contactDetails.contactRequestState, 2, "Expected the contactRequestState flag to be set")
|
||||||
|
compare(contactDetails.incomingVerificationStatus, 2, "Expected the incomingVerificationStatus flag to be set")
|
||||||
|
compare(contactDetails.outgoingVerificationStatus, 1, "Expected the outgoingVerificationStatus flag to be set")
|
||||||
|
compare(contactDetails.defaultDisplayName, "newDefaultDisplayName", "Expected the defaultDisplayName to be set")
|
||||||
|
compare(contactDetails.optionalName, "newOptionalName", "Expected the optionalName to be set")
|
||||||
|
compare(contactDetails.lastUpdated, 1234567891, "Expected the lastUpdated to be set")
|
||||||
|
compare(contactDetails.lastUpdatedLocally, 1234567891, "Expected the lastUpdatedLocally to be set")
|
||||||
|
compare(contactDetails.isContactRequestReceived, true, "Expected the isContactRequestReceived flag to be set")
|
||||||
|
compare(contactDetails.isContactRequestSent, true, "Expected the isContactRequestSent flag to be set")
|
||||||
|
compare(contactDetails.isSyncing, true, "Expected the isSyncing to be set")
|
||||||
|
compare(contactDetails.removed, true, "Expected the removed flag to be set")
|
||||||
|
compare(contactDetails.trustStatus, 2, "Expected the trustStatus flag to be set")
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_changingPublicKeyFromOwnToContact() {
|
||||||
|
const contactsStoreMock = createTemporaryObject(contactsStore, root)
|
||||||
|
const contactDetails = createTemporaryObject(testComponent, root, {
|
||||||
|
contactsStore: contactsStoreMock,
|
||||||
|
profileStore: createTemporaryObject(profileStore, root),
|
||||||
|
publicKey: "0x123"
|
||||||
|
})
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x123", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.contactsStore.myPublicKey,"0x123", "Expected the contacts store to be set")
|
||||||
|
compare(contactDetails.profileStore.displayName,"myDisplayName", "Expected the profile store to be set")
|
||||||
|
compare(contactDetails.displayName, contactDetails.profileStore.displayName, "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, contactDetails.profileStore.name, "Expected the ens name to be set")
|
||||||
|
|
||||||
|
contactDetails.publicKey = "0x321"
|
||||||
|
|
||||||
|
compare(contactDetails.loading, false, "Expected the loading flag to be false")
|
||||||
|
compare(contactDetails.publicKey,"0x321", "Expected the public key to be set")
|
||||||
|
compare(contactDetails.displayName, "displayName", "Expected the display name to be set")
|
||||||
|
compare(contactDetails.ensName, "ensName", "Expected the ens name to be set")
|
||||||
|
compare(contactDetails.ensVerified, true, "Expected the ensVerified to be set")
|
||||||
|
compare(contactDetails.localNickname, "localNickname", "Expected the local nickname to be set")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,4 +20,15 @@ QtObject {
|
||||||
const regex = new RegExp(`^[ \\t]{${minIndent}}`, "gm")
|
const regex = new RegExp(`^[ \\t]{${minIndent}}`, "gm")
|
||||||
return code.replace(regex, "")
|
return code.replace(regex, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function findChild(parent, name) {
|
||||||
|
if (!parent || !parent.children)
|
||||||
|
return null
|
||||||
|
|
||||||
|
for (let i = 0; i < parent.children.length; i++) {
|
||||||
|
if (parent.children[i].objectName === name)
|
||||||
|
return parent.children[i]
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
LanguageStore 1.0 LanguageStore.qml
|
LanguageStore 1.0 LanguageStore.qml
|
||||||
ProfileSectionStore 1.0 ProfileSectionStore.qml
|
ProfileSectionStore 1.0 ProfileSectionStore.qml
|
||||||
WalletStore 1.0 WalletStore.qml
|
WalletStore 1.0 WalletStore.qml
|
||||||
|
ContactsStore 1.0 ContactsStore.qml
|
||||||
|
ProfileStore 1.0 ProfileStore.qml
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
|
||||||
|
import StatusQ 0.1
|
||||||
|
import StatusQ.Core.Utils 0.1
|
||||||
|
|
||||||
|
import AppLayouts.Profile.stores 1.0
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
QObject {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
required property ContactsStore contactsStore
|
||||||
|
required property ProfileStore profileStore
|
||||||
|
required property string publicKey
|
||||||
|
|
||||||
|
readonly property alias loading: d.loading
|
||||||
|
|
||||||
|
// model properties
|
||||||
|
readonly property string displayName: d.contactDetails.displayName ?? ""
|
||||||
|
readonly property string ensName: d.contactDetails.ensName ?? ""
|
||||||
|
readonly property bool ensVerified: d.contactDetails.isEnsVerified ?? false
|
||||||
|
readonly property string localNickname: d.contactDetails.localNickname ?? ""
|
||||||
|
readonly property string alias: d.contactDetails.alias ?? ""
|
||||||
|
readonly property string icon: d.contactDetails.icon ?? ""
|
||||||
|
readonly property int colorId: d.contactDetails.colorId ?? 0
|
||||||
|
readonly property var colorHash: d.contactDetails.colorHash ?? []
|
||||||
|
readonly property int onlineStatus: d.contactDetails.onlineStatus ?? Constants.onlineStatus.inactive
|
||||||
|
readonly property bool isContact: d.contactDetails.isContact ?? false
|
||||||
|
readonly property bool isCurrentUser: d.contactDetails.isCurrentUser ?? false
|
||||||
|
readonly property bool isVerified: d.contactDetails.isVerified ?? false
|
||||||
|
readonly property bool isUntrustworthy: d.contactDetails.isUntrustworthy ?? false
|
||||||
|
readonly property bool isBlocked: d.contactDetails.isBlocked ?? false
|
||||||
|
readonly property int contactRequestState: d.contactDetails.contactRequest ?? Constants.ContactRequestState.None
|
||||||
|
readonly property int incomingVerificationStatus: d.contactDetails.incomingVerificationStatus ?? Constants.verificationStatus.unverified
|
||||||
|
readonly property int outgoingVerificationStatus: d.contactDetails.outgoingVerificationStatus ?? Constants.verificationStatus.unverified
|
||||||
|
readonly property string defaultDisplayName: d.contactDetails.defaultDisplayName ?? ""
|
||||||
|
readonly property string optionalName: d.contactDetails.optionalName ?? ""
|
||||||
|
readonly property int lastUpdated: d.contactDetails.lastUpdated ?? 0
|
||||||
|
readonly property int lastUpdatedLocally: d.contactDetails.lastUpdatedLocally ?? 0
|
||||||
|
readonly property string thumbnailImage: d.contactDetails.thumbnailImage ?? ""
|
||||||
|
readonly property string largeImage: d.contactDetails.largeImage ?? ""
|
||||||
|
readonly property bool isContactRequestReceived: d.contactDetails.isContactRequestReceived ?? false
|
||||||
|
readonly property bool isContactRequestSent: d.contactDetails.isContactRequestSent ?? false
|
||||||
|
readonly property bool isSyncing: d.contactDetails.isSyncing ?? false
|
||||||
|
readonly property bool removed: d.contactDetails.isRemoved ?? false
|
||||||
|
readonly property int trustStatus: d.contactDetails.trustStatus ?? Constants.trustStatus.unknown
|
||||||
|
readonly property string bio: d.contactDetails.bio ?? ""
|
||||||
|
|
||||||
|
// Backwards compatibility properties - Don't use in new code
|
||||||
|
// TODO: #14965 - Try to remove these properties
|
||||||
|
readonly property string name: ensName
|
||||||
|
readonly property int verificationStatus: outgoingVerificationStatus
|
||||||
|
|
||||||
|
// Extra properties provided by getContactDetailsAsJson, not available in the model
|
||||||
|
// TODO: #14964 - Review all the model rolenames and fill the rest of the properties with data from the model
|
||||||
|
//readonly property int verificationStatus: d.contactDetails.verificationStatus ?? Constants.verificationStatus.unverified
|
||||||
|
//readonly property var socialLinks: d.contactDetails.socialLinks ?? []
|
||||||
|
|
||||||
|
ModelEntry {
|
||||||
|
id: itemData
|
||||||
|
sourceModel: root.publicKey !== "" && !d.isMe ? contactsStore.contactsModel : null
|
||||||
|
key: "pubKey"
|
||||||
|
value: root.publicKey
|
||||||
|
cacheOnRemoval: true
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject {
|
||||||
|
id: d
|
||||||
|
property bool loading: !itemData.available && !isMe
|
||||||
|
onLoadingChanged: {
|
||||||
|
if (loading) {
|
||||||
|
contactsStore.requestContactInfo(root.publicKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly property bool isMe: root.contactsStore.myPublicKey === root.publicKey
|
||||||
|
readonly property var ownProfile: QObject {
|
||||||
|
readonly property string displayName: root.profileStore.displayName
|
||||||
|
readonly property string ensName: root.profileStore.name
|
||||||
|
readonly property bool isEnsVerified: root.profileStore.name !== ""
|
||||||
|
readonly property string localNickname: ""
|
||||||
|
readonly property string alias: root.profileStore.username
|
||||||
|
readonly property string icon: root.profileStore.icon
|
||||||
|
readonly property int colorId: root.profileStore.colorId
|
||||||
|
readonly property var colorHash: root.profileStore.colorHash
|
||||||
|
readonly property int onlineStatus: root.profileStore.currentUserStatus
|
||||||
|
readonly property bool isContact: false
|
||||||
|
readonly property bool isCurrentUser: true
|
||||||
|
readonly property bool isVerified: false
|
||||||
|
readonly property bool isUntrustworthy: false
|
||||||
|
readonly property bool isBlocked: false
|
||||||
|
readonly property int contactRequestState: Constants.ContactRequestState.None
|
||||||
|
readonly property int incomingVerificationStatus: Constants.verificationStatus.unverified
|
||||||
|
readonly property int outgoingVerificationStatus: Constants.verificationStatus.unverified
|
||||||
|
readonly property string defaultDisplayName: root.profileStore.defaultDisplayName
|
||||||
|
readonly property string optionalName: defaultDisplayName
|
||||||
|
readonly property string name: defaultDisplayName
|
||||||
|
readonly property int lastUpdated: 0
|
||||||
|
readonly property int lastUpdatedLocally: 0
|
||||||
|
readonly property string thumbnailImage: root.profileStore.thumbnailImage
|
||||||
|
readonly property string largeImage: root.profileStore.largeImage
|
||||||
|
readonly property bool isContactRequestReceived: Constants.ContactRequestState.None
|
||||||
|
readonly property bool isContactRequestSent: Constants.ContactRequestState.None
|
||||||
|
readonly property bool isSyncing: false
|
||||||
|
readonly property bool removed: false
|
||||||
|
readonly property int trustStatus: Constants.trustStatus.unknown
|
||||||
|
readonly property string bio: root.profileStore.bio
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly property var contactDetails: !isMe ? itemData.item : ownProfile
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,3 +3,4 @@ ProfileShowcaseModelAdapter 1.0 ProfileShowcaseModelAdapter.qml
|
||||||
ProfileShowcaseSettingsModelAdapter 1.0 ProfileShowcaseSettingsModelAdapter.qml
|
ProfileShowcaseSettingsModelAdapter 1.0 ProfileShowcaseSettingsModelAdapter.qml
|
||||||
ProfileShowcaseModels 1.0 ProfileShowcaseModels.qml
|
ProfileShowcaseModels 1.0 ProfileShowcaseModels.qml
|
||||||
VisibilityAndPositionDirtyStateModel 1.0 VisibilityAndPositionDirtyStateModel.qml
|
VisibilityAndPositionDirtyStateModel 1.0 VisibilityAndPositionDirtyStateModel.qml
|
||||||
|
ContactDetails 1.0 ContactDetails.qml
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import QtQuick 2.13
|
import QtQuick 2.13
|
||||||
import utils 1.0
|
import utils 1.0
|
||||||
|
|
||||||
|
import StatusQ 0.1
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
|
@ -11,6 +13,8 @@ QtObject {
|
||||||
|
|
||||||
property string myPublicKey: !!Global.userProfile? Global.userProfile.pubKey : ""
|
property string myPublicKey: !!Global.userProfile? Global.userProfile.pubKey : ""
|
||||||
|
|
||||||
|
// contactsModel holds all available contacts
|
||||||
|
property var contactsModel: contactsModule.contactsModel
|
||||||
property var myContactsModel: contactsModule.myMutualContactsModel
|
property var myContactsModel: contactsModule.myMutualContactsModel
|
||||||
property var blockedContactsModel: contactsModule.blockedContactsModel
|
property var blockedContactsModel: contactsModule.blockedContactsModel
|
||||||
property var receivedContactRequestsModel: contactsModule.receivedContactRequestsModel
|
property var receivedContactRequestsModel: contactsModule.receivedContactRequestsModel
|
||||||
|
|
|
@ -19,6 +19,12 @@ QtObject {
|
||||||
property var privacyStore: profileSectionModule.privacyModule
|
property var privacyStore: profileSectionModule.privacyModule
|
||||||
readonly property string keyUid: !!Global.userProfile ? Global.userProfile.keyUid : ""
|
readonly property string keyUid: !!Global.userProfile ? Global.userProfile.keyUid : ""
|
||||||
readonly property bool isKeycardUser: !!Global.userProfile ? Global.userProfile.isKeycardUser : false
|
readonly property bool isKeycardUser: !!Global.userProfile ? Global.userProfile.isKeycardUser : false
|
||||||
|
readonly property int currentUserStatus: !!Global.userProfile ? Global.userProfile.currentUserStatus : 0
|
||||||
|
readonly property var thumbnailImage: !!Global.userProfile ? Global.userProfile.thumbnailImage : ""
|
||||||
|
readonly property var largeImage: !!Global.userProfile ? Global.userProfile.largeImage : ""
|
||||||
|
readonly property int colorId: Utils.colorIdForPubkey(root.pubkey)
|
||||||
|
readonly property var colorHash: Utils.getColorHashAsJson(root.pubkey, name != "")
|
||||||
|
readonly property string defaultDisplayName: Utils.getDefaultDisplayName("", name, displayName, username)
|
||||||
|
|
||||||
readonly property string bio: profileModule.bio
|
readonly property string bio: profileModule.bio
|
||||||
readonly property string socialLinksJson: profileModule.socialLinksJson
|
readonly property string socialLinksJson: profileModule.socialLinksJson
|
||||||
|
|
|
@ -5,3 +5,4 @@ NotificationsStore 1.0 NotificationsStore.qml
|
||||||
DevicesStore 1.0 DevicesStore.qml
|
DevicesStore 1.0 DevicesStore.qml
|
||||||
ProfileSectionStore 1.0 ProfileSectionStore.qml
|
ProfileSectionStore 1.0 ProfileSectionStore.qml
|
||||||
WalletStore 1.0 WalletStore.qml
|
WalletStore 1.0 WalletStore.qml
|
||||||
|
ContactsStore 1.0 ContactsStore.qml
|
||||||
|
|
Loading…
Reference in New Issue