diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index ef0ab8545..7b5436f78 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -283,29 +283,39 @@ (rx/take-until (rx/filter (ptk/type? ::fetch-bundle) stream))))))) +(declare go-to-component) + (defn- fetch-bundle "Multi-stage file bundle fetch coordinator" [project-id file-id] (ptk/reify ::fetch-bundle ptk/WatchEvent - (watch [_ _ stream] - (->> (rx/merge - (rx/of (fetch-bundle-stage-1 project-id file-id)) + (watch [_ state stream] + (let [component-id (get-in state [:route :query-params :component-id])] + (->> (rx/merge + (rx/of (fetch-bundle-stage-1 project-id file-id)) - (->> stream - (rx/filter (ptk/type? ::bundle-stage-1)) - (rx/observe-on :async) - (rx/map deref) - (rx/map fetch-bundle-stage-2)) + (->> stream + (rx/filter (ptk/type? ::bundle-stage-1)) + (rx/observe-on :async) + (rx/map deref) + (rx/map fetch-bundle-stage-2)) - (->> stream - (rx/filter (ptk/type? ::bundle-stage-2)) - (rx/observe-on :async) - (rx/map deref) - (rx/map bundle-fetched))) + (->> stream + (rx/filter (ptk/type? ::bundle-stage-2)) + (rx/observe-on :async) + (rx/map deref) + (rx/map bundle-fetched)) - (rx/take-until - (rx/filter (ptk/type? ::fetch-bundle) stream)))))) + (when component-id + (->> stream + (rx/filter (ptk/type? ::workspace-initialized)) + (rx/observe-on :async) + (rx/take 1) + (rx/map #(go-to-component (uuid/uuid component-id)))))) + + (rx/take-until + (rx/filter (ptk/type? ::fetch-bundle) stream))))))) (defn initialize-file [project-id file-id] diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 5ffe3f82e..046bc6dfd 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -589,16 +589,17 @@ (rx/of (dch/commit-changes changes)))))) (defn nav-to-component-file - [file-id] + [file-id component] (dm/assert! (uuid? file-id)) + (dm/assert! (some? component)) (ptk/reify ::nav-to-component-file ptk/WatchEvent (watch [_ state _] - (let [file (get-in state [:workspace-libraries file-id]) - path-params {:project-id (:project-id file) - :file-id (:id file)} - query-params {:page-id (first (get-in file [:data :pages])) - :layout :assets}] + (let [project-id (get-in state [:workspace-libraries file-id :project-id]) + path-params {:project-id project-id + :file-id file-id} + query-params {:page-id (:main-instance-page component) + :component-id (:id component)}] (rx/of (rt/nav-new-window* {:rname :workspace :path-params path-params :query-params query-params})))))) diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs index 9975651be..60291315c 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs @@ -353,17 +353,6 @@ do-reset-component #(st/emit! (dwl/reset-components (map :id touched-not-dangling))) - do-restore-component - #(let [;; Extract a map of component-id -> component-file in order to avoid duplicates - comps-to-restore (reduce (fn [id-file-map {:keys [component-id component-file]}] - (assoc id-file-map component-id component-file)) - {} - restorable-copies)] - - (st/emit! (dwl/restore-components comps-to-restore) - (when (= 1 (count comps-to-restore)) - (dw/go-to-main-instance (val (first comps-to-restore)) (key (first comps-to-restore)))))) - do-update-component-sync #(st/emit! (dwl/update-component-sync id library-id)) @@ -384,23 +373,35 @@ (do-update-component-sync) (do-update-remote-component)) - do-show-local-component - #(st/emit! (dw/go-to-component component-id)) - do-show-in-assets #(st/emit! (if components-v2 (dw/show-component-in-assets component-id) (dw/go-to-component component-id))) + do-create-annotation #(st/emit! (dw/set-annotations-id-for-create id)) - do-navigate-component-file - #(st/emit! (dw/go-to-main-instance library-id component-id)) + do-show-local-component + #(st/emit! (dw/go-to-component component-id)) + + do-show-remote-component + #(st/emit! (dwl/nav-to-component-file library-id component)) do-show-component #(if local-component? (do-show-local-component) - (do-navigate-component-file)) + (do-show-remote-component)) + + do-restore-component + #(let [;; Extract a map of component-id -> component-file in order to avoid duplicates + comps-to-restore (reduce (fn [id-file-map {:keys [component-id component-file]}] + (assoc id-file-map component-id component-file)) + {} + restorable-copies)] + + (st/emit! (dwl/restore-components comps-to-restore)) + (when (= 1 (count comps-to-restore)) + do-show-component)) menu-entries [(when (and (not multi) main-instance?) {:msg "workspace.shape.menu.show-in-assets"