penpot/frontend/src/app/main/data/workspace/specialized_panel.cljs
Andrey Antukh 85746e7cb2 ♻️ Refactor state locality
The main purpose of this refactor is reduce
a custom state from different pages and unify
them under common access patterns
2025-01-16 15:31:18 +01:00

42 lines
1.3 KiB
Clojure

;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.main.data.workspace.specialized-panel
(:require
[app.common.data :as d]
[app.main.data.helpers :as dsh]
[app.main.data.workspace.common :as-alias dwc]
[beicon.v2.core :as rx]
[potok.v2.core :as ptk]))
(defn interrupt? [e] (or (= e :interrupt) (= e ::interrupt)))
(defn clear-specialized-panel
[]
(ptk/reify ::clear-specialized-panel
ptk/UpdateEvent
(update [_ state]
(dissoc state :specialized-panel))))
(defn open-specialized-panel
[type]
(ptk/reify ::open-specialized-panel
ptk/UpdateEvent
(update [_ state]
(let [page-id (:current-page-id state)
objects (dsh/lookup-page-objects state page-id)
selected-ids (dsh/lookup-selected state)
selected-shapes (map (d/getf objects) selected-ids)]
(assoc state :specialized-panel {:type type :shapes selected-shapes})))
ptk/WatchEvent
(watch [_ _ stream]
(->> (rx/merge
(rx/filter interrupt? stream)
(rx/filter (ptk/type? ::dwc/undo) stream))
(rx/take 1)
(rx/map clear-specialized-panel)))))