mirror of
https://github.com/penpot/penpot.git
synced 2026-04-25 11:18:36 +00:00
🎉 Save tokens tree state in local storage (#8922)
This commit is contained in:
parent
5dec75fe62
commit
431056404c
@ -23,6 +23,7 @@
|
||||
[app.main.data.workspace.shapes :as dwsh]
|
||||
[app.main.data.workspace.tokens.propagation :as dwtp]
|
||||
[app.util.i18n :refer [tr]]
|
||||
[app.util.storage :as storage]
|
||||
[beicon.v2.core :as rx]
|
||||
[cuerdas.core :as str]
|
||||
[potok.v2.core :as ptk]))
|
||||
@ -67,6 +68,41 @@
|
||||
;; TOKENS TREE - Type folders
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; Helper functions for localStorage persistence
|
||||
(defn- get-unfolded-token-types-from-storage
|
||||
[file-id set-id]
|
||||
(get-in storage/user [:app.main.ui.workspace.tokens/unfolded-token-types file-id set-id] #{}))
|
||||
|
||||
(defn- save-unfolded-token-types-in-storage
|
||||
[file-id set-id types]
|
||||
(swap! storage/user update :app.main.ui.workspace.tokens/unfolded-token-types
|
||||
assoc-in [file-id set-id] (vec types)))
|
||||
|
||||
;; Helper functions for app state persistence
|
||||
(defn- make-unfolded-token-types-state
|
||||
[file-id set-id types]
|
||||
{:file-id file-id
|
||||
:set-id set-id
|
||||
:types (set (or types #{}))})
|
||||
|
||||
(defn- get-unfolded-token-types-from-state
|
||||
[state]
|
||||
(let [value (get-in state [:workspace-tokens :unfolded-token-types])]
|
||||
(or (:types value) #{})))
|
||||
|
||||
(defn restore-unfolded-token-types
|
||||
"Loads unfolded token types from localStorage for the current file and set"
|
||||
[]
|
||||
(ptk/reify ::restore-unfolded-token-types
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [file-id (:current-file-id state)
|
||||
set-id (get-in state [:workspace-tokens :selected-token-set-id])
|
||||
stored (get-unfolded-token-types-from-storage file-id set-id)]
|
||||
(assoc-in state
|
||||
[:workspace-tokens :unfolded-token-types]
|
||||
(make-unfolded-token-types-state file-id set-id stored))))))
|
||||
|
||||
(defn open-token-type
|
||||
([types type]
|
||||
(conj (or types #{}) type))
|
||||
@ -74,8 +110,16 @@
|
||||
(ptk/reify ::open-token-type
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:workspace-tokens :unfolded-token-types]
|
||||
#(open-token-type % type))))))
|
||||
(let [file-id (:current-file-id state)
|
||||
set-id (get-in state [:workspace-tokens :selected-token-set-id])
|
||||
types (get-unfolded-token-types-from-state state)
|
||||
new-types (open-token-type types type)
|
||||
new-state (assoc-in state
|
||||
[:workspace-tokens :unfolded-token-types]
|
||||
(make-unfolded-token-types-state file-id set-id new-types))]
|
||||
(save-unfolded-token-types-in-storage file-id set-id
|
||||
new-types)
|
||||
new-state)))))
|
||||
|
||||
(defn close-token-type
|
||||
([types type]
|
||||
@ -84,27 +128,47 @@
|
||||
(ptk/reify ::close-token-type
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:workspace-tokens :unfolded-token-types]
|
||||
#(close-token-type % type))))))
|
||||
(let [file-id (:current-file-id state)
|
||||
set-id (get-in state [:workspace-tokens :selected-token-set-id])
|
||||
types (get-unfolded-token-types-from-state state)
|
||||
new-types (close-token-type types type)
|
||||
new-state (assoc-in state
|
||||
[:workspace-tokens :unfolded-token-types]
|
||||
(make-unfolded-token-types-state file-id set-id new-types))]
|
||||
(save-unfolded-token-types-in-storage file-id set-id
|
||||
new-types)
|
||||
new-state)))))
|
||||
|
||||
(defn toggle-token-type
|
||||
(defn
|
||||
toggle-token-type
|
||||
[type]
|
||||
(ptk/reify ::toggle-token-type
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:workspace-tokens :unfolded-token-types]
|
||||
(fn [types]
|
||||
(if (contains? (or types #{}) type)
|
||||
(close-token-type types type)
|
||||
(open-token-type types type)))))))
|
||||
(let [file-id (:current-file-id state)
|
||||
set-id (get-in state [:workspace-tokens :selected-token-set-id])
|
||||
types (get-unfolded-token-types-from-state state)
|
||||
new-types (if (contains? types type)
|
||||
(close-token-type types type)
|
||||
(open-token-type types type))
|
||||
new-state (assoc-in state
|
||||
[:workspace-tokens :unfolded-token-types]
|
||||
(make-unfolded-token-types-state file-id set-id new-types))]
|
||||
(save-unfolded-token-types-in-storage file-id set-id
|
||||
new-types)
|
||||
new-state))))
|
||||
|
||||
(defn clear-tokens-types
|
||||
[]
|
||||
(ptk/reify ::clear-tokens-types
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:workspace-tokens :unfolded-token-types] []))))
|
||||
|
||||
(let [file-id (:current-file-id state)
|
||||
set-id (get-in state [:workspace-tokens :selected-token-set-id])]
|
||||
(save-unfolded-token-types-in-storage file-id set-id #{})
|
||||
(assoc-in state
|
||||
[:workspace-tokens :unfolded-token-types]
|
||||
(make-unfolded-token-types-state file-id set-id #{}))))))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; TOKENS TREE - Toggle tree nodes
|
||||
@ -658,7 +722,12 @@
|
||||
(ptk/reify ::set-selected-token-set-id
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update state :workspace-tokens assoc :selected-token-set-id id))))
|
||||
(let [file-id (:current-file-id state)
|
||||
stored (get-unfolded-token-types-from-storage file-id id)]
|
||||
(-> state
|
||||
(update :workspace-tokens assoc :selected-token-set-id id)
|
||||
(assoc-in [:workspace-tokens :unfolded-token-types]
|
||||
(make-unfolded-token-types-state file-id id stored)))))))
|
||||
|
||||
(defn start-token-set-edition
|
||||
[edition-id]
|
||||
|
||||
@ -76,9 +76,14 @@
|
||||
(get dwta/token-properties type)
|
||||
|
||||
folded-token-paths (mf/deref ref:folded-token-paths)
|
||||
unfolded-token-types (mf/deref ref:unfolded-token-types)
|
||||
unfolded-token-types-state (mf/deref ref:unfolded-token-types)
|
||||
|
||||
is-type-unfolded (contains? (set unfolded-token-types) type)
|
||||
current-file (mf/deref refs/file)
|
||||
|
||||
is-same-file-set? (and (= (:file-id unfolded-token-types-state) (:id current-file))
|
||||
(= (:set-id unfolded-token-types-state) selected-token-set-id))
|
||||
is-type-unfolded (and is-same-file-set?
|
||||
(contains? (set (:types unfolded-token-types-state)) type))
|
||||
|
||||
editing-ref (mf/deref refs/workspace-editor-state)
|
||||
edition (mf/deref refs/selected-edition)
|
||||
@ -157,6 +162,10 @@
|
||||
:level :warning
|
||||
:timeout 3000}))))))))]
|
||||
|
||||
(mf/use-effect
|
||||
(fn []
|
||||
(st/emit! (dwtl/restore-unfolded-token-types))))
|
||||
|
||||
[:div {:class (stl/css :token-section-wrapper)
|
||||
:data-testid (dm/str "section-" (name type))}
|
||||
[:> layer-button* {:label title
|
||||
|
||||
@ -17,7 +17,6 @@
|
||||
|
||||
(defn- on-select-token-set-click [id]
|
||||
(st/emit! (dwtl/clear-tokens-paths)
|
||||
(dwtl/clear-tokens-types)
|
||||
(dwtl/set-selected-token-set-id id)))
|
||||
|
||||
(defn- on-toggle-token-set-click [name]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user