80 lines
1.8 KiB
TypeScript

import { AnimeNotifier } from "../AnimeNotifier"
// Select file
export function selectFile(arn: AnimeNotifier, button: HTMLButtonElement) {
let input = document.createElement("input")
let preview = document.getElementById(button.dataset.previewImageId) as HTMLImageElement
input.setAttribute("type", "file")
input.onchange = () => {
let file = input.files[0]
previewImage(file, preview)
uploadFile(file, "/api/upload/avatar", arn)
}
input.click()
}
// Preview image
function previewImage(file: File, preview: HTMLImageElement) {
let reader = new FileReader()
reader.onloadend = () => {
let svgPreview = document.getElementById("avatar-input-preview-svg") as HTMLImageElement
if(svgPreview) {
svgPreview.classList.add("hidden")
}
preview.classList.remove("hidden")
preview.src = reader.result
}
if(file) {
reader.readAsDataURL(file)
}
}
// Upload file
function uploadFile(file: File, endpoint: string, arn: AnimeNotifier) {
let reader = new FileReader()
reader.onloadend = async () => {
arn.statusMessage.showInfo("Uploading avatar...")
let response = await fetch(endpoint, {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/octet-stream"
},
body: reader.result
})
let newURL = await response.text()
updateSideBarAvatar(newURL)
if(response.ok) {
arn.statusMessage.showInfo("Successfully uploaded your new avatar.")
} else {
arn.statusMessage.showError("Failed uploading your new avatar.")
}
}
reader.readAsArrayBuffer(file)
}
// Update sidebar avatar
function updateSideBarAvatar(url: string) {
let sidebar = document.getElementById("sidebar")
let userImage = sidebar.getElementsByClassName("user-image")[0] as HTMLImageElement
let lazyLoad = userImage["became visible"]
if(lazyLoad) {
userImage.dataset.src = url
lazyLoad()
} else {
location.reload()
}
}