Use new RPC endpoints to fetch and count unread notifications (#15245)

There are endpoint changes in the status-go PR #3237
https://github.com/status-im/status-go/pull/3237) that will cause breakage in
the Mobile & Desktop clients. The Desktop team has already implemented the
changes and is waiting for Mobile to do the same.

The new endpoints are generally better, more ergonomic to use. There's also a
new endpoint to allow fetching multiple unread counters for all types of
notifications so we can finally remove the dreadful workaround in mobile calling
`status-go` 10+ times in a row.

- Fixes https://github.com/status-im/status-mobile/issues/15119
- Fixes https://github.com/status-im/status-mobile/issues/15229
This commit is contained in:
Icaro Motta 2023-03-03 12:43:41 -03:00 committed by GitHub
parent 064204256e
commit 1f1ab30a4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 77 additions and 170 deletions

View File

@ -13,6 +13,16 @@
(and (= type notification-types/contact-request)
(= contact-id author)))
(defn parse-notification-counts-response
[response]
(reduce-kv (fn [acc k count-number]
(let [maybe-type (js/parseInt (name k) 10)]
(if (notification-types/all-supported maybe-type)
(assoc acc maybe-type count-number)
acc)))
{}
response))
(defn- rpc->type
[{:keys [type name] :as chat}]
(case type

View File

@ -107,3 +107,23 @@
"contact-id"
{:type notification-types/contact-request
:author "contactzzzz"}))))
(deftest parse-notification-counts-response-test
(is
(= {notification-types/one-to-one-chat 15
notification-types/private-group-chat 16
notification-types/mention 17
notification-types/reply 18
notification-types/contact-request 19
notification-types/admin 20
notification-types/contact-verification 21}
(store/parse-notification-counts-response
{(keyword (str notification-types/one-to-one-chat)) 15
(keyword (str notification-types/private-group-chat)) 16
(keyword (str notification-types/mention)) 17
(keyword (str notification-types/reply)) 18
(keyword (str notification-types/contact-request)) 19
(keyword (str notification-types/admin)) 20
(keyword (str notification-types/contact-verification)) 21
;; Unsupported type in the response is ignored
:999 100}))))

View File

