Skip to content

Commit

Permalink
feat: re-fetch community info in community overview and channel
Browse files Browse the repository at this point in the history
Signed-off-by: yqrashawn <namy.19@gmail.com>
  • Loading branch information
yqrashawn committed Jan 12, 2024
1 parent 5cc027a commit 9b1671a
Show file tree
Hide file tree
Showing 16 changed files with 176 additions and 164 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@
[rn/touchable-opacity
{:on-press #(do
(rf/dispatch [:pop-to-root :shell-stack])
(rf/dispatch [:navigate-to :community-overview (:id community)])
(rf/dispatch [:communities/navigate-to-community-overview (:id community)])
(rf/dispatch [:chat/close]))}
[rn/text
{:style {:text-align :center
Expand Down
10 changes: 2 additions & 8 deletions src/status_im/common/router.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -259,12 +259,6 @@
{:type :wallet-account
:account (when account (string/lower-case account))})

(defn community-route-type
[route-params]
(if (string/starts-with? (:community-id route-params) "z")
:desktop-community
:community))

(defn handle-uri
[chain chats uri cb]
(let [{:keys [handler route-params query-params]} (match-uri uri)]
Expand Down Expand Up @@ -297,14 +291,14 @@
(cb {:type handler :community-id (:community-id route-params)})

(and (= handler :community) (:community-id route-params))
(cb {:type (community-route-type route-params)
(cb {:type :community
:community-id (:community-id route-params)})

(and (= handler :community-chat) (:community-channel-id route-params) (:community-id route-params))
(match-community-channel-async route-params cb)

(and (= handler :community-chat) (:community-id route-params))
(cb {:type (community-route-type route-params)
(cb {:type :community
:community-id (:community-id route-params)})

;; NOTE: removed in `match-uri`, might need this in the future
Expand Down
47 changes: 27 additions & 20 deletions src/status_im/common/universal_links.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -68,31 +68,39 @@
(log/info "universal-links: handling community request " community-id)
(navigation/navigate-to cofx :community-requests-to-join {:community-id community-id}))

(rf/defn handle-community
[cofx {:keys [community-id]}]
(log/info "universal-links: handling community" community-id)
(navigation/navigate-to cofx :community {:community-id community-id}))

(rf/defn handle-navigation-to-desktop-community-from-mobile
{:events [:handle-navigation-to-desktop-community-from-mobile]}
[cofx deserialized-key]
(rf/merge
cofx
{:dispatch [:navigate-to :community-overview deserialized-key]}
(navigation/pop-to-root :shell-stack)))

(rf/defn handle-desktop-community
(rf/defn navigate-to-serialized-community
[_ {:keys [community-id]}]
(native-module/deserialize-and-compress-key
community-id
(fn [deserialized-key]
(rf/dispatch [:chat.ui/fetch-community (str deserialized-key)])
(rf/dispatch [:handle-navigation-to-desktop-community-from-mobile (str deserialized-key)]))))
(rf/dispatch [:communities/navigate-to-community-overview (str deserialized-key)]))))

(rf/defn navigate-to-community-overview
{:events [:communities/navigate-to-community-overview]}
[cofx deserialized-key]
(if (string/starts-with? deserialized-key "z")
(navigate-to-serialized-community cofx deserialized-key)
(rf/merge
cofx
{:fx [[:communities/fetch-community deserialized-key]
[:dispatch [:navigate-to :community-overview deserialized-key]]]}
(navigation/pop-to-root :shell-stack))))

(rf/defn handle-community-chat
[cofx {:keys [chat-id]}]
{:events [:univeral-links/handle-community-chat]}
[_ {:keys [chat-id]}]
(log/info "universal-links: handling community chat" chat-id)
{:dispatch [:chat/pop-to-root-and-navigate-to-chat chat-id]})
{:dispatch [:communities/navigate-to-community-chat chat-id true]})

(rf/reg-event-fx :communities/navigate-to-community-chat
(fn [{:keys [db]} [chat-id pop-to-root?]]
(let [chat (get-in db [:chats chat-id])
community-id (get chat :community-id)]
{:fx [(when community-id
[:dispatch [:communities/fetch-community community-id]])
(if pop-to-root?
[:dispatch [:univeral-links/handle-community-chat chat]]
[:dispatch [:chat/navigate-to-chat chat-id]])]})))

(rf/defn handle-view-profile
[{:keys [db] :as cofx} {:keys [public-key ens-name]}]
Expand Down Expand Up @@ -148,8 +156,7 @@
:group-chat (handle-group-chat cofx data)
:private-chat (handle-private-chat cofx data)
:community-requests (handle-community-requests cofx data)
:community (handle-community cofx data)
:desktop-community (handle-desktop-community cofx data)
:community (navigate-to-serialized-community cofx data)
:community-chat (handle-community-chat cofx data)
:contact (handle-view-profile cofx data)
:browser (handle-browse cofx data)
Expand Down
4 changes: 3 additions & 1 deletion src/status_im/contexts/chat/events.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,9 @@
{:events [:chat/navigate-to-chat]}
[{db :db :as cofx} chat-id animation]
(rf/merge cofx
{:dispatch [(if animation :shell/navigate-to :navigate-to) :chat chat-id animation]}
{:fx [[:dispatch [(if animation :shell/navigate-to :navigate-to) :chat chat-id animation]]
(when-let [community-id (get-in db [:chats chat-id :community-id])]
[:dispatch [:communities/fetch-community community-id]])]}
(close-chat)
(force-close-chat chat-id)
(fn [{:keys [db]}]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
(ns status-im.contexts.chat.messenger.messages.link-preview.events
(:require
[camel-snake-kebab.core :as csk]
[legacy.status-im.mailserver.core :as mailserver]
[schema.core :as schema]
[status-im.contexts.profile.settings.events :as profile.settings.events]
[taoensso.timbre :as log]
[utils.collection]
Expand Down Expand Up @@ -42,96 +40,6 @@
(boolean enabled?)
{}))

(defn community-resolved
[{:keys [db]} [community-id community]]
(when community
{:db (update db :communities/resolve-community-info dissoc community-id)
:fx [[:dispatch [:communities/handle-community community]]
[:dispatch
[:chat.ui/cache-link-preview-data (community-link community-id) community]]]}))

(rf/reg-event-fx :chat.ui/community-resolved community-resolved)

(defn community-failed-to-resolve
[{:keys [db]} [community-id]]
{:db (update db :communities/resolve-community-info dissoc community-id)})

(rf/reg-event-fx :chat.ui/community-failed-to-resolve community-failed-to-resolve)

(defn fetch-community
[{:keys [db]} [community-id]]
(when community-id
{:db (assoc-in db [:communities/resolve-community-info community-id] true)
:json-rpc/call [{:method "wakuext_fetchCommunity"
:params [{:CommunityKey community-id
:TryDatabase true
:WaitForResponse true}]
:on-success (fn [community]
(rf/dispatch [:chat.ui/community-resolved community-id community]))
:on-error (fn [err]
(rf/dispatch [:chat.ui/community-failed-to-resolve community-id])
(log/error {:message
"Failed to request community info from mailserver"
:error err}))}]}))

(schema/=> fetch-community
[:=>
[:catn
[:cofx :schema.re-frame/cofx]
[:args
[:schema [:catn [:community-id [:? :string]]]]]]
[:maybe
[:map
[:db map?]
[:json-rpc/call :schema.common/rpc-call]]]])

(rf/reg-event-fx :chat.ui/fetch-community fetch-community)

(defn spectate-community-success
[{:keys [db]} [{:keys [communities]}]]
(when-let [community (first communities)]
{:db (-> db
(assoc-in [:communities (:id community) :spectated] true)
(assoc-in [:communities (:id community) :spectating] false))
:fx [[:dispatch [:communities/handle-community community]]
[:dispatch [::mailserver/request-messages]]]}))

(rf/reg-event-fx :chat.ui/spectate-community-success spectate-community-success)

(defn spectate-community-failed
[{:keys [db]} [community-id]]
{:db (assoc-in db [:communities community-id :spectating] false)})

(rf/reg-event-fx :chat.ui/spectate-community-failed spectate-community-failed)

(defn spectate-community
[{:keys [db]} [community-id]]
(let [{:keys [spectated spectating joined]} (get-in db [:communities community-id])]
(when (and (not joined) (not spectated) (not spectating))
{:db (assoc-in db [:communities community-id :spectating] true)
:json-rpc/call [{:method "wakuext_spectateCommunity"
:params [community-id]
:on-success [:chat.ui/spectate-community-success]
:on-error (fn [err]
(log/error {:message
"Failed to spectate community"
:error err})
(rf/dispatch [:chat.ui/spectate-community-failed
community-id]))}]})))

(schema/=> spectate-community
[:=>
[:catn
[:cofx :schema.re-frame/cofx]
[:args
[:schema [:catn [:community-id [:? :string]]]]]]
[:maybe
[:map
[:db map?]
[:json-rpc/call :schema.common/rpc-call]]]])

(rf/reg-event-fx :chat.ui/spectate-community spectate-community)

(rf/defn save-link-preview-whitelist
{:events [:chat.ui/link-preview-whitelist-received]}
[{:keys [db]} whitelist]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

(t/deftest fetch-community
(t/testing "with community id"
(t/testing "update resolving indicator in db"
(t/testing "update fetching indicator in db"
(t/is (match?
{:db {:communities/resolve-community-info {"community-id" true}}}
{:db {:communities/fetching-community {"community-id" true}}}
(sut/fetch-community {} ["community-id"]))))
(t/testing "call the fetch community rpc method with correct community id"
(t/is (match?
Expand All @@ -23,58 +23,58 @@
nil
(sut/fetch-community {} []))))))

(t/deftest community-failed-to-resolve
(t/deftest community-failed-to-fetch
(t/testing "given a community id"
(t/testing "remove community id from resolving indicator in db"
(t/testing "remove community id from fetching indicator in db"
(t/is (match?
nil
(get-in (sut/community-failed-to-resolve {:db {:communities/resolve-community-info
{"community-id" true}}}
["community-id"])
[:db :communities/resolve-community-info "community-id"]))))))
(get-in (sut/community-failed-to-fetch {:db {:communities/fetching-community
{"community-id" true}}}
["community-id"])
[:db :communities/fetching-community "community-id"]))))))

(t/deftest community-resolved
(t/deftest community-fetched
(with-redefs [sut/community-link (fn [id] (str "community-link+" id))]
(t/testing "given a community"
(let [cofx {:db {:communities/resolve-community-info {"community-id" true}}}
(let [cofx {:db {:communities/fetching-community {"community-id" true}}}
arg ["community-id" {:id "community-id"}]]
(t/testing "remove community id from resolving indicator in db"
(t/testing "remove community id from fetching indicator in db"
(t/is (match?
nil
(get-in (sut/community-resolved cofx arg)
[:db :communities/resolve-community-info "community-id"]))))
(get-in (sut/community-fetched cofx arg)
[:db :communities/fetching-community "community-id"]))))
(t/testing "dispatch fxs"
(t/is (match?
{:fx [[:dispatch [:communities/handle-community {:id "community-id"}]]
[:dispatch
[:chat.ui/cache-link-preview-data "community-link+community-id"
{:id "community-id"}]]]}
(sut/community-resolved cofx arg))))))
(sut/community-fetched cofx arg))))))
(t/testing "given a joined community"
(let [cofx {:db {:communities/resolve-community-info {"community-id" true}}}
(let [cofx {:db {:communities/fetching-community {"community-id" true}}}
arg ["community-id" {:id "community-id" :joined true}]]
(t/testing "dispatch fxs, do not spectate community"
(t/is (match?
{:fx [[:dispatch [:communities/handle-community {:id "community-id"}]]
[:dispatch
[:chat.ui/cache-link-preview-data "community-link+community-id"
{:id "community-id"}]]]}
(sut/community-resolved cofx arg))))))
(sut/community-fetched cofx arg))))))
(t/testing "given a token-gated community"
(let [cofx {:db {:communities/resolve-community-info {"community-id" true}}}
(let [cofx {:db {:communities/fetching-community {"community-id" true}}}
arg ["community-id" {:id "community-id" :tokenPermissions [1]}]]
(t/testing "dispatch fxs, do not spectate community"
(t/is (match?
{:fx [[:dispatch [:communities/handle-community {:id "community-id"}]]
[:dispatch
[:chat.ui/cache-link-preview-data "community-link+community-id"
{:id "community-id"}]]]}
(sut/community-resolved cofx arg))))))
(sut/community-fetched cofx arg))))))
(t/testing "given nil community"
(t/testing "do nothing"
(t/is (match?
nil
(sut/community-resolved {} ["community-id" nil])))))))
(sut/community-fetched {} ["community-id" nil])))))))

