/
widget.cljs
64 lines (51 loc) · 1.3 KB
/
widget.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
(ns pinkgorilla.ui.widget
"create state atom from clojure"
(:require
[clojure.walk :as w]
[clojure.string :as str]
[reagent.core :as reagent :refer [atom]]
[pinkgorilla.ui.pinkie :refer [register-tag]]))
(defn info [str]
(.log js/console str))
(def state-atom
(reagent/atom
{:test 123}))
; state
(defn resolve-state [x]
(info (str "found :widget: " x))
state-atom)
(defn walk-state [x]
(if (= x :widget)
(resolve-state x)
x))
; key
(defn widget-key [x]
(when (keyword? x)
(let [s (name x)]
(when (str/starts-with? s "widget:")
(let [name-key (subs s 7)
_ (info (str "widget key found: " name-key))
key (keyword name-key)]
key)))))
(defn is-key? [x]
(let [k (widget-key x)]
(if (nil? k) false true)))
(defn deref-key [k]
(k @state-atom))
(defn walk-key [x]
(if (is-key? x)
(let [k (widget-key x)]
[deref-key k])
x))
(defn resolve-widget
"replaces :widget inside a reagent-hiccup with state atom.
Leaves regular hiccup data unchanged."
[reagent-hiccup-syntax]
(->> reagent-hiccup-syntax
(clojure.walk/prewalk walk-state)
(clojure.walk/prewalk walk-key)))
(defn widget-state []
[:div
[:h1 "widget state: "]
[:p (str @state-atom)]])
(register-tag :p/widget-state widget-state)