From 0e73de17eccc1f288ac1e07806869030958383cd Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 19 Feb 2025 16:43:21 +0100 Subject: [PATCH] :bug: Fix incorrect libraries filtering on workspace --- frontend/src/app/main/data/workspace.cljs | 8 ++++-- .../app/main/data/workspace/libraries.cljs | 9 ++++-- frontend/src/app/main/refs.cljs | 28 +++++++++++++++++-- .../src/app/main/ui/workspace/libraries.cljs | 24 ++++++++-------- .../src/app/main/ui/workspace/sidebar.cljs | 3 +- .../app/main/ui/workspace/sidebar/assets.cljs | 11 ++++---- 6 files changed, 57 insertions(+), 26 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 141dd25e11..d6bffce4b0 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -168,11 +168,13 @@ (assoc file :data (d/removem (comp t/pointer? val) data)))))))))) (defn- libraries-fetched - [libraries] + [file-id libraries] (ptk/reify ::libraries-fetched ptk/UpdateEvent (update [_ state] - (let [libraries (d/index-by :id libraries)] + (let [libraries (->> libraries + (map (fn [l] (assoc l :library-of file-id))) + (d/index-by :id))] (update state :files merge libraries))) ptk/WatchEvent @@ -208,7 +210,7 @@ (rx/map #(assoc % :synced-at synced-at))))) (rx/merge-map resolve-file) (rx/reduce conj []) - (rx/map libraries-fetched)) + (rx/map (partial libraries-fetched file-id))) (->> (rx/from libraries) (rx/map :id) (rx/mapcat (fn [file-id] diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 34cf12d4f7..d4a57d21e4 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -1201,7 +1201,7 @@ (vals (get state :files))) do-more-info - #(modal/show! :libraries-dialog {:starting-tab "updates"}) + #(modal/show! :libraries-dialog {:starting-tab "updates" :file-id file-id}) do-update #(do (apply st/emit! (map (fn [library] @@ -1388,7 +1388,10 @@ (let [libraries (:workspace-shared-files state) library (d/seek #(= (:id %) library-id) libraries)] (if library - (update state :files assoc library-id (dissoc library :library-summary)) + (update state :files assoc library-id + (-> library + (dissoc :library-summary) + (assoc :library-of file-id))) state))) ptk/WatchEvent @@ -1401,6 +1404,8 @@ (->> (rp/cmd! :get-file {:id library-id :features features}) (rx/merge-map fpmap/resolve-file) ;; FIXME: this should call the libraries-fetched event instead of ad-hoc assoc event + (rx/map (fn [file] + (assoc file :library-of file-id))) (rx/map (fn [file] (fn [state] (assoc-in state [:files library-id] file))))) diff --git a/frontend/src/app/main/refs.cljs b/frontend/src/app/main/refs.cljs index deb64480c3..f9e46b272a 100644 --- a/frontend/src/app/main/refs.cljs +++ b/frontend/src/app/main/refs.cljs @@ -83,10 +83,32 @@ files (without the content, only summary)" (l/derived :shared-files st/state)) +(defn select-libraries + [files file-id] + (persistent! + (reduce-kv (fn [result id file] + (if (or (= id file-id) + (= (:library-of file) file-id)) + (assoc! result id file) + result)) + (transient {}) + files))) + +;; NOTE: for performance reasons, prefer derefing refs/files and then +;; use with-memo mechanism with `select-libraries` this will avoid +;; executing the select-libraries reduce-kv on each state change and +;; only execute it when files are changed. This ref exists for +;; backward compatibility with the code, but it is considered +;; DEPRECATED and all new code should not use it and old code should +;; be gradually migrated to more efficient approach (def libraries - "A derived state that contanins the currently loaded shared libraries - with all its content; including the current file" - (l/derived :files st/state)) + "A derived state that contanins the currently loaded shared + libraries with all its content; including the current file" + (l/derived (fn [state] + (let [files (get state :files) + file-id (get state :current-file-id)] + (select-libraries files file-id))) + st/state)) (defn extract-selected-files [files selected] diff --git a/frontend/src/app/main/ui/workspace/libraries.cljs b/frontend/src/app/main/ui/workspace/libraries.cljs index 963385602f..90d9111b25 100644 --- a/frontend/src/app/main/ui/workspace/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/libraries.cljs @@ -248,10 +248,12 @@ (mf/use-fn (mf/deps file-id) #(st/emit! (dwl/set-file-shared file-id false) - (modal/show :libraries-dialog {}))) + (modal/show :libraries-dialog {:file-id file-id}))) on-delete-cancel - (mf/use-fn #(st/emit! (modal/show :libraries-dialog {}))) + (mf/use-fn + (mf/deps file-id) + #(st/emit! (modal/show :libraries-dialog {:file-id file-id}))) publish (mf/use-fn @@ -259,7 +261,7 @@ (fn [event] (let [input-node (dom/get-target event) publish-library #(st/emit! (dwl/set-file-shared file-id true)) - cancel-publish #(st/emit! (modal/show :libraries-dialog {}))] + cancel-publish #(st/emit! (modal/show :libraries-dialog {:file-id file-id}))] (if empty-library? (st/emit! (modal/show {:type :confirm @@ -563,17 +565,15 @@ (mf/defc libraries-dialog {::mf/register modal/components ::mf/register-as :libraries-dialog} - [{:keys [starting-tab] :as props :or {starting-tab :libraries}}] - (let [;; NOTE: we don't want to react on file changes, we just want - ;; a snapshot of file on the momento of open the dialog - file (deref refs/file) - - file-id (:id file) - team-id (:team-id file) - shared? (:is-shared file) + [{:keys [starting-tab file-id] :as props :or {starting-tab :libraries}}] + (let [files (mf/deref refs/files) + file (get files file-id) + team-id (:team-id file) + shared? (:is-shared file) linked-libraries - (mf/deref refs/files) + (mf/with-memo [files file-id] + (refs/select-libraries files file-id)) linked-libraries (mf/with-memo [linked-libraries file-id] diff --git a/frontend/src/app/main/ui/workspace/sidebar.cljs b/frontend/src/app/main/ui/workspace/sidebar.cljs index 21e639f255..a556b664eb 100644 --- a/frontend/src/app/main/ui/workspace/sidebar.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar.cljs @@ -56,6 +56,7 @@ [{:keys [layout file page-id] :as props}] (let [options-mode (mf/deref refs/options-mode-global) project (mf/deref refs/project) + file-id (get file :id) design-tokens? (features/use-feature "design-tokens/v1") mode-inspect? (= options-mode :inspect) @@ -116,7 +117,7 @@ assets-tab - (mf/html [:& assets-toolbox {:size (- size 58) :file-id file}]) + (mf/html [:& assets-toolbox {:size (- size 58) :file-id file-id}]) tokens-tab (when design-tokens? diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs index 7f240d7343..d0d8ca8be9 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs @@ -33,10 +33,10 @@ ::mf/private true} [{:keys [filters]}] (let [file-id (mf/use-ctx ctx/current-file-id) - - libraries (mf/deref refs/libraries) - libraries (mf/with-memo [libraries file-id] - (->> (vals libraries) + files (mf/deref refs/files) + libraries (mf/with-memo [files file-id] + (->> (refs/select-libraries files file-id) + (vals) (remove :is-indirect) (remove #(= file-id (:id %))) (map (fn [file] @@ -129,8 +129,9 @@ show-libraries-dialog (mf/use-fn + (mf/deps file-id) (fn [] - (modal/show! :libraries-dialog {}) + (modal/show! :libraries-dialog {:file-id file-id}) (modal/allow-click-outside!))) on-open-menu