yenu/src/cljs/yenu/core.cljs
Aaron Fischer c2d1dd3227 Time to start over
+cljs +sqlite +sassc +reagent
2017-02-16 22:31:16 +01:00

87 lines
2.3 KiB
Clojure

(ns yenu.core
(:require [reagent.core :as r]
[reagent.session :as session]
[secretary.core :as secretary :include-macros true]
[goog.events :as events]
[goog.history.EventType :as HistoryEventType]
[markdown.core :refer [md->html]]
[yenu.ajax :refer [load-interceptors!]]
[ajax.core :refer [GET POST]])
(:import goog.History))
(defn nav-link [uri title page collapsed?]
[:li.nav-item
{:class (when (= page (session/get :page)) "active")}
[:a.nav-link
{:href uri
:on-click #(reset! collapsed? true)} title]])
(defn navbar []
(let [collapsed? (r/atom true)]
(fn []
[:nav.navbar.navbar-dark.bg-primary
[:button.navbar-toggler.hidden-sm-up
{:on-click #(swap! collapsed? not)} "☰"]
[:div.collapse.navbar-toggleable-xs
(when-not @collapsed? {:class "in"})
[:a.navbar-brand {:href "#/"} "yenu"]
[:ul.nav.navbar-nav
[nav-link "#/" "Home" :home collapsed?]
[nav-link "#/about" "About" :about collapsed?]]]])))
(defn about-page []
[:div.container
[:div.row
[:div.col-md-12
[:img {:src (str js/context "/img/warning_clojure.png")}]]]])
(defn home-page []
[:div.container
(when-let [docs (session/get :docs)]
[:div.row>div.col-sm-12
[:div {:dangerouslySetInnerHTML
{:__html (md->html docs)}}]])])
(def pages
{:home #'home-page
:about #'about-page})
(defn page []
[(pages (session/get :page))])
;; -------------------------
;; Routes
(secretary/set-config! :prefix "#")
(secretary/defroute "/" []
(session/put! :page :home))
(secretary/defroute "/about" []
(session/put! :page :about))
;; -------------------------
;; History
;; must be called after routes have been defined
(defn hook-browser-navigation! []
(doto (History.)
(events/listen
HistoryEventType/NAVIGATE
(fn [event]
(secretary/dispatch! (.-token event))))
(.setEnabled true)))
;; -------------------------
;; Initialize app
(defn fetch-docs! []
(GET "/docs" {:handler #(session/put! :docs %)}))
(defn mount-components []
(r/render [#'navbar] (.getElementById js/document "navbar"))
(r/render [#'page] (.getElementById js/document "app")))
(defn init! []
(load-interceptors!)
(fetch-docs!)
(hook-browser-navigation!)
(mount-components))