-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.cljs
50 lines (39 loc) · 1.61 KB
/
main.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(ns respo-ui.main
(:require [respo.core :refer [render! clear-cache! realize-ssr!]]
[respo.cursor :refer [mutate]]
[respo-ui.comp.container :refer [comp-container]]
[respo-router.core :refer [render-url!]]
[respo-router.listener :refer [listen!]]
[respo-router.parser :refer [parse-address]]
[respo-ui.router :as router]
[cljs.reader :refer [read-string]]
[respo-ui.schema :as schema]))
(defonce *store
(atom
(merge
schema/store
{:router (parse-address
(str (.-pathname js/location) (.-search js/location))
router/dict)})))
(defn updater [store op op-data]
(case op
:states (update store :states (mutate op-data))
:router/nav (assoc store :router (parse-address op-data router/dict))
store))
(defn dispatch! [op op-data]
(println "Dispatch!" op op-data)
(reset! *store (updater @*store op op-data)))
(def mount-target (.querySelector js/document ".app"))
(defn render-app! [renderer] (renderer mount-target (comp-container @*store) dispatch!))
(defn render-router! [] (render-url! (:router @*store) router/dict router/mode))
(def ssr? (some? (.querySelector js/document "meta.respo-ssr")))
(defn main! []
(if ssr? (render-app! realize-ssr!))
(render-app! render!)
(add-watch *store :changes (fn [] (render-app! render!)))
(render-router!)
(listen! router/dict dispatch! router/mode)
(add-watch *store :router-changes render-router!)
(println "App started!"))
(defn reload! [] (clear-cache!) (render-app! render!) (println "Code updated!"))
(set! js/window.onload main!)