Skip to content

Commit b2174a0

Browse files
committed
Fix re-mount
1 parent a537e03 commit b2174a0

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

src/nextjournal/clerk/render.cljs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,15 @@
622622
(defn remount? [doc-or-patch]
623623
(true? (some #(= % :nextjournal.clerk/remount) (tree-seq coll? seq doc-or-patch))))
624624

625+
(defn await-render-fns [x]
626+
(let [viewer-fns (set (filter viewer/viewer-fn? (tree-seq coll? seq x)))
627+
!viewer-fns->resolved (atom {})]
628+
(doseq [viewer-fn viewer-fns]
629+
(.then (js/Promise.resolve (:f viewer-fn))
630+
#(swap! !viewer-fns->resolved assoc viewer-fn (assoc viewer-fn :f %))))
631+
(-> (js/Promise.allSettled (into-array (map #(js/Promise.resolve (:f %)) viewer-fns)))
632+
(.then #(clojure.walk/postwalk-replace @!viewer-fns->resolved x)))))
633+
625634
(defn re-eval-viewer-fns [doc]
626635
(let [re-eval (fn [{:keys [form]}] (viewer/->viewer-fn form))]
627636
(w/postwalk (fn [x] (cond-> x (viewer/viewer-fn? x) re-eval)) doc)))
@@ -644,9 +653,11 @@
644653

645654
(defn patch-state! [{:keys [patch]}]
646655
(if (remount? patch)
647-
(do (swap! !doc #(re-eval-viewer-fns (apply-patch % patch)))
648-
;; TODO: figure out why it doesn't work without `js/setTimeout`
649-
(js/setTimeout #(swap! !eval-counter inc) 10))
656+
(-> (await-render-fns (re-eval-viewer-fns (apply-patch @!doc patch)))
657+
(.then #(do (reset! !doc %)
658+
;; TODO: figure out why it doesn't work without `js/setTimeout`
659+
(js/setTimeout (fn [] (swap! !eval-counter inc)) 10)
660+
%)))
650661
(swap! !doc apply-patch patch)))
651662

652663
(defonce !pending-clerk-eval-replies
@@ -764,8 +775,9 @@
764775
(.render react-root (r/as-element [root]))))
765776

766777
(defn ^:dev/after-load ^:after-load re-render []
767-
(swap! !doc re-eval-viewer-fns)
768-
(mount))
778+
(-> (await-render-fns (re-eval-viewer-fns @!doc))
779+
(.then #(do (reset! !doc %)
780+
(mount)))))
769781

770782
(defn ^:export init [{:as state :keys [bundle? path->doc path->url current-path]}]
771783
(setup-router! state)

src/nextjournal/clerk/sci_env.cljs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -186,24 +186,15 @@
186186
sci.configs.js-interop/namespaces
187187
sci.configs.reagent/namespaces)})
188188

189-
(defn await-render-fns [x]
190-
(let [viewer-fns (set (filter viewer/viewer-fn? (tree-seq coll? seq x)))
191-
!viewer-fns->resolved (atom {})]
192-
(doseq [viewer-fn viewer-fns]
193-
(.then (:f viewer-fn)
194-
#(swap! !viewer-fns->resolved assoc viewer-fn (assoc viewer-fn :f %))))
195-
(-> (js/Promise.allSettled (into-array (map :f viewer-fns)))
196-
(.then #(clojure.walk/postwalk-replace @!viewer-fns->resolved x)))))
197-
198189
(defn ^:export onmessage [ws-msg]
199-
(-> (await-render-fns (read-string (.-data ws-msg)))
190+
(-> (render/await-render-fns (read-string (.-data ws-msg)))
200191
(.then #(render/dispatch %))))
201192

202193
(defn ^:export eval-form [f]
203194
(sci-async/eval-form (sci.ctx-store/get-ctx) f))
204195

205196
(defn ^:export init [state]
206-
(-> (await-render-fns state)
197+
(-> (render/await-render-fns state)
207198
(.then #(render/init %))))
208199

209200
(defn ^:export ssr [state-str]

0 commit comments

Comments
 (0)