42 lines
1.4 KiB
Kotlin
42 lines
1.4 KiB
Kotlin
package dev.inmo.postssystem.client.utils
|
|
|
|
import dev.inmo.postssystem.features.files.common.FullFileInfo
|
|
import dev.inmo.micro_utils.common.*
|
|
import dev.inmo.micro_utils.mime_types.KnownMimeTypes
|
|
import dev.inmo.micro_utils.mime_types.findBuiltinMimeType
|
|
import kotlinx.coroutines.CoroutineScope
|
|
import kotlinx.coroutines.flow.MutableStateFlow
|
|
import kotlinx.coroutines.launch
|
|
import org.khronos.webgl.ArrayBuffer
|
|
import org.w3c.dom.HTMLInputElement
|
|
import org.w3c.dom.events.Event
|
|
import org.w3c.files.FileReader
|
|
import org.w3c.files.get
|
|
|
|
fun uploadFileCallbackForHTMLInputChange(
|
|
output: MutableStateFlow<FullFileInfo?>,
|
|
scope: CoroutineScope
|
|
): (Event) -> Unit = {
|
|
(it.target as? HTMLInputElement) ?.apply {
|
|
files ?.also { files ->
|
|
files[0] ?.also { file ->
|
|
scope.launch {
|
|
val reader: FileReader = FileReader()
|
|
|
|
reader.onload = {
|
|
val bytes = ((it.target.asDynamic()).result as ArrayBuffer).toByteArray()
|
|
output.value = FullFileInfo(
|
|
FileName(file.name),
|
|
findBuiltinMimeType(file.type) ?: KnownMimeTypes.Any,
|
|
bytes.asAllocator
|
|
)
|
|
Unit
|
|
}
|
|
|
|
reader.readAsArrayBuffer(file)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|