diff --git a/frontend/src/app/main/fonts.cljs b/frontend/src/app/main/fonts.cljs index 4bbf01ebd..3b2b821c6 100644 --- a/frontend/src/app/main/fonts.cljs +++ b/frontend/src/app/main/fonts.cljs @@ -200,16 +200,19 @@ (p/create (fn [resolve] (ensure-loaded! id resolve)))) ([id on-loaded] - (let [font (get @fontsdb id)] + (when-let [font (get @fontsdb id)] + (log/debug :action "ensure-loaded!" :font-id id :font font) (cond ;; Font already loaded, we just continue (contains? @loaded id) - (on-loaded id) + (p/do + (on-loaded id) + id) ;; Font is currently downloading. We attach the caller to the promise (contains? @loading id) (-> (get @loading id) - (p/then #(on-loaded id))) + (p/then #(do (on-loaded id) id))) ;; First caller, we create the promise and then wait :else @@ -226,8 +229,7 @@ (load-font))))] (swap! loading assoc id load-p) - - nil))))) + load-p))))) (defn ready [cb] diff --git a/frontend/src/app/main/ui/shapes/text.cljs b/frontend/src/app/main/ui/shapes/text.cljs index 6da9c4642..90be033c9 100644 --- a/frontend/src/app/main/ui/shapes/text.cljs +++ b/frontend/src/app/main/ui/shapes/text.cljs @@ -6,16 +6,28 @@ (ns app.main.ui.shapes.text (:require + [app.common.text :as txt] + [app.main.fonts :as fonts] [app.main.ui.shapes.text.fo-text :as fo] [app.main.ui.shapes.text.svg-text :as svg] [app.util.object :as obj] [rumext.alpha :as mf])) +(defn- load-fonts! + [content] + (let [default (:font-id txt/default-text-attrs)] + (->> (tree-seq map? :children content) + (into #{default} (keep :font-id)) + (run! fonts/ensure-loaded!)))) + (mf/defc text-shape {::mf/wrap-props false} [props] + (let [{:keys [position-data content] :as shape} (obj/get props "shape")] + + (mf/with-memo [content] + (load-fonts! content)) - (let [{:keys [position-data]} (obj/get props "shape")] (if (some? position-data) [:> svg/text-shape props] [:> fo/text-shape props]))) diff --git a/frontend/src/app/main/ui/shapes/text/styles.cljs b/frontend/src/app/main/ui/shapes/text/styles.cljs index 8082d00ff..130c891de 100644 --- a/frontend/src/app/main/ui/shapes/text/styles.cljs +++ b/frontend/src/app/main/ui/shapes/text/styles.cljs @@ -106,7 +106,6 @@ [font-family font-style font-weight] (when (some? font) - (fonts/ensure-loaded! font-id) (let [font-variant (d/seek #(= font-variant-id (:id %)) (:variants font))] [(str/quote (or (:family font) (:font-family data))) (or (:style font-variant) (:font-style data)) diff --git a/frontend/src/app/worker/thumbnails.cljs b/frontend/src/app/worker/thumbnails.cljs index 92bf40cde..cc28169be 100644 --- a/frontend/src/app/worker/thumbnails.cljs +++ b/frontend/src/app/worker/thumbnails.cljs @@ -81,9 +81,10 @@ frame (some->> page :thumbnail-frame-id (get objects)) element (if frame (mf/element render/frame-svg #js {:objects objects :frame frame :show-thumbnails? true}) - (mf/element render/page-svg #js {:data page :thumbnails? true}))] - {:data (rds/renderToStaticMarkup element) - :fonts @fonts/loaded + (mf/element render/page-svg #js {:data page :thumbnails? true})) + data (rds/renderToStaticMarkup element)] + {:data data + :fonts (into @fonts/loaded (map first) @fonts/loading) :file-id file-id :revn revn}))