(t/deftest spectate-community
(t/testing "given a joined community"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
(fn []
(when-not cached-preview-data
(let [community-id (community-id-from-link community-link)]
(rf/dispatch [:chat.ui/fetch-community community-id]))))
(rf/dispatch [:communities/fetch-community community-id]))))
:reagent-render
(fn []
(when cached-preview-data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@
[utils.re-frame :as rf]))

(defn token-requirements
[id]
(rf/dispatch [:communities/check-permissions-to-join-community id])
(fn []
[]
(fn [id]
(let [{:keys [can-request-access?
number-of-hold-tokens tokens]} (rf/sub [:community/token-gated-overview id])]
[rn/view {:style {:padding-horizontal 12}}
Expand Down
9 changes: 5 additions & 4 deletions src/status_im/contexts/communities/discover/view.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@
[quo/community-card-view-item
{:community (assoc item :cover cover)
:width width
:on-press #(rf/dispatch [:navigate-to :community-overview (:id item)])}]
:on-press #(rf/dispatch [:communities/navigate-to-community-overview (:id item)])}]
[quo/community-list-item
{:on-press (fn []
(rf/dispatch [:dismiss-keyboard])
(rf/dispatch [:navigate-to :community-overview (:id item)]))
(rf/dispatch [:communities/navigate-to-community-overview (:id item)]))
:on-long-press #(rf/dispatch
[:show-bottom-sheet
{:content (fn []
Expand Down Expand Up @@ -142,12 +142,13 @@
(if (= view-type :card-view)
[quo/community-card-view-item
{:community (assoc community :cover cover)
:on-press #(rf/dispatch [:navigate-to :community-overview (:id community)])}]
:on-press #(rf/dispatch [:communities/navigate-to-community-overview (:id community)])}]

[quo/community-list-item
{:on-press (fn []
(rf/dispatch [:dismiss-keyboard])
(rf/dispatch [:navigate-to :community-overview (:id community)]))
(rf/dispatch [:communities/navigate-to-community-overview
(:id community)]))
:on-long-press #(js/alert "TODO: to be implemented")}
community])]))
(if communities communities communities-ids))
Expand Down
Loading

0 comments on commit 9b1671a

Please sign in to comment.