feat: add filepicker package
This commit is contained in:
59
packages/filepicker/src/Classic/ClassicReader.ts
Normal file
59
packages/filepicker/src/Classic/ClassicReader.ts
Normal 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,
|
||||
}
|
||||
}
|
||||
23
packages/filepicker/src/Classic/ClassicSaver.ts
Normal file
23
packages/filepicker/src/Classic/ClassicSaver.ts
Normal 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')
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user