mirror of
https://github.com/penpot/penpot.git
synced 2025-03-10 06:41:40 -05:00
Debounced update of resolved value
This commit is contained in:
parent
f00ac72fbe
commit
35ee732701
2 changed files with 58 additions and 22 deletions
|
@ -15,6 +15,8 @@
|
|||
[malli.error :as me]
|
||||
[rumext.v2 :as mf]))
|
||||
|
||||
;; Schemas ---------------------------------------------------------------------
|
||||
|
||||
(defn token-name-schema
|
||||
"Generate a dynamic schema validation to check if a token name already exists.
|
||||
`existing-token-names` should be a set of strings."
|
||||
|
@ -35,9 +37,14 @@
|
|||
(me/humanize))
|
||||
nil)
|
||||
|
||||
;; Helpers ---------------------------------------------------------------------
|
||||
|
||||
(defn finalize-name [name]
|
||||
(str/trim name))
|
||||
|
||||
(defn finalize-value [name]
|
||||
(str/trim name))
|
||||
|
||||
(mf/defc form
|
||||
{::mf/wrap-props false}
|
||||
[{:keys [token] :as _args}]
|
||||
|
@ -71,22 +78,18 @@
|
|||
(reset! name-errors errors)))
|
||||
disabled? (or
|
||||
@name-errors
|
||||
(empty? (finalize-name (:name state))))]
|
||||
|
||||
;; on-update-name (fn [e]
|
||||
;; (let [{:keys [errors] :as state} (mf/deref state*)
|
||||
;; value (-> (dom/get-target-val e)
|
||||
;; (str/trim))]
|
||||
;; (cond-> @state*
|
||||
;; ;; Remove existing name errors
|
||||
;; :always (update :errors set/difference #{:empty})
|
||||
;; (str/empty?) (conj))
|
||||
;; (swap! state* assoc :name (dom/get-target-val e))))
|
||||
;; on-update-description #(swap! state* assoc :description (dom/get-target-val %))
|
||||
;; on-update-field (fn [idx e]
|
||||
;; (let [value (dom/get-target-val e)]
|
||||
;; (swap! state* assoc-in [idx :value] value)))
|
||||
(empty? (finalize-name (:name state))))
|
||||
|
||||
;; Value
|
||||
value (mf/use-var (or (:value token) ""))
|
||||
resolved-value (mf/use-state nil)
|
||||
set-resolve-value (mf/use-callback
|
||||
(fn [token]
|
||||
(js/console.log "token" (:resolved-value token))
|
||||
(when (:resolved-value token)
|
||||
(reset! resolved-value (:resolved-value token)))))
|
||||
value-errors (mf/use-state nil)
|
||||
on-update-value (sd/use-debonced-resolve-callback tokens set-resolve-value)]
|
||||
|
||||
;; on-submit (fn [e]
|
||||
;; (dom/prevent-default e)
|
||||
|
@ -106,19 +109,17 @@
|
|||
[:div
|
||||
[:& tokens.common/labeled-input {:label "Name"
|
||||
:error? @name-errors
|
||||
:input-props {:default-value (:name state)
|
||||
:input-props {:default-value @name
|
||||
:auto-focus true
|
||||
:on-change on-update-name}}]
|
||||
(when @name-errors
|
||||
[:p {:class (stl/css :error)}
|
||||
(me/humanize @name-errors)])]
|
||||
[:& tokens.common/labeled-input {:label "Value"
|
||||
:input-props {:default-value (:value state)
|
||||
#_#_:on-change #(on-update-field idx %)}}]
|
||||
;; (when (and @resolved-value
|
||||
;; (not= @resolved-value (:value (first @state*))))
|
||||
;; [:div {:class (stl/css :resolved-value)}
|
||||
;; [:p @resolved-value]])
|
||||
:input-props {:default-value @value
|
||||
:on-change on-update-value}}]
|
||||
[:div {:class (stl/css :resolved-value)}
|
||||
[:p @resolved-value]]
|
||||
[:& tokens.common/labeled-input {:label "Description"
|
||||
:input-props {:default-value (:description state)
|
||||
#_#_:on-change #(on-update-description %)}}]
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
["style-dictionary$default" :as sd]
|
||||
[app.common.data :as d]
|
||||
[app.main.refs :as refs]
|
||||
[app.util.dom :as dom]
|
||||
[cuerdas.core :as str]
|
||||
[promesa.core :as p]
|
||||
[rumext.v2 :as mf]
|
||||
|
@ -77,7 +78,9 @@
|
|||
(defn resolve-tokens+
|
||||
[tokens & {:keys [debug?] :as config}]
|
||||
(p/let [sd-tokens (-> (tokens-name-map tokens)
|
||||
(doto js/console.log)
|
||||
(resolve-sd-tokens+ config))]
|
||||
(js/console.log "sd-tokens" sd-tokens)
|
||||
(let [resolved-tokens (reduce
|
||||
(fn [acc ^js cur]
|
||||
(let [value (.-value cur)
|
||||
|
@ -101,6 +104,38 @@
|
|||
|
||||
;; Hooks -----------------------------------------------------------------------
|
||||
|
||||
(defn use-debonced-resolve-callback
|
||||
[tokens on-success & {:keys [cached timeout]
|
||||
:or {cached {}
|
||||
timeout 500}}]
|
||||
(let [id-ref (mf/use-ref nil)
|
||||
cache (mf/use-ref cached)
|
||||
debounced-resolver-callback
|
||||
(mf/use-callback
|
||||
(mf/deps on-success tokens)
|
||||
(fn [event]
|
||||
(let [input (dom/get-target-val event)
|
||||
id (js/Symbol)]
|
||||
(mf/set-ref-val! id-ref id)
|
||||
(js/setTimeout
|
||||
(fn []
|
||||
(when (= (mf/ref-val id-ref) id)
|
||||
(if-let [cached (-> (mf/ref-val cache)
|
||||
(get tokens))]
|
||||
(on-success cached)
|
||||
(let [token-id (random-uuid)
|
||||
new-tokens (assoc tokens token-id {:id token-id
|
||||
:value input
|
||||
:name "TEMP"})]
|
||||
(-> (resolve-tokens+ new-tokens)
|
||||
(p/catch js/console.error)
|
||||
(p/then (fn [resolved-tokens]
|
||||
(mf/set-ref-val! cache (assoc (mf/ref-val cache) tokens resolved-tokens))
|
||||
(when (= (mf/ref-val id-ref) id)
|
||||
(on-success (get resolved-tokens token-id))))))))))
|
||||
timeout))))]
|
||||
debounced-resolver-callback))
|
||||
|
||||
(defonce !tokens-cache (atom nil))
|
||||
|
||||
(defn use-resolved-tokens
|
||||
|
|
Loading…
Add table
Reference in a new issue