From 5e814b7a035ebdfe13fa23d52dae5d8ee7b62c87 Mon Sep 17 00:00:00 2001 From: Andrea Maria Piana Date: Thu, 10 Nov 2022 18:23:14 +0000 Subject: [PATCH] Add display name --- src/status_im/data_store/contacts.cljs | 20 ++--- src/status_im/data_store/contacts_test.cljs | 20 ++--- src/status_im/multiaccounts/core.cljs | 31 +++++--- src/status_im/multiaccounts/core_test.cljs | 85 +++++++++++++++++++++ src/status_im/utils/test.cljs | 2 + 5 files changed, 128 insertions(+), 30 deletions(-) create mode 100644 src/status_im/multiaccounts/core_test.cljs diff --git a/src/status_im/data_store/contacts.cljs b/src/status_im/data_store/contacts.cljs index 7ca9b0ad4b..9f54982716 100644 --- a/src/status_im/data_store/contacts.cljs +++ b/src/status_im/data_store/contacts.cljs @@ -6,15 +6,17 @@ (defn <-rpc [contact] (-> contact - (clojure.set/rename-keys {:id :public-key - :ensVerifiedAt :ens-verified-at - :ensVerified :ens-verified - :ensVerificationRetries :ens-verification-retries - :hasAddedUs :has-added-us - :contactRequestState :contact-request-state - :lastENSClockValue :last-ens-clock-value - :lastUpdated :last-updated - :localNickname :nickname}) + (clojure.set/rename-keys + {:id :public-key + :ensVerifiedAt :ens-verified-at + :displayName :display-name + :ensVerified :ens-verified + :ensVerificationRetries :ens-verification-retries + :hasAddedUs :has-added-us + :contactRequestState :contact-request-state + :lastENSClockValue :last-ens-clock-value + :lastUpdated :last-updated + :localNickname :nickname}) (assoc :mutual? (and (:added contact) (:hasAddedUs contact))))) diff --git a/src/status_im/data_store/contacts_test.cljs b/src/status_im/data_store/contacts_test.cljs index 03cb559829..8ad893cf97 100644 --- a/src/status_im/data_store/contacts_test.cljs +++ b/src/status_im/data_store/contacts_test.cljs @@ -3,16 +3,18 @@ [status-im.data-store.contacts :as c])) (deftest contact<-rpc - (let [contact {:id "pk" - :address "address" - :name "name" - :identicon "identicon" + (let [contact {:id "pk" + :address "address" + :name "name" + :displayName "display-name" + :identicon "identicon" :lastUpdated 1} - expected-contact {:public-key "pk" - :address "address" - :mutual? nil - :name "name" - :identicon "identicon" + expected-contact {:public-key "pk" + :address "address" + :display-name "display-name" + :mutual? nil + :name "name" + :identicon "identicon" :last-updated 1}] (testing "<-rpc" (is (= expected-contact (c/<-rpc contact)))))) diff --git a/src/status_im/multiaccounts/core.cljs b/src/status_im/multiaccounts/core.cljs index 6483e9330d..a0254c3677 100644 --- a/src/status_im/multiaccounts/core.cljs +++ b/src/status_im/multiaccounts/core.cljs @@ -23,29 +23,36 @@ (defn contact-names "Returns map of all existing names for contact" - [{:keys [name preferred-name alias public-key ens-verified nickname]}] + [{:keys [name + display-name + preferred-name + alias + public-key + ens-verified + nickname]}] (let [ens-name (or preferred-name name)] (cond-> {:nickname nickname + :display-name display-name :three-words-name (or alias (gfycat/generate-gfy public-key))} ;; Preferred name is our own otherwise we make sure it's verified (or preferred-name (and ens-verified name)) (assoc :ens-name (str "@" (or (stateofus/username ens-name) ens-name)))))) +;; NOTE: this does a bit of unnecessary work, we could short-circuit the work +;; once the first two are found, i.e don't calculate short key if 2 are already +;; available (defn contact-two-names - "Returns vector of two names in next order nickname, ens name, three word name, public key" + "Returns vector of two names in next order nickname, ens name, display-name, three word name, public key" [{:keys [names public-key] :as contact} public-key?] - (let [{:keys [nickname ens-name three-words-name]} (or names (contact-names contact)) + (let [{:keys [nickname + ens-name + display-name + three-words-name]} (or names (contact-names contact)) short-public-key (when public-key? (utils/get-shortened-address public-key))] - (cond (not (string/blank? nickname)) - [nickname (or ens-name three-words-name short-public-key)] - (not (string/blank? ens-name)) - [ens-name (or three-words-name short-public-key)] - (not (string/blank? three-words-name)) - [three-words-name short-public-key] - :else - (when public-key? - [short-public-key short-public-key])))) + (->> [nickname ens-name display-name three-words-name short-public-key] + (remove string/blank?) + (take 2)))) (defn contact-with-names "Returns contact with :names map " diff --git a/src/status_im/multiaccounts/core_test.cljs b/src/status_im/multiaccounts/core_test.cljs new file mode 100644 index 0000000000..85d9fa7e1b --- /dev/null +++ b/src/status_im/multiaccounts/core_test.cljs @@ -0,0 +1,85 @@ +(ns status-im.multiaccounts.core-test + (:require [cljs.test :refer-macros [deftest is testing]] + [status-im.multiaccounts.core :as ma])) + +(def public-key "0x0461f576da67dc0bca9888cdb4cb28c80285b756b324109da94a081585ed6f007cf00afede6b3ee5638593674fee100b590318fc7bdb0054b8dd9445acea216ad2") +(def short-public-key "0x0461…ad2") +(def random-name "Studious Gold Mustang") +(def override-random-name (str "override" random-name)) +(def nickname "nickname") +(def override-nickname (str nickname "override")) +(def display-name "display-name") +(def override-display-name (str display-name "override")) +(def ens-name "jakubgs.eth") +(def formatted-ens (str "@" ens-name)) +(def override-ens-name (str "override" ens-name)) + +(def contact + {:nickname nickname + :name ens-name + :ens-verified true + :public-key public-key + :display-name display-name}) + +(deftest contact-two-names-test + (testing "names is nil" + (testing "nickname has precedence" + (is + (= [nickname formatted-ens] + (ma/contact-two-names contact public-key)))) + (testing "ens name is second option" + (is + (= [formatted-ens display-name] + (ma/contact-two-names + (dissoc contact :nickname) + public-key)))) + (testing "ens name is second option but not verified" + (is + (= [display-name random-name] + (ma/contact-two-names + (dissoc contact :nickname :ens-verified) + public-key)))) + (testing "display name is third option" + (is + (= [display-name random-name] + (ma/contact-two-names + (dissoc contact :nickname :name) + public-key)))) + (testing "3 random words is fallback" + (is + (= [random-name short-public-key] + (ma/contact-two-names + (dissoc contact + :nickname + :name + :display-name) + public-key))))) + (testing "names is provided" + (let [names {:nickname override-nickname + :display-name override-display-name + :three-words-name override-random-name + :ens-name override-ens-name} + contact-with-names (assoc contact :names names)] + + (testing "nickname has precedence" + (is + (= [override-nickname override-ens-name] + (ma/contact-two-names contact-with-names public-key)))) + (testing "ens name is second option" + (is + (= [override-ens-name override-display-name] + (ma/contact-two-names + (update contact-with-names :names dissoc :nickname) + public-key)))) + (testing "display name is third option" + (is + (= [override-display-name override-random-name] + (ma/contact-two-names + (update contact-with-names :names dissoc :nickname :ens-name) + public-key)))) + (testing "3 random words is fallback" + (is + (= [override-random-name short-public-key] + (ma/contact-two-names + (update contact-with-names :names dissoc :nickname :ens-name :display-name) + public-key))))))) diff --git a/src/status_im/utils/test.cljs b/src/status_im/utils/test.cljs index ef2ee44700..b4259f5e2b 100644 --- a/src/status_im/utils/test.cljs +++ b/src/status_im/utils/test.cljs @@ -50,6 +50,8 @@ accounts-data)) :logout (fn [] (.logout native-status)) + :generateAlias (fn [seed] + (.generateAlias native-status seed)) :generateAliasAndIdenticonAsync (fn [seed callback] (let [generated-identicon (.identicon native-status seed) generated-alias (.generateAlias native-status seed)]