fix: generate_profile_url crash when login (#18364)
* fix: generate_profile_url.cljs$core$IFn$_invoke$arity$2 crash when login 'status_im.common.universal_links.generate_profile_url.cljs$core$IFn$_invoke$arity$2' is undefined update the function to a fixed arity function * fix: schema/=> macro for :function schema Signed-off-by: yqrashawn <namy.19@gmail.com> --------- Signed-off-by: yqrashawn <namy.19@gmail.com>
This commit is contained in:
parent
c91b4339dc
commit
be2d0feda3
|
@ -5,11 +5,17 @@
|
||||||
in non-debug environments.
|
in non-debug environments.
|
||||||
|
|
||||||
`value` is first transformed via `malli.core/schema` to make sure we fail fast
|
`value` is first transformed via `malli.core/schema` to make sure we fail fast
|
||||||
and only register valid schemas."
|
and only register valid schemas.
|
||||||
|
|
||||||
|
Pass raw schema `value` instead of schema instance when it's `:function` schema
|
||||||
|
https://github.com/status-im/status-mobile/pull/18364#issuecomment-1875543794"
|
||||||
[sym value]
|
[sym value]
|
||||||
`(if ^boolean js/goog.DEBUG
|
`(if ^boolean js/goog.DEBUG
|
||||||
(try
|
(try
|
||||||
(malli.core/=> ~sym (malli.core/schema ~value))
|
(let [schema-instance# (malli.core/schema ~value)]
|
||||||
|
(if (and (seq ~value) (= :function (first ~value)))
|
||||||
|
(malli.core/=> ~sym ~value)
|
||||||
|
(malli.core/=> ~sym schema-instance#)))
|
||||||
(catch js/Error e#
|
(catch js/Error e#
|
||||||
(taoensso.timbre/error "Failed to instrument function"
|
(taoensso.timbre/error "Failed to instrument function"
|
||||||
{:symbol ~sym :error e#})
|
{:symbol ~sym :error e#})
|
||||||
|
|
|
@ -200,24 +200,23 @@
|
||||||
(handle-url url))))
|
(handle-url url))))
|
||||||
|
|
||||||
(defn generate-profile-url
|
(defn generate-profile-url
|
||||||
([cofx] (generate-profile-url cofx nil))
|
[{:keys [db]} [{:keys [public-key cb]}]]
|
||||||
([{:keys [db]} [{:keys [public-key cb]}]]
|
(let [profile-public-key (get-in db [:profile/profile :public-key])
|
||||||
(let [profile-public-key (get-in db [:profile/profile :public-key])
|
profile? (or (not public-key) (= public-key profile-public-key))
|
||||||
profile? (or (not public-key) (= public-key profile-public-key))
|
ens-name? (if profile?
|
||||||
ens-name? (if profile?
|
(get-in db [:profile/profile :ens-name?])
|
||||||
(get-in db [:profile/profile :ens-name?])
|
(get-in db [:contacts/contacts public-key :ens-name]))
|
||||||
(get-in db [:contacts/contacts public-key :ens-name]))
|
public-key (if profile? profile-public-key public-key)]
|
||||||
public-key (if profile? profile-public-key public-key)]
|
(when public-key
|
||||||
(when public-key
|
{:json-rpc/call
|
||||||
{:json-rpc/call
|
[{:method (if ens-name? "wakuext_shareUserURLWithENS" "wakuext_shareUserURLWithData")
|
||||||
[{:method (if ens-name? "wakuext_shareUserURLWithENS" "wakuext_shareUserURLWithData")
|
:params [public-key]
|
||||||
:params [public-key]
|
:on-success (fn [url]
|
||||||
:on-success (fn [url]
|
(rf/dispatch [:universal-links/save-profile-url public-key url])
|
||||||
(rf/dispatch [:universal-links/save-profile-url public-key url])
|
(when (fn? cb) (cb)))
|
||||||
(when (fn? cb) (cb)))
|
:on-error #(log/error "failed to wakuext_shareUserURLWithData"
|
||||||
:on-error #(log/error "failed to wakuext_shareUserURLWithData"
|
{:error %
|
||||||
{:error %
|
:public-key public-key})}]})))
|
||||||
:public-key public-key})}]}))))
|
|
||||||
|
|
||||||
(schema/=> generate-profile-url
|
(schema/=> generate-profile-url
|
||||||
[:=>
|
[:=>
|
||||||
|
|
|
@ -5,11 +5,14 @@
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[status-im.common.universal-links :as links]))
|
[status-im.common.universal-links :as links]))
|
||||||
|
|
||||||
|
(def pubkey
|
||||||
|
"0x04fbce10971e1cd7253b98c7b7e54de3729ca57ce41a2bfb0d1c4e0a26f72c4b6913c3487fa1b4bb86125770f1743fb4459da05c1cbe31d938814cfaf36e252073")
|
||||||
|
|
||||||
(deftest handle-url-test
|
(deftest handle-url-test
|
||||||
(testing "the user is not logged in"
|
(testing "the user is not logged in"
|
||||||
(testing "it stores the url for later processing"
|
(testing "it stores the url for later processing"
|
||||||
(is (= {:db {:universal-links/url "some-url"}}
|
(is (match? {:db {:universal-links/url "some-url"}}
|
||||||
(links/handle-url {:db {}} "some-url")))))
|
(links/handle-url {:db {}} "some-url")))))
|
||||||
(testing "the user is logged in"
|
(testing "the user is logged in"
|
||||||
(let [db {:profile/profile {:public-key "pk"}
|
(let [db {:profile/profile {:public-key "pk"}
|
||||||
:app-state "active"
|
:app-state "active"
|
||||||
|
@ -18,9 +21,9 @@
|
||||||
(is (nil? (get-in (links/handle-url {:db db} "some-url")
|
(is (nil? (get-in (links/handle-url {:db db} "some-url")
|
||||||
[:db :universal-links/url]))))
|
[:db :universal-links/url]))))
|
||||||
(testing "Handle a custom string"
|
(testing "Handle a custom string"
|
||||||
(is (= (get-in (links/handle-url {:db db} "https://status.app/u#statuse2e")
|
(is (match? (get-in (links/handle-url {:db db} "https://status.app/u#statuse2e")
|
||||||
[:router/handle-uri :uri])
|
[:router/handle-uri :uri])
|
||||||
"https://status.app/u#statuse2e"))))))
|
"https://status.app/u#statuse2e"))))))
|
||||||
|
|
||||||
(deftest url-event-listener
|
(deftest url-event-listener
|
||||||
(testing "the url is not nil"
|
(testing "the url is not nil"
|
||||||
|
@ -28,77 +31,58 @@
|
||||||
(let [actual (atom nil)]
|
(let [actual (atom nil)]
|
||||||
(with-redefs [re-frame/dispatch #(reset! actual %)]
|
(with-redefs [re-frame/dispatch #(reset! actual %)]
|
||||||
(links/url-event-listener #js {:url "some-url"})
|
(links/url-event-listener #js {:url "some-url"})
|
||||||
(is (= [:universal-links/handle-url "some-url"] @actual))))))
|
(is (match? [:universal-links/handle-url "some-url"] @actual))))))
|
||||||
(testing "the url is nil"
|
(testing "the url is nil"
|
||||||
(testing "it does not dispatches the url"
|
(testing "it does not dispatches the url"
|
||||||
(let [actual (atom nil)]
|
(let [actual (atom nil)]
|
||||||
(with-redefs [re-frame/dispatch #(reset! actual %)]
|
(with-redefs [re-frame/dispatch #(reset! actual %)]
|
||||||
(links/url-event-listener #js {})
|
(links/url-event-listener #js {})
|
||||||
(is (= nil @actual)))))))
|
(is (match? nil @actual)))))))
|
||||||
|
|
||||||
(deftest generate-profile-url
|
(deftest generate-profile-url
|
||||||
(testing "user has ens name"
|
(testing "user has ens name"
|
||||||
(testing "it calls the ens rpc method with ens name as param"
|
(testing "it calls the ens rpc method with ens name as param"
|
||||||
(let [pubkey "pubkey"
|
(let [db {:profile/profile {:ens-name? true :public-key pubkey}}
|
||||||
db {:profile/profile {:ens-name? true :public-key pubkey}}
|
rst (links/generate-profile-url {:db db} [])]
|
||||||
rst (links/generate-profile-url {:db db})]
|
(are [result expected] (match? result expected)
|
||||||
(are [result expected] (= result expected)
|
|
||||||
"wakuext_shareUserURLWithENS" (-> rst :json-rpc/call first :method)
|
"wakuext_shareUserURLWithENS" (-> rst :json-rpc/call first :method)
|
||||||
pubkey (-> rst :json-rpc/call first :params first)))))
|
pubkey (-> rst :json-rpc/call first :params first)))))
|
||||||
(testing "user has no ens name"
|
(testing "user has no ens name"
|
||||||
(testing "it calls the ens rpc method with public keyas param"
|
(testing "it calls the ens rpc method with public keyas param"
|
||||||
(let [pubkey "pubkey"
|
(let [db {:profile/profile {:public-key pubkey}}
|
||||||
db {:profile/profile {:public-key pubkey}}
|
rst (links/generate-profile-url {:db db} [])]
|
||||||
rst (links/generate-profile-url {:db db})]
|
(are [result expected] (match? result expected)
|
||||||
(are [result expected] (= result expected)
|
|
||||||
"wakuext_shareUserURLWithData" (-> rst :json-rpc/call first :method)
|
"wakuext_shareUserURLWithData" (-> rst :json-rpc/call first :method)
|
||||||
pubkey (-> rst :json-rpc/call first :params first)))))
|
pubkey (-> rst :json-rpc/call first :params first)))))
|
||||||
(testing "contact has ens name"
|
(testing "contact has ens name"
|
||||||
(testing "it calls the ens rpc method with ens name as param"
|
(testing "it calls the ens rpc method with ens name as param"
|
||||||
(let [pubkey "pubkey"
|
(let [ens "ensname.eth"
|
||||||
ens "ensname.eth"
|
db {:contacts/contacts {pubkey {:ens-name ens}}}
|
||||||
db {:contacts/contacts {pubkey {:ens-name ens}}}
|
rst (links/generate-profile-url {:db db} [{:public-key pubkey}])]
|
||||||
rst (links/generate-profile-url {:db db} [{:public-key pubkey}])]
|
(are [result expected] (match? result expected)
|
||||||
(are [result expected] (= result expected)
|
|
||||||
"wakuext_shareUserURLWithENS" (-> rst :json-rpc/call first :method)
|
"wakuext_shareUserURLWithENS" (-> rst :json-rpc/call first :method)
|
||||||
pubkey (-> rst :json-rpc/call first :params first)))))
|
pubkey (-> rst :json-rpc/call first :params first)))))
|
||||||
(testing "contact has no ens name"
|
(testing "contact has no ens name"
|
||||||
(testing "it calls the ens rpc method with public keyas param"
|
(testing "it calls the ens rpc method with public keyas param"
|
||||||
(let [pubkey "pubkey"
|
(let [db {:contacts/contacts {pubkey {:public-key pubkey}}}
|
||||||
db {:contacts/contacts {pubkey {:public-key pubkey}}}
|
rst (links/generate-profile-url {:db db} [{:public-key pubkey}])]
|
||||||
rst (links/generate-profile-url {:db db} [{:public-key pubkey}])]
|
(are [result expected] (match? result expected)
|
||||||
(are [result expected] (= result expected)
|
|
||||||
"wakuext_shareUserURLWithData" (-> rst :json-rpc/call first :method)
|
"wakuext_shareUserURLWithData" (-> rst :json-rpc/call first :method)
|
||||||
pubkey (-> rst :json-rpc/call first :params first))))))
|
pubkey (-> rst :json-rpc/call first :params first))))))
|
||||||
|
|
||||||
(deftest save-profile-url
|
(deftest save-profile-url
|
||||||
(testing "given a contact public key and profile url"
|
(testing "given a contact public key and profile url"
|
||||||
(testing "it updates the contact in db"
|
(testing "it updates the contact in db"
|
||||||
(let [pubkey "pubkey"
|
(let [url "url"
|
||||||
url "url"
|
db {:contacts/contacts {pubkey {:public-key pubkey}}}
|
||||||
db {:contacts/contacts {pubkey {:public-key pubkey}}}
|
rst (links/save-profile-url {:db db} [pubkey url])]
|
||||||
rst (links/save-profile-url {:db db} [pubkey url])]
|
(is (match? (get-in rst [:db :contacts/contacts pubkey :universal-profile-url]) url)))))
|
||||||
(is (= (get-in rst [:db :contacts/contacts pubkey :universal-profile-url]) url)))))
|
|
||||||
(testing "given a user public key and profile url"
|
(testing "given a user public key and profile url"
|
||||||
(testing "it updates the user profile in db"
|
(testing "it updates the user profile in db"
|
||||||
(let [pubkey "pubkey"
|
(let [url "url"
|
||||||
url "url"
|
db {:profile/profile {:public-key pubkey}}
|
||||||
db {:profile/profile {:public-key pubkey}}
|
rst (links/save-profile-url {:db db} [pubkey url])]
|
||||||
rst (links/save-profile-url {:db db} [pubkey url])]
|
(is (match? (get-in rst [:db :profile/profile :universal-profile-url]) url))))))
|
||||||
(is (= (get-in rst [:db :profile/profile :universal-profile-url]) url)))))
|
|
||||||
(testing "given a invalid url"
|
|
||||||
(testing "it returns the db untouched"
|
|
||||||
(let [pubkey "pubkey"
|
|
||||||
url "url"
|
|
||||||
db {:profile/profile {:public-key pubkey}}
|
|
||||||
rst (links/save-profile-url {:db db} ["invalid pubkey" url])]
|
|
||||||
(is (= (:db rst) db)))))
|
|
||||||
(testing "given a nil as url"
|
|
||||||
(testing "it returns nil"
|
|
||||||
(let [pubkey "pubkey"
|
|
||||||
db {:profile/profile {:public-key pubkey}}
|
|
||||||
rst (links/save-profile-url {:db db} ["invalid pubkey"])]
|
|
||||||
(is (nil? rst))))))
|
|
||||||
|
|
||||||
(deftest universal-link-test
|
(deftest universal-link-test
|
||||||
(testing "universal-link?"
|
(testing "universal-link?"
|
||||||
|
|
|
@ -80,9 +80,10 @@
|
||||||
[:cofx :schema.re-frame/cofx]
|
[:cofx :schema.re-frame/cofx]
|
||||||
[:args
|
[:args
|
||||||
[:schema [:catn [:community-id [:? :string]]]]]]
|
[:schema [:catn [:community-id [:? :string]]]]]]
|
||||||
[:map
|
[:maybe
|
||||||
[:db map?]
|
[:map
|
||||||
[:json-rpc/call :schema.common/rpc-call]]])
|
[:db map?]
|
||||||
|
[:json-rpc/call :schema.common/rpc-call]]]])
|
||||||
|
|
||||||
(rf/reg-event-fx :chat.ui/fetch-community fetch-community)
|
(rf/reg-event-fx :chat.ui/fetch-community fetch-community)
|
||||||
|
|
||||||
|
@ -124,9 +125,10 @@
|
||||||
[:cofx :schema.re-frame/cofx]
|
[:cofx :schema.re-frame/cofx]
|
||||||
[:args
|
[:args
|
||||||
[:schema [:catn [:community-id [:? :string]]]]]]
|
[:schema [:catn [:community-id [:? :string]]]]]]
|
||||||
[:map
|
[:maybe
|
||||||
[:db map?]
|
[:map
|
||||||
[:json-rpc/call :schema.common/rpc-call]]])
|
[:db map?]
|
||||||
|
[:json-rpc/call :schema.common/rpc-call]]]])
|
||||||
|
|
||||||
(rf/reg-event-fx :chat.ui/spectate-community spectate-community)
|
(rf/reg-event-fx :chat.ui/spectate-community spectate-community)
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
:TryDatabase true
|
:TryDatabase true
|
||||||
:WaitForResponse true}]}]}
|
:WaitForResponse true}]}]}
|
||||||
(sut/fetch-community {} ["community-id"])))))
|
(sut/fetch-community {} ["community-id"])))))
|
||||||
(t/testing "with nil community id"
|
(t/testing "with no community id"
|
||||||
(t/testing "do nothing"
|
(t/testing "do nothing"
|
||||||
(t/is (match?
|
(t/is (match?
|
||||||
nil
|
nil
|
||||||
(sut/fetch-community {} nil))))))
|
(sut/fetch-community {} []))))))
|
||||||
|
|
||||||
(t/deftest community-failed-to-resolve
|
(t/deftest community-failed-to-resolve
|
||||||
(t/testing "given a community id"
|
(t/testing "given a community id"
|
||||||
|
|
Loading…
Reference in New Issue