|
622 | 622 | (defn remount? [doc-or-patch]
|
623 | 623 | (true? (some #(= % :nextjournal.clerk/remount) (tree-seq coll? seq doc-or-patch))))
|
624 | 624 |
|
| 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 | + |
625 | 634 | (defn re-eval-viewer-fns [doc]
|
626 | 635 | (let [re-eval (fn [{:keys [form]}] (viewer/->viewer-fn form))]
|
627 | 636 | (w/postwalk (fn [x] (cond-> x (viewer/viewer-fn? x) re-eval)) doc)))
|
|
644 | 653 |
|
645 | 654 | (defn patch-state! [{:keys [patch]}]
|
646 | 655 | (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 | + %))) |
650 | 661 | (swap! !doc apply-patch patch)))
|
651 | 662 |
|
652 | 663 | (defonce !pending-clerk-eval-replies
|
|
764 | 775 | (.render react-root (r/as-element [root]))))
|
765 | 776 |
|
766 | 777 | (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))))) |
769 | 781 |
|
770 | 782 | (defn ^:export init [{:as state :keys [bundle? path->doc path->url current-path]}]
|
771 | 783 | (setup-router! state)
|
|
0 commit comments