From d9c459e8779708c249b1337f36bcd3579c69ab60 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 11 May 2020 08:10:36 +0200 Subject: [PATCH] :sparkles: Improve (and fix many bugs) routing handling. --- frontend/src/uxbox/main.cljs | 29 +++++++++++-------- .../src/uxbox/main/ui/dashboard/profile.cljs | 2 +- frontend/src/uxbox/util/router.cljs | 27 ++++++++--------- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/frontend/src/uxbox/main.cljs b/frontend/src/uxbox/main.cljs index aff80f4bc..393dbcb79 100644 --- a/frontend/src/uxbox/main.cljs +++ b/frontend/src/uxbox/main.cljs @@ -13,6 +13,7 @@ [beicon.core :as rx] [goog.object :as gobj] [rumext.alpha :as mf] + [uxbox.common.uuid :as uuid] [uxbox.main.data.auth :refer [logout]] [uxbox.main.data.users :as udu] [uxbox.main.store :as st] @@ -23,6 +24,7 @@ [uxbox.util.i18n :as i18n] [uxbox.util.theme :as theme] [uxbox.util.router :as rt] + [uxbox.util.object :as obj] [uxbox.util.storage :refer [storage]] [uxbox.util.timers :as ts])) @@ -31,35 +33,38 @@ (defn on-navigate [router path] (let [match (rt/match router path) - profile (:profile storage)] + profile (:profile storage) + authed? (and (not (nil? profile)) + (not= (:id profile) uuid/zero))] (cond - (and (= path "") (not profile)) - (rt/nav :login) + (and (or (= path "") + (nil? match)) + (not authed?)) + (st/emit! (rt/nav :login)) + + (and (= path "") authed?) + (st/emit! (rt/nav :dashboard-team {:team-id (:default-team-id profile)})) - (and (= path "") profile) - (rt/nav :dashboard-team {:team-id (:default-team-id profile)}) (nil? match) - (rt/nav :not-found) + (st/emit! (rt/nav :not-found)) :else - #(assoc % :route match)))) + (st/emit! #(assoc % :route match))))) (defn init-ui [] (st/emit! (rt/initialize-router ui/routes) (rt/initialize-history on-navigate)) - (when (:profile storage) - (st/emit! udu/fetch-profile)) - + (st/emit! udu/fetch-profile) (mf/mount (mf/element ui/app) (dom/get-element "app")) (mf/mount (mf/element modal) (dom/get-element "modal"))) (defn ^:export init [] - (let [translations (gobj/get goog.global "uxboxTranslations") - themes (gobj/get goog.global "uxboxThemes")] + (let [translations (obj/get js/window "uxboxTranslations") + themes (gobj/get js/window "uxboxThemes")] (i18n/init! translations) (theme/init! themes) (st/init) diff --git a/frontend/src/uxbox/main/ui/dashboard/profile.cljs b/frontend/src/uxbox/main/ui/dashboard/profile.cljs index b1cc1ba2e..2932894c0 100644 --- a/frontend/src/uxbox/main/ui/dashboard/profile.cljs +++ b/frontend/src/uxbox/main/ui/dashboard/profile.cljs @@ -27,7 +27,7 @@ (mf/defc profile-section [{:keys [profile] :as props}] - (let [show (mf/use-state false) + (let [show (mf/use-state false) photo (:photo-uri profile "") photo (if (str/empty? photo) "/images/avatar.jpg" diff --git a/frontend/src/uxbox/util/router.cljs b/frontend/src/uxbox/util/router.cljs index e2c073d47..1fabe4e6b 100644 --- a/frontend/src/uxbox/util/router.cljs +++ b/frontend/src/uxbox/util/router.cljs @@ -2,19 +2,22 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2019 Andrey Antukh +;; This Source Code Form is "Incompatible With Secondary Licenses", as +;; defined by the Mozilla Public License, v. 2.0. +;; +;; Copyright (c) 2020 UXBOX Labs SL (ns uxbox.util.router (:refer-clojure :exclude [resolve]) (:require [beicon.core :as rx] - [rumext.alpha :as mf] - [reitit.core :as r] - [goog.events :as e] [cuerdas.core :as str] + [goog.events :as e] [potok.core :as ptk] + [reitit.core :as r] + [uxbox.common.data :as d] [uxbox.util.browser-history :as bhistory] - [uxbox.common.data :as d]) + [uxbox.util.timers :as ts]) (:import goog.Uri goog.Uri.QueryData)) @@ -120,21 +123,19 @@ (bhistory/enable! history) (assoc state :history history))) - ptk/WatchEvent - (watch [_ state stream] + ptk/EffectEvent + (effect [_ state stream] (let [stoper (rx/filter (ptk/type? ::initialize-history) stream) history (:history state) router (:router state)] - (rx/merge - (->> (rx/of (on-change router (.getToken history))) - (rx/observe-on :asap)) - (->> (rx/create (fn [sink] + (ts/schedule #(on-change router (.getToken history))) + (->> (rx/create (fn [sink] (let [key (e/listen history "navigate" #(sink (.-token %)))] (fn [] (bhistory/disable! history) (e/unlistenByKey key))))) - (rx/map #(on-change router %)) - (rx/take-until stoper))))))) + (rx/take-until stoper) + (rx/subs #(on-change router %)))))))