-
Notifications
You must be signed in to change notification settings - Fork 21
/
fulcro.cljs
67 lines (57 loc) · 2.09 KB
/
fulcro.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
65
66
67
(ns nubank.workspaces.card-types.fulcro
(:require [fulcro.client.dom :as dom]
[fulcro.client.primitives :as fp]
[fulcro.inspect.client :as fi.client]
[goog.functions :as gfun]
[nubank.workspaces.lib.fulcro-portal :as f.portal]
[nubank.workspaces.card-types.util :as ct.util]
[nubank.workspaces.data :as data]
[nubank.workspaces.model :as wsm]
[nubank.workspaces.ui :as ui]
[cljs.spec.alpha :as s]
[nubank.workspaces.ui.core :as uc]))
(defn inspector-set-app [card-id]
(let [{::keys [app*]} (data/active-card card-id)
app-uuid (-> @app* :reconciler fp/app-state deref (get fi.client/app-uuid-key))]
(if app-uuid
(fi.client/set-active-app app-uuid))))
(def debounced-refresh-css!
(gfun/debounce f.portal/refresh-css! 100))
(defn fulcro-card-init
[{::wsm/keys [card-id]
:as card}
config]
(let [app* (atom (f.portal/upsert-app (assoc config :fulcro.inspect.core/app-id card-id)))]
(ct.util/positioned-card card
{::wsm/dispose
(fn [node]
(f.portal/dispose-app @app*)
(reset! app* nil)
(js/ReactDOM.unmountComponentAtNode node))
::wsm/refresh
(fn [_]
(debounced-refresh-css!)
(fp/force-root-render! (:reconciler @app*)))
::wsm/render
(fn [node]
(swap! data/active-cards* assoc-in [card-id ::app*] app*)
(f.portal/mount-at app* config node))
::wsm/render-toolbar
(fn []
(dom/div
(uc/button {:onClick #(inspector-set-app card-id)}
"Inspector")
(uc/button {:onClick #(ui/restart-card card-id)}
"Restart")))
::app*
app*})))
(defn fulcro-card [config]
{::wsm/init
#(fulcro-card-init % config)})
(s/fdef fulcro-card
:args (s/cat :config (s/keys
:req [::f.portal/root]
:opt [::f.portal/wrap-root?
::f.portal/app
::f.portal/initial-state]))
:ret ::wsm/card-instance)