From 7ff608ff0ba48bc2b73e27c425d65039886e89bd Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 20 May 2021 10:56:58 +0200 Subject: [PATCH 1/2] :arrow_up: Move svg parsing to the frontend with Tubax --- frontend/package.json | 1 + frontend/shadow-cljs.edn | 1 + .../src/app/main/data/workspace/persistence.cljs | 13 +++++++++---- frontend/src/app/main/repo.cljs | 8 -------- frontend/src/app/main/ui.cljs | 9 +++++++++ frontend/vendor/tubax/saxjs.cljs | 4 ++++ frontend/yarn.lock | 2 +- 7 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 frontend/vendor/tubax/saxjs.cljs diff --git a/frontend/package.json b/frontend/package.json index ad653575e..9e583d58a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -48,6 +48,7 @@ "react-dom": "~17.0.1", "react-virtualized": "^9.22.3", "rxjs": "~7.0.1", + "sax": "^1.2.4", "source-map-support": "^0.5.16", "tdigest": "^0.1.1", "ua-parser-js": "^0.7.28", diff --git a/frontend/shadow-cljs.edn b/frontend/shadow-cljs.edn index 06cf32402..3da0b47f9 100644 --- a/frontend/shadow-cljs.edn +++ b/frontend/shadow-cljs.edn @@ -20,6 +20,7 @@ [funcool/potok "4.0.0"] [funcool/promesa "6.0.0"] [funcool/rumext "2021.05.12-1"] + [funcool/tubax "2021.05.20-0"] [lambdaisland/uri "1.4.54" :exclusions [org.clojure/data.json]] diff --git a/frontend/src/app/main/data/workspace/persistence.cljs b/frontend/src/app/main/data/workspace/persistence.cljs index 35a6b26e0..1fbf6d28a 100644 --- a/frontend/src/app/main/data/workspace/persistence.cljs +++ b/frontend/src/app/main/data/workspace/persistence.cljs @@ -14,8 +14,8 @@ [app.common.spec :as us] [app.common.uuid :as uuid] [app.main.data.dashboard :as dd] - [app.main.data.media :as di] [app.main.data.fonts :as df] + [app.main.data.media :as di] [app.main.data.messages :as dm] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.common :as dwc] @@ -39,7 +39,8 @@ [clojure.set :as set] [cuerdas.core :as str] [potok.core :as ptk] - [promesa.core :as p])) + [promesa.core :as p] + [tubax.core :as tubax])) (declare persist-changes) (declare persist-sychronous-changes) @@ -344,8 +345,12 @@ (defn parse-svg [[name text]] - (->> (rp/query! :parsed-svg {:data text}) - (rx/map #(assoc % :name name)))) + (try + (->> (rx/of (-> (tubax/xml->clj text) + (assoc :name name)))) + + (catch :default err + (rx/throw {:type :svg-parser})))) (defn fetch-svg [name uri] (->> (http/send! {:method :get :uri uri :mode :no-cors}) diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index 8b5980ed5..36d935ffb 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -110,14 +110,6 @@ :response-type :blob}) (rx/mapcat handle-response))) -(defmethod query :parsed-svg - [id params] - (->> (http/send! {:method :post - :uri (u/join base-uri "api/rpc/query/" (name id)) - :body (http/transit-data params)}) - (rx/map http/conditional-decode-transit) - (rx/mapcat handle-response))) - (derive :upload-file-media-object ::multipart-upload) (derive :update-profile-photo ::multipart-upload) (derive :update-team-photo ::multipart-upload) diff --git a/frontend/src/app/main/ui.cljs b/frontend/src/app/main/ui.cljs index 0bca30870..422a3734a 100644 --- a/frontend/src/app/main/ui.cljs +++ b/frontend/src/app/main/ui.cljs @@ -240,6 +240,15 @@ (js/console.error explain))) (js/console.groupEnd "Validation Error")) +;; Error on parsing an SVG +(defmethod ptk/handle-error :svg-parser + [error] + (ts/schedule + (st/emitf + (dm/show {:content "SVG is invalid or malformed" + :type :error + :timeout 3000})))) + ;; This is a pure frontend error that can be caused by an active ;; assertion (assertion that is preserved on production builds). From ;; the user perspective this should be treated as internal error. diff --git a/frontend/vendor/tubax/saxjs.cljs b/frontend/vendor/tubax/saxjs.cljs new file mode 100644 index 000000000..3dc98550b --- /dev/null +++ b/frontend/vendor/tubax/saxjs.cljs @@ -0,0 +1,4 @@ +(ns tubax.saxjs + (:require ["sax" :as sax])) + +(goog/exportSymbol "sax" sax) diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 7e17a50ee..caa556a85 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4478,7 +4478,7 @@ sass@^1.32.8: dependencies: chokidar ">=3.0.0 <4.0.0" -sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== From 4613aef1c8d9169371933a0cd536999a22c5be4d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 20 May 2021 11:50:41 +0200 Subject: [PATCH 2/2] :bug: Fix problem with index updating --- frontend/src/app/worker/selection.cljs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/worker/selection.cljs b/frontend/src/app/worker/selection.cljs index 21667849b..09cc4041a 100644 --- a/frontend/src/app/worker/selection.cljs +++ b/frontend/src/app/worker/selection.cljs @@ -23,7 +23,7 @@ (defn index-shape [objects parents-index masks-index] (fn [index shape] - (let [{:keys [x y width height]} (:selrect shape) + (let [{:keys [x y width height]} (gsh/points->selrect (:points shape)) shape-bound #js {:x x :y y :width width :height height} parents (get parents-index (:id shape)) @@ -42,11 +42,10 @@ (let [shapes (-> objects (dissoc uuid/zero) (vals)) parents-index (cp/generate-child-all-parents-index objects) masks-index (cp/create-mask-index objects parents-index) - bounds (gsh/selection-rect shapes) - bounds #js {:x (:x bounds) - :y (:y bounds) - :width (:width bounds) - :height (:height bounds)} + bounds #js {:x (int -0.5e7) + :y (int -0.5e7) + :width (int 1e7) + :height (int 1e7)} index (reduce (index-shape objects parents-index masks-index) (qdt/create bounds) @@ -65,7 +64,8 @@ (get new-objects id))) changed-ids (into #{} - (filter changes?) + (comp (filter changes?) + (filter #(not= % uuid/zero))) (set/union (keys old-objects) (keys new-objects)))