front-hub/src/utils/readFile.ts

59 lines
1.1 KiB
TypeScript
Raw Permalink Normal View History

2023-11-05 23:33:40 +00:00
import type { Attachment } from "@root/model/attachment"
2023-07-06 21:52:07 +00:00
type ReadFileFormat = "text" | "url" | "array" | "binary";
type ReadFileOption<T extends ReadFileFormat> = T extends "text" | "url"
? Promise<string>
: T extends "array"
? Promise<ArrayBuffer>
: T extends "binary"
? Promise<Attachment>
: Promise<null>;
export const readFile = <T extends ReadFileFormat>(
2023-11-05 23:33:40 +00:00
file: File,
format?: T
2023-07-06 21:52:07 +00:00
): ReadFileOption<T> => <ReadFileOption<T>>new Promise((resolve, reject) => {
2023-11-05 23:33:40 +00:00
const reader = new FileReader()
switch (format) {
case "text":
reader.readAsText(file)
break
case "url":
reader.readAsDataURL(file)
break
case "array":
reader.readAsArrayBuffer(file)
break
case "binary":
reader.readAsBinaryString(file)
break
default:
reader.readAsText(file)
break
}
reader.onload = (): void => {
if (!reader.result) {
return reject(new Error("File is empty"))
}
if (format === "binary") {
return resolve({
name: file.name,
content: reader.result as "string",
mimetype: file.type,
})
}
return resolve(reader.result)
}
reader.onerror = (): void => reject(new Error("Data conversion error"))
})