Dieter Vaesen
12/23/2023, 4:23 PMprivate fun <I, O> Document.loadMultipleFromDisk(
accept: String = "",
triggerLoad: FileReader.(Blob) -> Unit,
deserialize: (I) -> O,
onLoading: (List<Pair<LoadContext, O>>) -> Unit,
) {
val tempInput = (createElement("input") as HTMLInputElement).apply {
type = "file"
style.display = "none"
this.accept = accept
multiple = true
}
tempInput.onchange = { changeEvt ->
val selectedFiles = changeEvt.target.asDynamic().files
val length = selectedFiles.length as Int
val loadedFiles = arrayListOf<Pair<LoadContext, O>>()
for (i in 0 until length) {
val reader = FileReader()
val file = selectedFiles[i] as File
reader.onload = { loadEvt ->
val result = loadEvt.target.asDynamic().result as I
loadedFiles.add(LoadContext(file.name, file.type.takeIf { it.isNotBlank() }) to deserialize(result))
onLoading(loadedFiles)
}
reader.triggerLoad(file)
}
}
body!!.append(tempInput)
tempInput.click()
tempInput.remove()
}
fun Document.loadMultipleDataUrlFromDisk(
accept: String = "",
onLoaded: (List<Pair<LoadContext, String>>) -> Unit,
) {
loadMultipleFromDisk<String, String>(
accept,
FileReader::readAsDataURL,
{ result -> result },
onLoaded
)
}
David Herman
12/23/2023, 4:45 PMDavid Herman
12/24/2023, 4:04 AMDieter Vaesen
12/24/2023, 12:10 PM