From d91e67cae7fd85765389ab64b3ada202c815b771 Mon Sep 17 00:00:00 2001 From: erikseppanen Date: Wed, 21 Jun 2023 10:07:00 -0400 Subject: [PATCH] Add featured-community data (#16232) --- src/status_im/multiaccounts/login/core.cljs | 2 + .../contexts/communities/discover/events.cljs | 45 +++++++++ .../communities/discover/events_test.cljs | 91 +++++++++++++++++++ .../contexts/communities/discover/view.cljs | 5 +- src/status_im2/subs/communities.cljs | 16 ++-- src/status_im2/subs/communities_test.cljs | 19 ---- src/status_im2/subs/root.cljs | 2 + 7 files changed, 150 insertions(+), 30 deletions(-) create mode 100644 src/status_im2/contexts/communities/discover/events.cljs create mode 100644 src/status_im2/contexts/communities/discover/events_test.cljs diff --git a/src/status_im/multiaccounts/login/core.cljs b/src/status_im/multiaccounts/login/core.cljs index 52d506ce50..bacada92b8 100644 --- a/src/status_im/multiaccounts/login/core.cljs +++ b/src/status_im/multiaccounts/login/core.cljs @@ -42,6 +42,7 @@ [status-im2.contexts.contacts.events :as contacts] [status-im2.navigation.events :as navigation] [status-im2.contexts.shell.constants :as shell.constants] + [status-im2.contexts.communities.discover.events :as contract-communities] [status-im2.common.log :as logging] [taoensso.timbre :as log] [status-im2.contexts.shell.utils :as shell.utils] @@ -449,6 +450,7 @@ (initialize-wallet-connect) (get-node-config) (communities/fetch) + (contract-communities/fetch-contract-communities) (communities/fetch-collapsed-community-categories) (communities/check-and-delete-pending-request-to-join) (logging/set-log-level (:log-level multiaccount)) diff --git a/src/status_im2/contexts/communities/discover/events.cljs b/src/status_im2/contexts/communities/discover/events.cljs new file mode 100644 index 0000000000..0dad94fc75 --- /dev/null +++ b/src/status_im2/contexts/communities/discover/events.cljs @@ -0,0 +1,45 @@ +(ns status-im2.contexts.communities.discover.events + (:require [camel-snake-kebab.core :as csk] + [clojure.string :as string] + [taoensso.timbre :as log] + [utils.re-frame :as rf])) + +(defn rename-contract-community-key + [k] + (let [s (name k) + lower-cased (csk/->kebab-case-string s) + starts-with-digit? (re-matches #"^\d.*" s) + predicate? (some #(string/starts-with? lower-cased %) + ["can-" "is-"])] + (cond starts-with-digit? s + predicate? (keyword (str lower-cased "?")) + :else (keyword lower-cased)))) + +(defn rename-contract-community-keys + [m] + (reduce (fn [acc [k v]] + (let [new-key (if (keyword? k) (rename-contract-community-key k) k)] + (cond + (map? v) (assoc acc new-key (rename-contract-community-keys v)) + :else (assoc acc new-key v)))) + {} + m)) + +(rf/defn handle-contract-communities + {:events [:fetched-contract-communities]} + [{:keys [db]} contract-communities] + (let [cc (rename-contract-community-keys contract-communities) + featured (:contract-featured-communities cc) + other (remove (set featured) (:contract-communities cc))] + {:db (assoc db + :contract-communities + {:featured (select-keys (:communities cc) featured) + :other (select-keys (:communities cc) other)})})) + +(rf/defn fetch-contract-communities + [_] + {:json-rpc/call [{:method "wakuext_curatedCommunities" + :params [] + :on-success #(rf/dispatch [:fetched-contract-communities %]) + :on-error #(log/error "failed to fetch contract communities" %)}]}) + diff --git a/src/status_im2/contexts/communities/discover/events_test.cljs b/src/status_im2/contexts/communities/discover/events_test.cljs new file mode 100644 index 0000000000..0a2f9f701b --- /dev/null +++ b/src/status_im2/contexts/communities/discover/events_test.cljs @@ -0,0 +1,91 @@ +(ns status-im2.contexts.communities.discover.events-test + (:require [cljs.test :refer-macros [deftest are]] + [status-im2.contexts.communities.discover.events :as events])) + +(deftest rename-contract-community-key-test + (are [i e] (= (events/rename-contract-community-key i) e) + :foo :foo + :fooBar :foo-bar + :fooBarBaz :foo-bar-baz + :isFoo :is-foo? + :isFooBar :is-foo-bar? + :canFoo :can-foo? + :canFooBar :can-foo-bar? + :0x025d27e58 "0x025d27e58" + :093b4684-92f0 "093b4684-92f0" + :3f9e77b8-97c7 "3f9e77b8-97c7")) + +(deftest rename-contract-community-keys-test + (are [i e] (= (events/rename-contract-community-keys i) e) + + {:contractCommunities + ["0x032aa2439b14eb2caaf724223951da89de1530fbfa5d5a639b93b82cd5341713fd" + "0x025d27e58f1bece7d9675e6fe907da6e3b5007f06a327dd20db04d68851b9c153d" + "0x03769999b26cfd88788c882b56232fa5f58735795bdd463820d127b9a23d4415d4"] + :contractFeaturedCommunities + ["0x03769999b26cfd88788c882b56232fa5f58735795bdd463820d127b9a23d4415d4"] + :communities + {:0x025d27e58f1bece7d9675e6fe907da6e3b5007f06a327dd20db04d68851b9c153d + {:name "foo" + :tokenPermissions nil + :isMember false + :canDeleteMessageForEveryone false} + :0x032aa2439b14eb2caaf724223951da89de1530fbfa5d5a639b93b82cd5341713fd + {:name "bar" + :adminSettings {:pinMessageAllMembersEnabled false} + :chats + {:8aa21892-a768-488a-8655-7ed31f527642 + {:name "web" + :categoryID "d87621f7-315a-4579-a800-fde42d86ddf2" + :canPost false} + :6efc1767-22e5-46c1-9865-87206e04c9f9 + {:name "mobile-ui" + :categoryID "7445461a-bd10-4c54-86fe-70403913faf4" + :canPost false}}} + :0x03769999b26cfd88788c882b56232fa5f58735795bdd463820d127b9a23d4415d4 + {:name "baz" + :categories + {:18444776-8720-4955-b200-a55758889f43 {:name "bar" :position 0} + :093b4684-92f0-42dd-977c-05affc451ec8 {:name "foo" :position 1}} + :members + {:0x04a25e0a58ab97c6f93298ad87ab73aae5995365088a1ba150633ea25ff0b80cc1ddba18b122d117e477963cec1962219362a9a77226a6bf9a15d8d02c35fe8c9b + {} + :0x0490d2bb47388504e4b615052566e5830662bf202eb179251e9118587ce628c6c76e1f4550f9cd52058cf9dbdb5b788eea10b7c765cd7565675daa5f822acab8f4 + {}}}} + :unknownCommunities nil} + + {:contract-communities + ["0x032aa2439b14eb2caaf724223951da89de1530fbfa5d5a639b93b82cd5341713fd" + "0x025d27e58f1bece7d9675e6fe907da6e3b5007f06a327dd20db04d68851b9c153d" + "0x03769999b26cfd88788c882b56232fa5f58735795bdd463820d127b9a23d4415d4"] + :contract-featured-communities + ["0x03769999b26cfd88788c882b56232fa5f58735795bdd463820d127b9a23d4415d4"] + :communities + {"0x025d27e58f1bece7d9675e6fe907da6e3b5007f06a327dd20db04d68851b9c153d" + {:name "foo" + :token-permissions nil + :is-member? false + :can-delete-message-for-everyone? false} + "0x032aa2439b14eb2caaf724223951da89de1530fbfa5d5a639b93b82cd5341713fd" + {:name "bar" + :admin-settings {:pin-message-all-members-enabled false} + :chats + {"8aa21892-a768-488a-8655-7ed31f527642" + {:name "web" + :category-id "d87621f7-315a-4579-a800-fde42d86ddf2" + :can-post? false} + "6efc1767-22e5-46c1-9865-87206e04c9f9" + {:name "mobile-ui" + :category-id "7445461a-bd10-4c54-86fe-70403913faf4" + :can-post? false}}} + "0x03769999b26cfd88788c882b56232fa5f58735795bdd463820d127b9a23d4415d4" + {:name "baz" + :categories + {"18444776-8720-4955-b200-a55758889f43" {:name "bar" :position 0} + "093b4684-92f0-42dd-977c-05affc451ec8" {:name "foo" :position 1}} + :members + {"0x04a25e0a58ab97c6f93298ad87ab73aae5995365088a1ba150633ea25ff0b80cc1ddba18b122d117e477963cec1962219362a9a77226a6bf9a15d8d02c35fe8c9b" + {} + "0x0490d2bb47388504e4b615052566e5830662bf202eb179251e9118587ce628c6c76e1f4550f9cd52058cf9dbdb5b788eea10b7c765cd7565675daa5f822acab8f4" + {}}}} + :unknown-communities nil})) diff --git a/src/status_im2/contexts/communities/discover/view.cljs b/src/status_im2/contexts/communities/discover/view.cljs index f419a786dc..d1f197ae97 100644 --- a/src/status_im2/contexts/communities/discover/view.cljs +++ b/src/status_im2/contexts/communities/discover/view.cljs @@ -88,7 +88,6 @@ :label (i18n/label :t/gated) :accessibility-label :gated-communities-tab}]}]]) - (defn featured-list [communities view-type] (let [view-size (reagent/atom 0)] @@ -158,7 +157,7 @@ [rn/view {:style {:flex 1}} (case @selected-tab :all - (other-communities-list {:communities (rf/sub [:communities/sorted-communities]) + (other-communities-list {:communities (rf/sub [:communities/other-contract-communities]) :view-type view-type}) :open @@ -227,7 +226,7 @@ (defn discover [] - (let [featured-communities (rf/sub [:communities/featured-communities])] + (let [featured-communities (rf/sub [:communities/featured-contract-communities])] [rn/view {:style (style/discover-screen-container (colors/theme-colors colors/white diff --git a/src/status_im2/subs/communities.cljs b/src/status_im2/subs/communities.cljs index 54a0db8181..e08b14c1fe 100644 --- a/src/status_im2/subs/communities.cljs +++ b/src/status_im2/subs/communities.cljs @@ -71,16 +71,16 @@ (sort-by #(visibility-status-utils/visibility-status-order (get % 0))))))) (re-frame/reg-sub - :communities/featured-communities - :<- [:communities] - (fn [communities] - (vals communities))) + :communities/featured-contract-communities + :<- [:contract-communities] + (fn [contract-communities] + (sort-by :name (vals (:featured contract-communities))))) (re-frame/reg-sub - :communities/sorted-communities - :<- [:communities] - (fn [communities] - (sort-by :name (vals communities)))) + :communities/other-contract-communities + :<- [:contract-communities] + (fn [contract-communities] + (sort-by :name (vals (:other contract-communities))))) (re-frame/reg-sub :communities/community-ids diff --git a/src/status_im2/subs/communities_test.cljs b/src/status_im2/subs/communities_test.cljs index ee18f14698..ff5d08b492 100644 --- a/src/status_im2/subs/communities_test.cljs +++ b/src/status_im2/subs/communities_test.cljs @@ -78,25 +78,6 @@ :unviewed-mentions-count 0} (rf/sub [sub-name community-id]))))) -(h/deftest-sub :communities/sorted-communities - [sub-name] - (testing "Empty communities list" - (swap! rf-db/app-db assoc - :communities - {}) - (is (= [] - (rf/sub [sub-name])))) - (testing "communities sorted by name" - (swap! rf-db/app-db assoc - :communities - {"0x1" {:id "0x1" :name "Civilized monkeys"} - "0x2" {:id "0x2" :name "Civilized rats"} - "0x3" {:id "0x3" :name "Civilized dolphins"}}) - (is (= [{:id "0x3" :name "Civilized dolphins"} - {:id "0x1" :name "Civilized monkeys"} - {:id "0x2" :name "Civilized rats"}] - (rf/sub [sub-name]))))) - (h/deftest-sub :communities/categorized-channels [sub-name] (testing "Channels with categories" diff --git a/src/status_im2/subs/root.cljs b/src/status_im2/subs/root.cljs index 8140239a31..9a0c0de6e0 100644 --- a/src/status_im2/subs/root.cljs +++ b/src/status_im2/subs/root.cljs @@ -261,6 +261,8 @@ (reg-root-key-sub :communities/collapsed-categories :communities/collapsed-categories) (reg-root-key-sub :communities/selected-tab :communities/selected-tab) +(reg-root-key-sub :contract-communities :contract-communities) + (reg-root-key-sub :activity-center :activity-center) (reg-root-key-sub :bug-report/description-error :bug-report/description-error)