From 0a775f919bb4e5b03eec40c5eee793e57df8f294 Mon Sep 17 00:00:00 2001 From: ztimson Date: Fri, 19 Jul 2024 08:45:33 -0400 Subject: [PATCH] Added filebrowser & Merged a bunch of functions into file utilities --- package.json | 2 +- src/download.ts | 14 ------------- src/files.ts | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 3 +-- src/upload.ts | 25 ----------------------- 5 files changed, 56 insertions(+), 42 deletions(-) delete mode 100644 src/download.ts create mode 100644 src/files.ts delete mode 100644 src/upload.ts diff --git a/package.json b/package.json index 2e407eb..c88976d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/utils", - "version": "0.13.3", + "version": "0.14.0", "description": "Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/download.ts b/src/download.ts deleted file mode 100644 index 7b38e27..0000000 --- a/src/download.ts +++ /dev/null @@ -1,14 +0,0 @@ -export function download(href: any, name: string) { - const a = document.createElement('a'); - a.href = href; - a.download = name; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); -} - -export function downloadBlob(blob: Blob, name: string) { - const url = URL.createObjectURL(blob); - download(url, name); - URL.revokeObjectURL(url); -} diff --git a/src/files.ts b/src/files.ts new file mode 100644 index 0000000..6179a5c --- /dev/null +++ b/src/files.ts @@ -0,0 +1,54 @@ +import {PromiseProgress} from './promise-progress.ts'; + +export function download(href: any, name: string) { + const a = document.createElement('a'); + a.href = href; + a.download = name; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); +} + +export function downloadBlob(blob: Blob, name: string) { + const url = URL.createObjectURL(blob); + download(url, name); + URL.revokeObjectURL(url); +} + +export function fileBrowser(options: {accept?: string, multiple?: boolean} = {}): Promise { + return new Promise(res => { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = options.accept || '*'; + input.style.display='none'; + input.multiple = !!options.multiple; + input.onblur = input.onchange = async () => { + res(Array.from(input.files)); + input.remove(); + } + document.body.appendChild(input); + input.click(); + }); +} + +export function uploadWithProgress(options: { + url: string; + file: File; + headers?: {[key: string]: string}; + withCredentials?: boolean; +}) { + return new PromiseProgress((res, rej, prog) => { + const xhr = new XMLHttpRequest(); + const formData = new FormData(); + formData.append('file', options.file); + + xhr.withCredentials = !!options.withCredentials + Object.entries(options.headers || {}).forEach(([key, value]) => xhr.setRequestHeader(key, value)); + xhr.upload.addEventListener('progress', (event) => event.lengthComputable ? prog(event.loaded / event.total) : null); + xhr.upload.addEventListener('load', (resp) => res(resp)); + xhr.upload.addEventListener('error', (err) => rej(err)); + + xhr.open('POST', options.url); + xhr.send(formData); + }); +} diff --git a/src/index.ts b/src/index.ts index bc70ecb..2f1b8f1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ export * from './array'; export * from './aset'; -export * from './download'; +export * from './files'; export * from './emitter'; export * from './errors'; export * from './http'; @@ -11,4 +11,3 @@ export * from './objects'; export * from './promise-progress'; export * from './string'; export * from './time'; -export * from './upload'; diff --git a/src/upload.ts b/src/upload.ts deleted file mode 100644 index 4166c41..0000000 --- a/src/upload.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {PromiseProgress} from './promise-progress'; - -export type UploadOptions = { - url: string; - file: File; - headers?: {[key: string]: string}; - withCredentials?: boolean; -} - -export function uploadWithProgress(options: UploadOptions) { - return new PromiseProgress((res, rej, prog) => { - const xhr = new XMLHttpRequest(); - const formData = new FormData(); - formData.append('file', options.file); - - xhr.withCredentials = !!options.withCredentials - Object.entries(options.headers || {}).forEach(([key, value]) => xhr.setRequestHeader(key, value)); - xhr.upload.addEventListener('progress', (event) => event.lengthComputable ? prog(event.loaded / event.total) : null); - xhr.upload.addEventListener('load', (resp) => res(resp)); - xhr.upload.addEventListener('error', (err) => rej(err)); - - xhr.open('POST', options.url); - xhr.send(formData); - }); -}