From 130cd52f797d698ecb5e6ce810a7a48d47c307a5 Mon Sep 17 00:00:00 2001 From: Andrey Fedorov Date: Fri, 20 Jun 2025 09:50:00 +0200 Subject: [PATCH] :sparkles: Notify user if imported file or directory doesn't contain token files --- .../main/data/workspace/tokens/errors.cljs | 4 ++ .../ui/workspace/tokens/modals/import.cljs | 54 +++++++++++++------ .../ui/workspace/tokens/modals/import.scss | 1 + frontend/translations/en.po | 4 ++ frontend/translations/es.po | 4 ++ 5 files changed, 50 insertions(+), 17 deletions(-) diff --git a/frontend/src/app/main/data/workspace/tokens/errors.cljs b/frontend/src/app/main/data/workspace/tokens/errors.cljs index efe9e2d1c3..7918e74726 100644 --- a/frontend/src/app/main/data/workspace/tokens/errors.cljs +++ b/frontend/src/app/main/data/workspace/tokens/errors.cljs @@ -14,6 +14,10 @@ {:error/code :error.import/json-parse-error :error/fn #(tr "workspace.tokens.error-parse")} + :error.import/no-token-files-found + {:error/code :error.import/no-token-files-found + :error/fn #(tr "workspace.tokens.no-token-files-found")} + :error.import/invalid-json-data {:error/code :error.import/invalid-json-data :error/fn #(tr "workspace.tokens.invalid-json")} diff --git a/frontend/src/app/main/ui/workspace/tokens/modals/import.cljs b/frontend/src/app/main/ui/workspace/tokens/modals/import.cljs index 7df91f9a57..44fdfc2bdd 100644 --- a/frontend/src/app/main/ui/workspace/tokens/modals/import.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/modals/import.cljs @@ -114,6 +114,23 @@ :on-click handle-option-click :set-ref (fn [_] nil)}]]])) +(defn- has-token-files? + [file-paths] + (and (seq file-paths) + (some #(str/ends-with? % ".json") file-paths))) + +(defn- validate-token-files + [file-stream] + (->> file-stream + (rx/reduce (fn [acc [file-path file-text]] + (conj acc [file-path file-text])) + []) + (rx/tap (fn [file-entries] + (let [file-paths (map first file-entries)] + (when-not (has-token-files? file-paths) + (throw (dwte/error-ex-info :error.import/no-token-files-found file-paths nil)))))) + (rx/mapcat identity))) + (mf/defc import-modal-body* {::mf/private true} [] @@ -157,6 +174,7 @@ (rx/map (fn [file-text] [(.-webkitRelativePath file) file-text]))))) + (validate-token-files) (dwti/import-directory-stream) (on-stream-imported "multiple")) @@ -171,23 +189,25 @@ (first)) zipfile-name (str/strip-suffix (.-name zipfile) ".zip")] (->> (wapi/read-file-as-array-buffer zipfile) - (rx/mapcat (fn [file-content] - (let [zip-reader (uz/reader file-content)] - (->> (rx/from (uz/get-entries zip-reader)) - (rx/mapcat - (fn [entries] - (->> (rx/from entries) - (rx/filter (fn [entry] - (let [filename (.-filename entry)] - (str/ends-with? filename ".json")))) - (rx/merge-map (fn [entry] - (let [filename (str/concat zipfile-name "/" (.-filename entry)) - content-promise (uz/read-as-text entry)] - (-> content-promise - (.then (fn [text] - [filename text])) - (rx/from)))))))) - (rx/finalize (partial uz/close zip-reader)))))) + (rx/mapcat + (fn [file-content] + (let [zip-reader (uz/reader file-content)] + (->> (rx/from (uz/get-entries zip-reader)) + (rx/mapcat + (fn [entries] + (->> (rx/from entries) + (rx/filter (fn [entry] + (let [filename (.-filename entry)] + (str/ends-with? filename ".json")))) + (rx/merge-map (fn [entry] + (let [filename (str/concat zipfile-name "/" (.-filename entry)) + content-promise (uz/read-as-text entry)] + (-> content-promise + (.then (fn [text] + [filename text])) + (rx/from)))))))) + (rx/finalize (partial uz/close zip-reader)))))) + (validate-token-files) (dwti/import-directory-stream) (on-stream-imported "zip")) diff --git a/frontend/src/app/main/ui/workspace/tokens/modals/import.scss b/frontend/src/app/main/ui/workspace/tokens/modals/import.scss index 5e2ba5fba9..5f1d9d55d7 100644 --- a/frontend/src/app/main/ui/workspace/tokens/modals/import.scss +++ b/frontend/src/app/main/ui/workspace/tokens/modals/import.scss @@ -39,6 +39,7 @@ } .import-actions { + @include t.use-typography("body-small"); display: flex; justify-content: flex-end; gap: var(--sp-s); diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 92b2de9063..374ca80637 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -7279,6 +7279,10 @@ msgstr "Token Set grouping is not supported yet." msgid "workspace.tokens.import-error" msgstr "Import Error:" +#: src/app/main/ui/workspace/tokens/modals/import.cljs +msgid "workspace.tokens.no-token-files-found" +msgstr "No tokens, sets, or themes were found in this file." + #: src/app/main/ui/workspace/tokens/modals/import.cljs:99 msgid "workspace.tokens.import-multiple-files" msgstr "In multiple files, the file name / path are the set names." diff --git a/frontend/translations/es.po b/frontend/translations/es.po index cc1315dbd2..4c1f4486ee 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -7381,6 +7381,10 @@ msgstr "No hay temas." msgid "workspace.tokens.no-themes-currently" msgstr "Actualmente no existen temas." +#: src/app/main/ui/workspace/tokens/modals/import.cljs +msgid "workspace.tokens.no-tokens-found" +msgstr "No se han encontrado tokens, sets o temas en este fichero." + #: src/app/main/ui/workspace/tokens/modals/themes.cljs:148 msgid "workspace.tokens.num-active-sets" msgstr "%s sets activos"