feat: add filepicker package

This commit is contained in:
Karol Sójko
2022-07-05 19:28:22 +02:00
parent 577da2ca84
commit d4188a3fa2
45 changed files with 5848 additions and 25 deletions

View File

@@ -0,0 +1,59 @@
import { ByteChunker } from './../Chunker/ByteChunker'
import { OnChunkCallback, FileSelectionResponse } from '../types'
import { readFile as utilsReadFile } from '../utils'
import { FileReaderInterface } from '../Interface/FileReader'
export const ClassicFileReader: FileReaderInterface = {
selectFiles,
readFile,
available,
maximumFileSize,
}
function available(): boolean {
return true
}
function maximumFileSize(): number {
return 50 * 1_000_000
}
function selectFiles(): Promise<File[]> {
const input = document.createElement('input') as HTMLInputElement
input.type = 'file'
input.multiple = true
return new Promise((resolve) => {
input.onchange = async (event) => {
const target = event.target as HTMLInputElement
const files = []
for (const file of target.files as FileList) {
files.push(file)
}
resolve(files)
}
input.click()
})
}
async function readFile(
file: File,
minimumChunkSize: number,
onChunk: OnChunkCallback,
): Promise<FileSelectionResponse> {
const buffer = await utilsReadFile(file)
const chunker = new ByteChunker(minimumChunkSize, onChunk)
const readSize = 2_000_000
for (let i = 0; i < buffer.length; i += readSize) {
const chunkMax = i + readSize
const chunk = buffer.slice(i, chunkMax)
const isFinalChunk = chunkMax >= buffer.length
await chunker.addBytes(chunk, isFinalChunk)
}
return {
name: file.name,
mimeType: file.type,
}
}

View File

@@ -0,0 +1,23 @@
import { saveFile } from '../utils'
export class ClassicFileSaver {
public loggingEnabled = false
private log(...args: any[]): void {
if (!this.loggingEnabled) {
return
}
// eslint-disable-next-line no-console
console.log(args)
}
static maximumFileSize(): number {
return 50 * 1_000_000
}
saveFile(name: string, bytes: Uint8Array): void {
this.log('Saving file to disk...')
saveFile(name, bytes)
this.log('Closing write stream')
}
}