From afe5b4015f0fdb5381db37becdf3228cefd7c76a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20Schl=C3=BCter?= Date: Wed, 18 Apr 2018 02:03:48 +0200 Subject: [PATCH] Handle events via UI instead of just the REPL --- src/airsonic_ui/events.cljs | 25 +++++++++++++++++++------ src/airsonic_ui/views.cljs | 31 ++++++++++++++++++------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/airsonic_ui/events.cljs b/src/airsonic_ui/events.cljs index f3d3eaa..cad841f 100644 --- a/src/airsonic_ui/events.cljs +++ b/src/airsonic_ui/events.cljs @@ -18,27 +18,40 @@ (string/join "&"))] (str config/server "/rest/" endpoint "?" query))) +(defn api-error? + "We need to look at the message body because the subsonic api always responds + with status 200" + [response] + (= "failed" (-> response :subsonic-response :status))) + +(defn error-message + [response] + (let [{:keys [code message]} (-> response :subsonic-response :error)] + (str "Code " code ": " message))) + (re-frame/reg-event-fx ::authenticate - (fn [{:keys [db]} [_ {:keys [user pass]}]] + (fn [{:keys [db]} [_ user pass]] {:db (update db :active-requests inc) :http-xhrio {:method :get :uri (api-url "ping" {:u user :p pass}) - :response-format (ajax/text-response-format) + :response-format (ajax/json-response-format {:keywords? true}) :on-success [::auth-successful user pass] - :on-failure [::auth-gone-bad]}})) + :on-failure [::api-failure]}})) (re-frame/reg-event-db ::auth-successful - (fn [db [_ user pass]] + (fn [db [_ user pass response]] + ;; TODO: Handle failures differently (-> (update db :active-requests dec) (assoc :login {:u user :p pass})))) (re-frame/reg-event-db - ::auth-gone-bad + ::api-failure (fn [db event] - (println "auth gone bad" event))) + (println "api call gone bad; CORS headers missing? check for :status 0" event) + db)) (re-frame/reg-event-db ::initialize-db diff --git a/src/airsonic_ui/views.cljs b/src/airsonic_ui/views.cljs index 9fb27c2..f5b199e 100644 --- a/src/airsonic_ui/views.cljs +++ b/src/airsonic_ui/views.cljs @@ -1,24 +1,29 @@ (ns airsonic-ui.views (:require [re-frame.core :as re-frame] - [airsonic-ui.config :as config] + [reagent.core :as r] + [airsonic-ui.events :as events] [airsonic-ui.subs :as subs])) (defn login-form [] - [:form {:method "get" - :action config/server - :on-click #(js/alert "bang bang! TODO: implement login via form")} - [:div - [:span "User"] - [:input {:type "text" :name "user"}]] - [:div - [:span "Password"] - [:input {:type "password" :name "pass"}]] - [:div - [:input {:type "submit" :value "submit"}]]]) + (let [user (r/atom "") + pass (r/atom "")] + (fn [] + [:div + [:div + [:span "User"] + [:input {:type "text" + :name "user" + :on-change #(reset! user (-> % .-target .-value))}]] + [:div + [:span "Password"] + [:input {:type "password" :name "pass" :on-change #(reset! pass (-> % .-target .-value))}]] + [:div + [:button {:on-click #(re-frame/dispatch [::events/authenticate @user @pass])} "Submit"]]]))) (defn app [user] [:div - [:h2 (str "Currently logged in as " user)]]) + [:h2 (str "Currently logged in as " user)] + [:a {:on-click #(re-frame/dispatch [::events/initialize-db]) :href "#"} "Logout"]]) (defn main-panel [] [:div