/
utils.clj
55 lines (51 loc) · 2.13 KB
/
utils.clj
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
(ns devcards.util.utils
(:require [cljs.env]))
(defn devcards-active? []
(and cljs.env/*compiler*
(when-let [{:keys [options]} @cljs.env/*compiler*]
(or (:devcards options)
(when-let [closure-defines (get options :closure-defines)]
(or (get closure-defines "devcards.core.active")
(get closure-defines "devcards.core/active")))))))
(defn specify-react-class! [body]
(let [constructor-fn (when-let [cf
(->> body
(filter #(= 'constructor (first %)))
first)]
(->> cf rest (cons 'fn)))
constructor-fn (if constructor-fn
`(fn [props#]
(cljs.core/this-as this#
(.call js/React.Component this# props#)
(.call ~constructor-fn this# props#)
this#))
`(fn [props#]
(cljs.core/this-as this#
(.call js/React.Component this# props#)
this#)))
body (->> body
(remove #(= 'constructor (first %))))]
`(let [ctor# ~constructor-fn]
(goog.inherits ctor# js/React.Component)
(cljs.core/specify! (.-prototype ctor#)
~'Object
~@body)
ctor#)))
(defmacro define-react-class-once [vname & body]
`(do
(defonce ~vname ~(specify-react-class! body))
(set! (.-displayName ~vname) (name '~vname))
(cljs.core/specify! (.-prototype ~vname)
~'Object
~@(filter #('#{shouldComponentUpdate
componentWillReceiveProps
componentWillMount
componentDidMount
componentWillUpdate
componentDidUpdate
componentWillUnmount
render} (first %)) body))))
(defmacro define-react-class [vname & body]
`(do
(def ~vname ~(specify-react-class! body))
(set! (.-displayName ~vname) (name '~vname))))