mirror of
https://github.com/heyarne/airsonic-ui.git
synced 2026-05-06 18:33:38 +02:00
Add router
This commit is contained in:
parent
afe5b4015f
commit
28d0c134d5
7 changed files with 79 additions and 11 deletions
|
|
@ -6,6 +6,7 @@
|
||||||
[[reagent "0.7.0"]
|
[[reagent "0.7.0"]
|
||||||
[re-frame "0.10.5"]
|
[re-frame "0.10.5"]
|
||||||
[day8.re-frame/http-fx "0.1.6"]
|
[day8.re-frame/http-fx "0.1.6"]
|
||||||
|
[funcool/bide "1.6.0"]
|
||||||
;; debugging
|
;; debugging
|
||||||
[day8.re-frame/re-frame-10x "0.3.2-react16"]
|
[day8.re-frame/re-frame-10x "0.3.2-react16"]
|
||||||
;; for CIDER
|
;; for CIDER
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
(:require [reagent.core :as reagent]
|
(:require [reagent.core :as reagent]
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[day8.re-frame.http-fx]
|
[day8.re-frame.http-fx]
|
||||||
|
[bide.core :as r]
|
||||||
|
[airsonic-ui.routes :as routes]
|
||||||
[airsonic-ui.events :as events]
|
[airsonic-ui.events :as events]
|
||||||
[airsonic-ui.views :as views]
|
[airsonic-ui.views :as views]
|
||||||
[airsonic-ui.config :as config]))
|
[airsonic-ui.config :as config]))
|
||||||
|
|
@ -11,6 +13,11 @@
|
||||||
(enable-console-print!)
|
(enable-console-print!)
|
||||||
(println "dev mode")))
|
(println "dev mode")))
|
||||||
|
|
||||||
|
(defn on-navigate
|
||||||
|
[name params query]
|
||||||
|
(println "Route changed to " name params query)
|
||||||
|
(re-frame/dispatch [::events/navigate name params query]))
|
||||||
|
|
||||||
(defn mount-root []
|
(defn mount-root []
|
||||||
(re-frame/clear-subscription-cache!)
|
(re-frame/clear-subscription-cache!)
|
||||||
(reagent/render [views/main-panel]
|
(reagent/render [views/main-panel]
|
||||||
|
|
@ -18,5 +25,7 @@
|
||||||
|
|
||||||
(defn ^:export init []
|
(defn ^:export init []
|
||||||
(re-frame/dispatch-sync [::events/initialize-db])
|
(re-frame/dispatch-sync [::events/initialize-db])
|
||||||
|
(r/start! routes/router {:default ::routes/login
|
||||||
|
:on-navigate on-navigate})
|
||||||
(dev-setup)
|
(dev-setup)
|
||||||
(mount-root))
|
(mount-root))
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
(ns airsonic-ui.db)
|
(ns airsonic-ui.db
|
||||||
|
(:require [airsonic-ui.routes :as routes]))
|
||||||
|
|
||||||
(def default-db
|
(def default-db
|
||||||
{:active-requests 0})
|
{:active-requests 0
|
||||||
|
;; because navigate! executes asynchronously we force to display the login screen first
|
||||||
|
:route routes/default})
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,17 @@
|
||||||
(ns airsonic-ui.events
|
(ns airsonic-ui.events
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[ajax.core :as ajax]
|
[ajax.core :as ajax]
|
||||||
|
[bide.core :as r]
|
||||||
|
[airsonic-ui.routes :as routes]
|
||||||
[airsonic-ui.config :as config]
|
[airsonic-ui.config :as config]
|
||||||
[airsonic-ui.db :as db]
|
[airsonic-ui.db :as db]
|
||||||
[clojure.string :as string]))
|
[clojure.string :as string]))
|
||||||
|
|
||||||
|
|
||||||
|
;; TODO: Remove impurities
|
||||||
|
|
||||||
|
;; api related functions
|
||||||
|
|
||||||
(defn ^:private uri-escape [s]
|
(defn ^:private uri-escape [s]
|
||||||
(js/encodeURIComponent s))
|
(js/encodeURIComponent s))
|
||||||
|
|
||||||
|
|
@ -43,6 +50,8 @@
|
||||||
::auth-successful
|
::auth-successful
|
||||||
(fn [db [_ user pass response]]
|
(fn [db [_ user pass response]]
|
||||||
;; TODO: Handle failures differently
|
;; TODO: Handle failures differently
|
||||||
|
;; TODO: Refactor navigation into effect
|
||||||
|
(r/navigate! routes/router ::routes/main)
|
||||||
(-> (update db :active-requests dec)
|
(-> (update db :active-requests dec)
|
||||||
(assoc :login {:u user
|
(assoc :login {:u user
|
||||||
:p pass}))))
|
:p pass}))))
|
||||||
|
|
@ -53,6 +62,26 @@
|
||||||
(println "api call gone bad; CORS headers missing? check for :status 0" event)
|
(println "api call gone bad; CORS headers missing? check for :status 0" event)
|
||||||
db))
|
db))
|
||||||
|
|
||||||
|
;; app interface
|
||||||
|
|
||||||
|
(defn authed?
|
||||||
|
"Predicate to determine whether we can access a specific route."
|
||||||
|
[route credentials]
|
||||||
|
(or (not (routes/protected route)) credentials))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::navigate
|
||||||
|
(fn [db [_ route]]
|
||||||
|
(println "authed?" route (authed? route (:login db)))
|
||||||
|
(if (authed? route (:login db))
|
||||||
|
;; continue to correct page
|
||||||
|
;; TODO: Fetch data based on route
|
||||||
|
(assoc db :route route)
|
||||||
|
;; logout and redirect to login
|
||||||
|
(do (re-frame/dispatch [::initialize-db])
|
||||||
|
(r/navigate! routes/router routes/default)
|
||||||
|
db))))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::initialize-db
|
::initialize-db
|
||||||
(fn [_]
|
(fn [_]
|
||||||
|
|
|
||||||
14
src/airsonic_ui/routes.cljs
Normal file
14
src/airsonic_ui/routes.cljs
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
(ns airsonic-ui.routes
|
||||||
|
(:require [bide.core :as r]))
|
||||||
|
|
||||||
|
;; routing is started in core.cljs
|
||||||
|
|
||||||
|
(def default ::login)
|
||||||
|
|
||||||
|
(def router
|
||||||
|
(r/router [["/" ::login]
|
||||||
|
["/hello" ::main]]))
|
||||||
|
|
||||||
|
;; routes that need valid credentials
|
||||||
|
|
||||||
|
(def protected #{::main})
|
||||||
|
|
@ -1,7 +1,16 @@
|
||||||
(ns airsonic-ui.subs
|
(ns airsonic-ui.subs
|
||||||
(:require [re-frame.core :as re-frame]))
|
(:require [re-frame.core :as re-frame]))
|
||||||
|
|
||||||
|
;; can be used to query the user's credentials
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::login
|
::login
|
||||||
(fn [db]
|
(fn [db]
|
||||||
(:login db)))
|
(:login db)))
|
||||||
|
|
||||||
|
;; ---
|
||||||
|
|
||||||
|
(re-frame/reg-sub
|
||||||
|
::current-page
|
||||||
|
(fn [db]
|
||||||
|
(:route db)))
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
(ns airsonic-ui.views
|
(ns airsonic-ui.views
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[reagent.core :as r]
|
[reagent.core :as r]
|
||||||
|
[airsonic-ui.routes :as routes]
|
||||||
[airsonic-ui.events :as events]
|
[airsonic-ui.events :as events]
|
||||||
[airsonic-ui.subs :as subs]))
|
[airsonic-ui.subs :as subs]))
|
||||||
|
|
||||||
|
|
@ -20,14 +21,16 @@
|
||||||
[:div
|
[:div
|
||||||
[:button {:on-click #(re-frame/dispatch [::events/authenticate @user @pass])} "Submit"]]])))
|
[:button {:on-click #(re-frame/dispatch [::events/authenticate @user @pass])} "Submit"]]])))
|
||||||
|
|
||||||
(defn app [user]
|
(defn app [current-page]
|
||||||
|
(let [login @(re-frame/subscribe [::subs/login])]
|
||||||
[:div
|
[:div
|
||||||
[:h2 (str "Currently logged in as " user)]
|
[:h2 (str "Currently logged in as " (:u login))]
|
||||||
[:a {:on-click #(re-frame/dispatch [::events/initialize-db]) :href "#"} "Logout"]])
|
[:a {:on-click #(re-frame/dispatch [::events/initialize-db]) :href "#"} "Logout"]]))
|
||||||
|
|
||||||
(defn main-panel []
|
(defn main-panel []
|
||||||
|
(let [current-page @(re-frame/subscribe [::subs/current-page])]
|
||||||
[:div
|
[:div
|
||||||
[:h1 "Airsonic"]
|
[:h1 "Airsonic"]
|
||||||
(if-let [login @(re-frame/subscribe [::subs/login])]
|
(case current-page
|
||||||
[app (:u login)]
|
::routes/login [login-form]
|
||||||
[login-form])])
|
[app current-page])]))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue