From 91f60000b3451251a5dcec6ac21be1f7361c8efe Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 28 Apr 2021 17:28:02 +0200 Subject: [PATCH] :zap: Memoize shapes --- .../app/main/ui/workspace/shapes/common.cljs | 3 ++- .../app/main/ui/workspace/shapes/frame.cljs | 24 ++++++++++++++++++- .../app/main/ui/workspace/shapes/group.cljs | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/shapes/common.cljs b/frontend/src/app/main/ui/workspace/shapes/common.cljs index 4d5ad63e7..1c8dff918 100644 --- a/frontend/src/app/main/ui/workspace/shapes/common.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/common.cljs @@ -12,7 +12,8 @@ (defn generic-wrapper-factory [component] (mf/fnc generic-wrapper - {::mf/wrap-props false} + {::mf/wrap [#(mf/memo' % (mf/check-props ["shape"]))] + ::mf/wrap-props false} [props] (let [shape (unchecked-get props "shape")] [:> shape-container {:shape shape} diff --git a/frontend/src/app/main/ui/workspace/shapes/frame.cljs b/frontend/src/app/main/ui/workspace/shapes/frame.cljs index 2f51adba3..71a38987a 100644 --- a/frontend/src/app/main/ui/workspace/shapes/frame.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/frame.cljs @@ -28,6 +28,28 @@ (contains? (:selected local) id)))] (l/derived check-moving refs/workspace-local))) +(defn check-props + ([props] (check-props props =)) + ([props eqfn?] + (fn [np op] + (every? #(eqfn? (unchecked-get np %) + (unchecked-get op %)) + props)))) + +(defn check-frame-props + "Checks for changes in the props of a frame" + [new-props old-props] + (let [new-shape (unchecked-get new-props "shape") + old-shape (unchecked-get old-props "shape") + + new-objects (unchecked-get new-props "objects") + old-objects (unchecked-get old-props "objects") + + new-children (->> new-shape :shapes (mapv #(get new-objects %))) + old-children (->> old-shape :shapes (mapv #(get old-objects %)))] + (and (= new-shape old-shape) + (= new-children old-children)))) + ;; This custom deffered don't deffer rendering when ghost rendering is ;; used. (defn custom-deferred @@ -48,7 +70,7 @@ [shape-wrapper] (let [frame-shape (frame/frame-shape shape-wrapper)] (mf/fnc frame-wrapper - {::mf/wrap [#(mf/memo' % (mf/check-props ["shape" "objects"])) custom-deferred] + {::mf/wrap [#(mf/memo' % check-frame-props) custom-deferred] ::mf/wrap-props false} [props] (let [shape (unchecked-get props "shape") diff --git a/frontend/src/app/main/ui/workspace/shapes/group.cljs b/frontend/src/app/main/ui/workspace/shapes/group.cljs index d7ce59151..d55215d1e 100644 --- a/frontend/src/app/main/ui/workspace/shapes/group.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/group.cljs @@ -30,7 +30,7 @@ [shape-wrapper] (let [group-shape (group/group-shape shape-wrapper)] (mf/fnc group-wrapper - {::mf/wrap [#(mf/memo' % (mf/check-props ["shape" "frame"]))] + {::mf/wrap [#(mf/memo' % (mf/check-props ["shape"]))] ::mf/wrap-props false} [props] (let [shape (unchecked-get props "shape")