mirror of
https://github.com/penpot/penpot.git
synced 2025-07-26 11:47:39 +02:00
85 lines
2.7 KiB
Clojure
85 lines
2.7 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.plugins.events
|
|
(:require
|
|
[app.common.data.macros :as dm]
|
|
[app.main.store :as st]
|
|
[app.plugins.file :as file]
|
|
[app.plugins.page :as page]
|
|
[goog.functions :as gf]))
|
|
|
|
(defmulti handle-state-change (fn [type _] type))
|
|
|
|
(defmethod handle-state-change "finish"
|
|
[_ old-val new-val]
|
|
(let [old-file-id (:current-file-id old-val)
|
|
new-file-id (:current-file-id new-val)]
|
|
(if (and (some? old-file-id) (nil? new-file-id))
|
|
(str old-file-id)
|
|
::not-changed)))
|
|
|
|
(defmethod handle-state-change "filechange"
|
|
[_ old-val new-val]
|
|
(let [old-file (:workspace-file old-val)
|
|
new-file (:workspace-file new-val)
|
|
old-data (:workspace-data old-val)
|
|
new-data (:workspace-data new-val)]
|
|
(if (and (identical? old-file new-file)
|
|
(identical? old-data new-data))
|
|
::not-changed
|
|
(file/file-proxy (:id new-file)))))
|
|
|
|
(defmethod handle-state-change "pagechange"
|
|
[_ old-val new-val]
|
|
(let [file-id (:current-file-id new-val)
|
|
old-page-id (:current-page-id old-val)
|
|
new-page-id (:current-page-id new-val)
|
|
old-page (dm/get-in old-val [:workspace-data :pages-index old-page-id])
|
|
new-page (dm/get-in new-val [:workspace-data :pages-index new-page-id])]
|
|
(if (identical? old-page new-page)
|
|
::not-changed
|
|
(page/page-proxy file-id new-page-id))))
|
|
|
|
(defmethod handle-state-change "selectionchange"
|
|
[_ old-val new-val]
|
|
(let [old-selection (get-in old-val [:workspace-local :selected])
|
|
new-selection (get-in new-val [:workspace-local :selected])]
|
|
(if (identical? old-selection new-selection)
|
|
::not-changed
|
|
(apply array (map str new-selection)))))
|
|
|
|
(defmethod handle-state-change "themechange"
|
|
[_ old-val new-val]
|
|
(let [old-theme (get-in old-val [:profile :theme])
|
|
new-theme (get-in new-val [:profile :theme])]
|
|
(if (identical? old-theme new-theme)
|
|
::not-changed
|
|
(if (= new-theme "default")
|
|
"dark"
|
|
new-theme))))
|
|
|
|
(defmethod handle-state-change :default
|
|
[_ _ _]
|
|
::not-changed)
|
|
|
|
(defn add-listener
|
|
[type callback]
|
|
(let [key (js/Symbol)
|
|
callback (gf/debounce callback 10)]
|
|
(add-watch
|
|
st/state key
|
|
(fn [_ _ old-val new-val]
|
|
(let [result (handle-state-change type old-val new-val)]
|
|
(when (not= ::not-changed result)
|
|
(callback result)))))
|
|
|
|
;; return the generated key
|
|
key))
|
|
|
|
(defn remove-listener
|
|
[key]
|
|
(remove-watch st/state key))
|