From 8bf1f7fff67eba99c6783d46957563cb9fb3a945 Mon Sep 17 00:00:00 2001 From: Katja Lutz Date: Wed, 22 Jun 2022 19:25:46 +0200 Subject: [PATCH] feat: implement client filesystem utilities --- src/client/filesystem.ts | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/client/filesystem.ts diff --git a/src/client/filesystem.ts b/src/client/filesystem.ts new file mode 100644 index 0000000..4ef0d2f --- /dev/null +++ b/src/client/filesystem.ts @@ -0,0 +1,49 @@ +export const uploadFile = (file: File, type: "dataUrl" | "text" = "text") => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.addEventListener("load", () => { + if (reader.error) { + return reject(reader.error); + } + if (reader.result == null) { + return reject(new Error("Result was empty")); + } + resolve(reader.result.toString()); + }); + + if (type === "dataUrl") { + reader.readAsDataURL(file); + } + if (type === "text") { + reader.readAsText(file); + } + }); +}; + +export const saveFile = (name: string, type: string, content: string) => { + const a = document.createElement("a"); + const blob = new Blob([content], { + type, + }); + const url = URL.createObjectURL(blob); + a.setAttribute("href", url); + a.setAttribute("download", name); + a.click(); +}; + +export const selectLocalFiles = (type: string[]) => { + return new Promise((resolve, reject) => { + const fileInput = document.createElement("input"); + fileInput.type = "file"; + fileInput.accept = type.join(","); + fileInput.oninput = (evt) => { + const files: FileList | undefined = (evt.currentTarget as any).files; + if (!files) { + return resolve(new FileList()); + } + + resolve(files); + }; + fileInput.click(); + }); +};