@ -327,6 +327,9 @@
(def ^:const status-unread 2)
(def ^:const status-all 3)
(def ^:const read-type-read 1)
(def ^:const read-type-unread 2)
(def ^:const read-type-all 3)
(defn status
[filter-status]
@ -335,6 +338,15 @@
:all status-all
99))
(defn ->rpc-read-type
[read-type]
(case read-type
:read read-type-read
:unread read-type-unread
:all read-type-all
;; Send invalid type, so the backend fails fast.
-1))
(defn filter-type->rpc-param
[filter-type]
(cond
@ -353,15 +365,13 @@
(rf/defn notifications-fetch
[{:keys [db]} {:keys [cursor per-page filter-type filter-status reset-data?]}]
(when-not (get-in db [:activity-center :loading?])
(let [per-page (or per-page (defaults :notifications-per-page))
accepted? true]
(let [per-page (or per-page (defaults :notifications-per-page))]
{:db (assoc-in db [:activity-center :loading?] true)
:json-rpc/call [{:method "wakuext_activityCenterNotificationsBy"
:params [cursor
per-page
(filter-type->rpc-param filter-type)
(status filter-status)
accepted?]
:json-rpc/call [{:method "wakuext_activityCenterNotifications"
:params [{:cursor cursor
:limit per-page
:activityTypes (filter-type->rpc-param filter-type)
:readType (->rpc-read-type filter-status)}]
:on-success #(rf/dispatch [:activity-center.notifications/fetch-success
reset-data? %])
:on-error #(rf/dispatch [:activity-center.notifications/fetch-error
@ -421,19 +431,16 @@
to explicitly support fetching notifications for 'pending' contact requests."
{:events [:activity-center.notifications/fetch-pending-contact-requests]}
[{:keys [db]}]
(let [accepted? true]
{:db (assoc-in db [:activity-center :loading?] true)
:json-rpc/call
[{:method "wakuext_activityCenterNotificationsBy"
:params [start-or-end-cursor
20
[types/contact-request]
(status :unread)
accepted?]
:on-success #(rf/dispatch [:activity-center.notifications/fetch-pending-contact-requests-success
%])
:on-error #(rf/dispatch [:activity-center.notifications/fetch-error
types/contact-request :unread %])}]}))
{:db (assoc-in db [:activity-center :loading?] true)
:json-rpc/call
[{:method "wakuext_activityCenterNotifications"
:params [{:cursor start-or-end-cursor
:limit 20
:activityTypes [types/contact-request]
:readType (->rpc-read-type :unread)}]
:on-success #(rf/dispatch [:activity-center.notifications/fetch-pending-contact-requests-success %])
:on-error #(rf/dispatch [:activity-center.notifications/fetch-error types/contact-request :unread
%])}]})
(rf/defn notifications-fetch-pending-contact-requests-success
{:events [:activity-center.notifications/fetch-pending-contact-requests-success]}
@ -458,24 +465,19 @@
(rf/defn notifications-fetch-unread-count
{:events [:activity-center.notifications/fetch-unread-count]}
[_]
{:dispatch-n (mapv (fn [notification-type]
[:activity-center.notifications/fetch-unread-count-for-type notification-type])
types/all-supported)})
(rf/defn notifications-fetch-unread-count-for-type
{:events [:activity-center.notifications/fetch-unread-count-for-type]}
[_ notification-type]
{:json-rpc/call [{:method "wakuext_unreadAndAcceptedActivityCenterNotificationsCount"
:params [[notification-type]]
:on-success #(rf/dispatch [:activity-center.notifications/fetch-unread-count-success
notification-type %])
:on-error #(rf/dispatch [:activity-center.notifications/fetch-unread-count-error
%])}]})
{:json-rpc/call
[{:method "wakuext_activityCenterNotificationsCount"
:params [{:activityTypes types/all-supported
:readType (->rpc-read-type :unread)}]
:on-success #(rf/dispatch [:activity-center.notifications/fetch-unread-count-success %])
:on-error #(rf/dispatch [:activity-center.notifications/fetch-unread-count-error %])}]})
(rf/defn notifications-fetch-unread-count-success
{:events [:activity-center.notifications/fetch-unread-count-success]}
[{:keys [db]} notification-type result]
{:db (assoc-in db [:activity-center :unread-counts-by-type notification-type] result)})
[{:keys [db]} response]
{:db (assoc-in db
[:activity-center :unread-counts-by-type]
(activities/parse-notification-counts-response response))})
(rf/defn notifications-fetch-unread-count-error
{:events [:activity-center.notifications/fetch-unread-count-error]}

View File

@ -461,7 +461,7 @@
{:filter-type types/one-to-one-chat}])
(is (= :unread (get-in (h/db) [:activity-center :filter :status])))
(is (= "" (get-in @spy-queue [0 :args 0 :params 0]))
(is (= "" (get-in @spy-queue [0 :args 0 :params 0 :cursor]))
"Should be called with empty cursor when fetching first page")
(is (= "10" (get-in (h/db) [:activity-center :cursor])))
(is (= [{:chat-id "0x9"
@ -506,8 +506,7 @@
(rf/dispatch [:activity-center.notifications/fetch-next-page])
(is (= "wakuext_activityCenterNotificationsBy" (get-in @spy-queue [0 :args 0 :method])))
(is (= "10" (get-in @spy-queue [0 :args 0 :params 0]))
(is (= "10" (get-in @spy-queue [0 :args 0 :params 0 :cursor]))
"Should be called with current cursor")
(is (= "" (get-in (h/db) [:activity-center :cursor])))
(is (= [{:chat-id "0x9"
@ -540,32 +539,3 @@
:unread
:fake-error]
(:args (last @spy-queue))))))))
(deftest notifications-fetch-unread-count-test
(testing "fetches total notification count and store in db"
(h/run-test-sync
(setup)
(let [spy-queue (atom [])]
(h/stub-fx-with-callbacks :json-rpc/call
:on-success
(fn [{:keys [params]}]
(if (= types/mention (ffirst params))
9
0)))
(h/spy-fx spy-queue :json-rpc/call)
(rf/dispatch [:activity-center.notifications/fetch-unread-count])
(is (= "wakuext_unreadAndAcceptedActivityCenterNotificationsCount"
(get-in @spy-queue [0 :args 0 :method])))
(let [actual (get-in (h/db) [:activity-center :unread-counts-by-type])]
(is (= {types/one-to-one-chat 0
types/private-group-chat 0
types/contact-verification 0
types/contact-request 0
types/mention 9
types/reply 0
types/admin 0}
actual))
(is (= types/all-supported (set (keys actual)))))))))

View File

@ -3,7 +3,7 @@
"_comment": "Instead use: scripts/update-status-go.sh <rev>",
"owner": "status-im",
"repo": "status-go",
"version": "v0.135.2",
"commit-sha1": "6cdc0ed5a191f486b748b7f501ec78280ac61dfc",
"src-sha256": "1szxms3q5v0p5xnmvi96z5s8pxdnxgqzmq23jildchcrl16kqvc2"
"version": "v0.136.0",
"commit-sha1": "ebc1fc337c07b10c9c4a5caab8dae2c540ef54a1",
"src-sha256": "1fcv61k24zpp1cx6d9m7hn2zi5vbzqmfqz6r8l1dn5b09h3323a0"
}

103
yarn.lock
View File

@ -2222,27 +2222,6 @@
dependencies:
"@types/yargs-parser" "*"
"@walletconnect/browser-utils@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.7.1.tgz#2a28846cd4d73166debbbf7d470e78ba25616f5e"
integrity sha512-y6KvxPhi52sWzS0/HtA3EhdgmtG8mXcxdc26YURDOVC/BJh3MxV8E16JFrT4InylOqYJs6dcSLWVfcnJaiPtZw==
dependencies:
"@walletconnect/safe-json" "1.0.0"
"@walletconnect/types" "^1.7.1"
"@walletconnect/window-getters" "1.0.0"
"@walletconnect/window-metadata" "1.0.0"
detect-browser "5.2.0"
"@walletconnect/client-legacy@npm:@walletconnect/client@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.7.1.tgz#aaa74199bdc0605db9ac2ecdf8a463b271586d3b"
integrity sha512-xD8B8s1hL7Z5vJwb3L0u1bCVAk6cRQfIY9ycymf7KkmIhkAONQJNf2Y0C0xIpbPp2fdn9VwnSfLm5Ed/Ht/1IA==
dependencies:
"@walletconnect/core" "^1.7.1"
"@walletconnect/iso-crypto" "^1.7.1"
"@walletconnect/types" "^1.7.1"
"@walletconnect/utils" "^1.7.1"
"@walletconnect/client@^2.0.0-beta.23":
version "2.0.0-beta.23"
resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-2.0.0-beta.23.tgz#934f91beb66ec7bb1a79afc1973fcd48481ccbc5"
@ -2259,15 +2238,6 @@
"@walletconnect/utils" "^2.0.0-beta.23"
ws "^8.3.0"
"@walletconnect/core@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.7.1.tgz#321c14d63af81241658b028022e0e5fa6dc7f374"
integrity sha512-qO+4wykyRNiq3HEuaAA2pW2PDnMM4y7pyPAgiCwfHiqF4PpWvtcdB301hI0K5am9ghuqKZMy1HlE9LWNOEBvcw==
dependencies:
"@walletconnect/socket-transport" "^1.7.1"
"@walletconnect/types" "^1.7.1"
"@walletconnect/utils" "^1.7.1"
"@walletconnect/crypto@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.1.tgz#d4c1b1cd5dd1be88fe9a82dfc54cadbbb3f9d325"
@ -2301,15 +2271,6 @@
resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034"
integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ==
"@walletconnect/iso-crypto@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.7.1.tgz#c463bb5874686c2f21344e2c7f3cf4d71c34ca70"
integrity sha512-qMiW0kLN6KCjnLMD50ijIj1lQqjNjGszGUwrSVUiS2/Dp4Ecx+4QEtHbmVwGEkfx4kelYPFpDJV3ZJpQ4Kqg/g==
dependencies:
"@walletconnect/crypto" "^1.0.1"
"@walletconnect/types" "^1.7.1"
"@walletconnect/utils" "^1.7.1"
"@walletconnect/jsonrpc-provider@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.0.tgz#066ee5a8a8554c55ea68f9ebf6fe8f96cdb66e7e"
@ -2365,25 +2326,11 @@
dependencies:
"@walletconnect/jsonrpc-types" "^1.0.0"
"@walletconnect/safe-json@1.0.0", "@walletconnect/safe-json@^1.0.0":
"@walletconnect/safe-json@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2"
integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg==
"@walletconnect/socket-transport@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.7.1.tgz#cc4c8dcf21c40b805812ecb066b2abb156fdb146"
integrity sha512-Gu1RPro0eLe+HHtLhq/1T5TNFfO/HW2z3BnWuUYuJ/F8w1U9iK7+4LMHe+LTgwgWy9Ybcb2k0tiO5e3LgjHBHQ==
dependencies:
"@walletconnect/types" "^1.7.1"
"@walletconnect/utils" "^1.7.1"
ws "7.5.3"
"@walletconnect/types@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.7.1.tgz#86cc3832e02415dc9f518f3dcb5366722afbfc03"
integrity sha512-X0NunEUgq46ExDcKo7BnnFpFhuZ89bZ04/1FtohNziBWcP2Mblp2yf+FN7iwmZiuZ3bRTb8J1O4oJH2JGP9I7A==
"@walletconnect/types@^2.0.0-beta.23":
version "2.0.0-beta.23"
resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.0.0-beta.23.tgz#3adf5c8329b7807d8c8d4aa1419e470eab72445c"
@ -2394,19 +2341,6 @@
pino "^6.7.0"
pino-pretty "^4.3.0"
"@walletconnect/utils@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.7.1.tgz#f858d5f22425a4c2da2a28ae493bde7f2eecf815"
integrity sha512-7Lig9rruqTMaFuwEhBrArq1QgzIf2NuzO6J3sCUYCZh60EQ7uIZjekaDonQjiQJAbfYcgWUBm8qa0PG1TzYN3Q==
dependencies:
"@walletconnect/browser-utils" "^1.7.1"
"@walletconnect/encoding" "^1.0.0"
"@walletconnect/jsonrpc-utils" "^1.0.0"
"@walletconnect/types" "^1.7.1"
bn.js "4.11.8"
js-sha3 "0.8.0"
query-string "6.13.5"
"@walletconnect/utils@^2.0.0-beta.23":
version "2.0.0-beta.23"
resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.0.0-beta.23.tgz#005e4409a7014a66dda30389e4b1f31d186ebd0e"
@ -2424,12 +2358,12 @@
lodash.union "^4.6.0"
query-string "^6.13.5"
"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0":
"@walletconnect/window-getters@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8"
integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA==
"@walletconnect/window-metadata@1.0.0", "@walletconnect/window-metadata@^1.0.0":
"@walletconnect/window-metadata@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5"
integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA==
@ -3157,11 +3091,6 @@ bluebird@^3.5.4:
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
bn.js@4.11.8:
version "4.11.8"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
version "4.11.9"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
@ -4320,11 +4249,6 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
detect-browser@5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97"
integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==
detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
@ -7138,11 +7062,6 @@ js-levenshtein@^1.1.3:
resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
js-sha3@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@ -9308,15 +9227,6 @@ qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
query-string@6.13.5:
version "6.13.5"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8"
integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==
dependencies:
decode-uri-component "^0.2.0"
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
query-string@^6.13.5:
version "6.14.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a"
@ -9632,7 +9542,7 @@ react-native-share@^7.0.1:
integrity sha512-hq7nOirgih/zIF9UU9FuYKZ3NGvasu2c/eJesvyPKYiykTtgQZM+mvDwFk/ogEsGwRtTPJBtj8/6IyIFcGa7lw==
"react-native-status-keycard@git+https://github.com/status-im/react-native-status-keycard.git#refs/tags/v2.5.39":
version "2.5.38"
version "2.5.39"
resolved "git+https://github.com/status-im/react-native-status-keycard.git#93dd64754e676172310e6ea7187cc49f2dc013c6"
react-native-svg@^9.8.4:
@ -11771,11 +11681,6 @@ write-file-atomic@^3.0.0:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
ws@7.5.3:
version "7.5.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
ws@^1.1.0, ws@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"