From 316b3d453981e58be37cd3e16664b56c0ccf6caa Mon Sep 17 00:00:00 2001
From: "alonso.torres" <alonso.torres@kaleidos.net>
Date: Mon, 23 Jan 2023 14:07:51 +0100
Subject: [PATCH] :bug: Try to remove cases when the thumbnail could be empty

---
 .../shapes/frame/thumbnail_render.cljs        | 43 ++++++++++++-------
 frontend/src/app/util/dom.cljs                | 14 +++++-
 2 files changed, 39 insertions(+), 18 deletions(-)

diff --git a/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs b/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs
index 040b94485..4ea93a741 100644
--- a/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs
+++ b/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs
@@ -114,26 +114,37 @@
 
         generate-thumbnail
         (mf/use-callback
-         (fn []
-           (let [node @node-ref
-                 frame-html (dom/node->xml node)
+         (fn generate-thumbnail []
+           (try
+             (let [node @node-ref]
+               (if (dom/has-children? node)
+                 ;; The frame-content need to have children in order to generate the thumbnail
+                 (let [frame-html (dom/node->xml node)
+                       style-node (dom/query (dm/str "#frame-container-" (:id shape) " style"))
+                       style-str (or (-> style-node dom/node->xml) "")
 
-                 {:keys [x y width height]} @shape-bb-ref
+                       {:keys [x y width height]} @shape-bb-ref
+                       viewbox (dm/str x " " y " " width " " height)
 
-                 style-node (dom/query (dm/str "#frame-container-" (:id shape) " style"))
-                 style-str (or (-> style-node dom/node->xml) "")
+                       svg-node
+                       (-> (dom/make-node "http://www.w3.org/2000/svg" "svg")
+                           (dom/set-property! "version" "1.1")
+                           (dom/set-property! "viewBox" viewbox)
+                           (dom/set-property! "width" width)
+                           (dom/set-property! "height" height)
+                           (dom/set-property! "fill" "none")
+                           (obj/set! "innerHTML" (dm/str style-str frame-html)))
 
-                 svg-node
-                 (-> (dom/make-node "http://www.w3.org/2000/svg" "svg")
-                     (dom/set-property! "version" "1.1")
-                     (dom/set-property! "viewBox" (dm/str x " " y " " width " " height))
-                     (dom/set-property! "width" width)
-                     (dom/set-property! "height" height)
-                     (dom/set-property! "fill" "none")
-                     (obj/set! "innerHTML" (dm/str style-str frame-html)))
-                 img-src  (-> svg-node dom/node->xml dom/svg->data-uri)]
+                       img-src
+                       (-> svg-node dom/node->xml dom/svg->data-uri)]
 
-             (reset! image-url img-src))))
+                   (reset! image-url img-src))
+
+                 ;; Node not yet ready, we schedule a new generation
+                 (ts/schedule generate-thumbnail)))
+
+             (catch :default e
+               (.error js/console e)))))
 
         on-change-frame
         (mf/use-callback
diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs
index 60c62f863..cd2a6ac09 100644
--- a/frontend/src/app/util/dom.cljs
+++ b/frontend/src/app/util/dom.cljs
@@ -264,12 +264,14 @@
 (defn append-child!
   [^js el child]
   (when (some? el)
-    (.appendChild ^js el child)))
+    (.appendChild ^js el child))
+  el)
 
 (defn remove-child!
   [^js el child]
   (when (some? el)
-    (.removeChild ^js el child)))
+    (.removeChild ^js el child))
+  el)
 
 (defn get-first-child
   [^js el]
@@ -639,3 +641,11 @@
 
     {:ascent (.-fontBoundingBoxAscent measure)
      :descent (.-fontBoundingBoxDescent measure)}))
+
+(defn clone-node
+  [^js node]
+  (.cloneNode node))
+
+(defn has-children?
+  [^js node]
+  (> (-> node .-children .-length) 0))