87 lines
2.3 KiB
Clojure
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))
|