diff --git a/src/status_im/multiaccounts/login/core.cljs b/src/status_im/multiaccounts/login/core.cljs index ade14df6175d..560f2c981878 100644 --- a/src/status_im/multiaccounts/login/core.cljs +++ b/src/status_im/multiaccounts/login/core.cljs @@ -43,6 +43,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] @@ -440,6 +441,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 000000000000..ec39fe6c459d --- /dev/null +++ b/src/status_im2/contexts/communities/discover/events.cljs @@ -0,0 +1,45 @@ +(ns status-im2.contexts.communities.discover.events + (:require [clojure.set :as set] + [clojure.string :as string] + [taoensso.timbre :as log] + [utils.re-frame :as rf])) + +(defn camel->kebab + [k] + (let [s (name k) + lower-cased (string/lower-case + (string/replace s #"([a-z])([A-Z])" "$1-$2")) + 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-keys + [m] + (reduce (fn [acc [k v]] + (let [new-key (if (keyword? k) (camel->kebab k) k)] + (cond + (map? v) (assoc acc new-key (rename-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-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/view.cljs b/src/status_im2/contexts/communities/discover/view.cljs index 595a13b1d8d4..b629fcdbf4b4 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 54a0db8181b3..e08b14c1fe1d 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 ee18f146987c..ff5d08b49297 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 8140239a315e..9a0c0de6e0b4 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)