From b3f3d51dae1809ad7a169850ce3368b864423602 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 24 Feb 2016 17:18:55 +0200 Subject: [PATCH] Improved routing (now using volatile instead direct mutation). --- src/uxbox/router.cljs | 62 +++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/uxbox/router.cljs b/src/uxbox/router.cljs index 05987d4f57..f39abd85e1 100644 --- a/src/uxbox/router.cljs +++ b/src/uxbox/router.cljs @@ -2,11 +2,17 @@ (:require [bidi.router] [bidi.bidi :as bidi] [goog.events :as events] + [cats.labs.lens :as l] + [uxbox.state :as s] [uxbox.rstore :as rs])) (enable-console-print!) -(def +router+ nil) +(defonce +router+ (volatile! nil)) + +(def ^:const route-l + (as-> (l/in [:route]) $ + (l/focus-atom $ s/state))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Events @@ -17,22 +23,22 @@ (reify rs/UpdateEvent (-apply-update [_ state] - (merge state - {:location handler} - (when route-params - {:location-params route-params}))))) + (let [route (merge {:id handler} + (when route-params + {:params route-params}))] + (assoc state :route route))))) (defn navigate - ([name] (navigate name nil)) - ([name params] - {:pre [(keyword? name)]} + ([id] (navigate id nil)) + ([id params] + {:pre [(keyword? id)]} (reify rs/EffectEvent (-apply-effect [_ state] - (let [loc (merge {:handler name} + (let [loc (merge {:handler id} (when params {:route-params params}))] - (bidi.router/set-location! +router+ loc)))))) + (bidi.router/set-location! @+router+ loc)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Router declaration @@ -41,22 +47,22 @@ (def ^:private page-route [[bidi/uuid :project-uuid] "/" [bidi/uuid :page-uuid]]) -(def ^:static - routes ["/" [["auth/login" :auth/login] - ;; ["auth/register" :auth/register] - ;; ["auth/recover" :auth/recover-password] - ["dashboard/" [["projects" :dashboard/projects] - ["elements" :dashboard/elements] - ["icons" :dashboard/icons] - ["colors" :dashboard/colors]]] - ["workspace/" [[page-route :workspace/page]]]]]) +(def ^:const routes + ["/" [["auth/login" :auth/login] + ["auth/register" :auth/register] + ["auth/recover" :auth/recover-password] + ["dashboard/" [["projects" :dashboard/projects] + ["elements" :dashboard/elements] + ["icons" :dashboard/icons] + ["colors" :dashboard/colors]]] + ["workspace/" [[page-route :workspace/page]]]]]) (defn init [] (let [opts {:on-navigate #(rs/emit! (update-location %)) - :default-location {:handler :dashboard/projects}} + :default-location {:handler :auth/login}} router (bidi.router/start-router! routes opts)] - (set! +router+ router))) + (vreset! +router+ router))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Public Api @@ -64,15 +70,13 @@ (defn go "Redirect the user to other url." - ([name] (go name nil)) - ([name params] (rs/emit! (navigate name params)))) + ([id] (go id nil)) + ([id params] (rs/emit! (navigate id params)))) (defn route-for "Given a location handler and optional parameter map, return the URI for such handler and parameters." - ([location] - (bidi/path-for routes location)) - ([location params] - (apply bidi/path-for routes location (into [] - (mapcat (fn [[k v]] [k v])) - params)))) + ([id] + (bidi/path-for routes id)) + ([id params] + (apply bidi/path-for routes id (into [] (mapcat (fn [[k v]] [k v])) params))))