Added null checks and async functions

This commit is contained in:
Eduard Urbach 2019-04-22 15:02:51 +09:00
parent b1442858fe
commit 06daacbbf6
9 changed files with 158 additions and 75 deletions

View File

@ -5,6 +5,12 @@ export async function addAnimeToCollection(arn: AnimeNotifier, button: HTMLButto
button.disabled = true
let {animeId} = button.dataset
if(!animeId) {
console.error("Button without anime ID:", button)
return
}
let apiEndpoint = arn.findAPIEndpoint(button)
try {
@ -21,7 +27,7 @@ export async function addAnimeToCollection(arn: AnimeNotifier, button: HTMLButto
}
// Remove anime from collection
export function removeAnimeFromCollection(arn: AnimeNotifier, button: HTMLElement) {
export async function removeAnimeFromCollection(arn: AnimeNotifier, button: HTMLElement) {
if(!confirm("Are you sure you want to remove it from your collection?")) {
return
}
@ -29,9 +35,19 @@ export function removeAnimeFromCollection(arn: AnimeNotifier, button: HTMLElemen
button.textContent = "Removing..."
let {animeId, nick} = button.dataset
let apiEndpoint = arn.findAPIEndpoint(button)
arn.post(apiEndpoint + "/remove/" + animeId)
.then(() => arn.app.load(`/+${nick}/animelist/` + (document.getElementById("Status") as HTMLSelectElement).value))
.catch(err => arn.statusMessage.showError(err))
if(!animeId || !nick) {
console.error("Button without nick or anime ID:", button)
return
}
let apiEndpoint = arn.findAPIEndpoint(button)
let status = document.getElementById("Status") as HTMLSelectElement
try {
await arn.post(apiEndpoint + "/remove/" + animeId)
await arn.app.load(`/+${nick}/animelist/` + status.value)
} catch(err) {
arn.statusMessage.showError(err)
}
}

View File

@ -2,7 +2,14 @@ import AnimeNotifier from "../AnimeNotifier"
// Play audio
export function playAudio(arn: AnimeNotifier, element: HTMLElement) {
arn.audioPlayer.play(element.dataset.mediaId, element.dataset.audioSrc)
let {mediaId, audioSrc} = element.dataset
if(!mediaId || !audioSrc) {
console.error("Invalid media ID or audio source:", element)
return
}
arn.audioPlayer.play(mediaId, audioSrc)
}
// Pause audio

View File

@ -3,18 +3,20 @@ import { requestIdleCallback } from "../Utils"
// Load
export function load(arn: AnimeNotifier, element: HTMLElement) {
let url = element.dataset.url || (element as HTMLAnchorElement).getAttribute("href")
let url = element.dataset.url || (element as HTMLAnchorElement).href
arn.app.load(url)
}
// Diff
export function diff(arn: AnimeNotifier, element: HTMLElement) {
let url = element.dataset.url || (element as HTMLAnchorElement).getAttribute("href")
export async function diff(arn: AnimeNotifier, element: HTMLElement) {
let url = element.dataset.url || (element as HTMLAnchorElement).href
try {
await arn.diff(url)
arn.diff(url)
.then(() => {
// Avoid instant layout thrashing
requestIdleCallback(() => arn.scrollTo(element))
})
.catch(console.error)
} catch(err) {
arn.statusMessage.showError(err)
}
}

View File

@ -1,7 +1,7 @@
import AnimeNotifier from "../AnimeNotifier"
// newAnimeDiffIgnore
export function newAnimeDiffIgnore(arn: AnimeNotifier, button: HTMLButtonElement) {
export async function newAnimeDiffIgnore(arn: AnimeNotifier, button: HTMLButtonElement) {
if(!confirm("Are you sure you want to permanently ignore this difference?")) {
return
}
@ -9,14 +9,16 @@ export function newAnimeDiffIgnore(arn: AnimeNotifier, button: HTMLButtonElement
let id = button.dataset.id
let hash = button.dataset.hash
arn.post(`/api/new/ignoreanimedifference`, {
id,
hash
})
.then(() => {
try {
await arn.post(`/api/new/ignoreanimedifference`, {
id,
hash
})
arn.reloadContent()
})
.catch(err => arn.statusMessage.showError(err))
} catch(err) {
arn.statusMessage.showError(err)
}
}
// Import Kitsu anime
@ -26,6 +28,12 @@ export async function importKitsuAnime(arn: AnimeNotifier, button: HTMLButtonEle
}
let newTab = window.open()
if(!newTab) {
arn.statusMessage.showError("Error opening new tab")
return
}
let animeId = button.dataset.id
let response = await fetch(`/api/import/kitsu/anime/${animeId}`, {
method: "POST",

View File

@ -3,7 +3,7 @@ import { findAll } from "scripts/Utils"
// Filter anime on explore page
export function filterAnime(arn: AnimeNotifier, input: HTMLInputElement) {
let root = document.getElementById("filter-root")
let root = document.getElementById("filter-root") as HTMLElement
let elementYear = document.getElementById("filter-year") as HTMLSelectElement
let elementSeason = document.getElementById("filter-season") as HTMLSelectElement

View File

@ -4,24 +4,30 @@ import AnimeNotifier from "../AnimeNotifier"
export function editPost(arn: AnimeNotifier, element: HTMLElement) {
let postId = element.dataset.id
let render = document.getElementById("render-" + postId)
let toolbar = document.getElementById("toolbar-" + postId)
let title = document.getElementById("title-" + postId)
let source = document.getElementById("source-" + postId)
let edit = document.getElementById("edit-toolbar-" + postId)
if(!postId) {
console.error("Post missing post ID:", postId)
return
}
let render = document.getElementById("render-" + postId) as HTMLElement
let toolbar = document.getElementById("toolbar-" + postId) as HTMLElement
let source = document.getElementById("source-" + postId) as HTMLElement
let edit = document.getElementById("edit-toolbar-" + postId) as HTMLElement
render.classList.toggle("hidden")
toolbar.classList.toggle("hidden")
source.classList.toggle("hidden")
edit.classList.toggle("hidden")
let title = document.getElementById("title-" + postId)
if(title) {
title.classList.toggle("hidden")
}
}
// Save post
export function savePost(arn: AnimeNotifier, element: HTMLElement) {
export async function savePost(arn: AnimeNotifier, element: HTMLElement) {
let postId = element.dataset.id
let source = document.getElementById("source-" + postId) as HTMLTextAreaElement
let title = document.getElementById("title-" + postId) as HTMLInputElement
@ -38,26 +44,32 @@ export function savePost(arn: AnimeNotifier, element: HTMLElement) {
let apiEndpoint = arn.findAPIEndpoint(element)
arn.post(apiEndpoint, updates)
.then(() => arn.reloadContent())
.catch(err => arn.statusMessage.showError(err))
try {
await arn.post(apiEndpoint, updates)
arn.reloadContent()
} catch(err) {
arn.statusMessage.showError(err)
}
}
// Delete post
export function deletePost(arn: AnimeNotifier, element: HTMLElement) {
export async function deletePost(arn: AnimeNotifier, element: HTMLElement) {
if(!confirm(`Are you sure you want to delete this Post?`)) {
return
}
let endpoint = arn.findAPIEndpoint(element)
arn.post(endpoint + "/delete")
.then(() => arn.reloadContent())
.catch(err => arn.statusMessage.showError(err))
try {
await arn.post(endpoint + "/delete")
arn.reloadContent()
} catch(err) {
arn.statusMessage.showError(err)
}
}
// Create post
export function createPost(arn: AnimeNotifier, element: HTMLElement) {
export async function createPost(arn: AnimeNotifier, element: HTMLElement) {
let textarea = document.getElementById("new-post-text") as HTMLTextAreaElement
let {parentId, parentType} = element.dataset
@ -68,14 +80,17 @@ export function createPost(arn: AnimeNotifier, element: HTMLElement) {
tags: []
}
arn.post("/api/new/post", post)
.then(() => arn.reloadContent())
.then(() => textarea.value = "")
.catch(err => arn.statusMessage.showError(err))
try {
await arn.post("/api/new/post", post)
await arn.reloadContent()
textarea.value = ""
} catch(err) {
arn.statusMessage.showError(err)
}
}
// Create thread
export function createThread(arn: AnimeNotifier) {
export async function createThread(arn: AnimeNotifier) {
let title = document.getElementById("title") as HTMLInputElement
let text = document.getElementById("text") as HTMLTextAreaElement
let category = document.getElementById("tag") as HTMLInputElement
@ -86,9 +101,12 @@ export function createThread(arn: AnimeNotifier) {
tags: [category.value]
}
arn.post("/api/new/thread", thread)
.then(() => arn.app.load("/forum/" + thread.tags[0]))
.catch(err => arn.statusMessage.showError(err))
try {
await arn.post("/api/new/thread", thread)
await arn.app.load("/forum/" + thread.tags[0])
} catch(err) {
arn.statusMessage.showError(err)
}
}
// Reply to a post
@ -97,6 +115,11 @@ export async function reply(arn: AnimeNotifier, element: HTMLElement) {
let repliesId = `replies-${element.dataset.postId}`
let replies = document.getElementById(repliesId)
if(!replies) {
console.error("Missing replies container:", element)
return
}
// Delete old reply area
let oldReplyArea = document.getElementById("new-post")
@ -130,16 +153,16 @@ export function cancelReply(arn: AnimeNotifier, element: HTMLElement) {
// Lock thread
export function lockThread(arn: AnimeNotifier, element: HTMLButtonElement) {
setThreadLock(arn, element, true)
return setThreadLock(arn, element, true)
}
// Unlock thread
export function unlockThread(arn: AnimeNotifier, element: HTMLButtonElement) {
setThreadLock(arn, element, false)
return setThreadLock(arn, element, false)
}
// Set thread locked state
function setThreadLock(arn: AnimeNotifier, element: HTMLButtonElement, state: boolean) {
async function setThreadLock(arn: AnimeNotifier, element: HTMLButtonElement, state: boolean) {
let verb = state ? "lock" : "unlock"
if(!confirm(`Are you sure you want to ${verb} this Thread?`)) {
@ -148,7 +171,10 @@ function setThreadLock(arn: AnimeNotifier, element: HTMLButtonElement, state: bo
let endpoint = arn.findAPIEndpoint(element)
arn.post(`${endpoint}/${verb}`)
.then(() => arn.reloadContent())
.catch(err => arn.statusMessage.showError(err))
try {
await arn.post(`${endpoint}/${verb}`)
await arn.reloadContent()
} catch(err) {
arn.statusMessage.showError(err)
}
}

View File

@ -1,17 +1,30 @@
import AnimeNotifier from "../AnimeNotifier"
// New
export function newObject(arn: AnimeNotifier, button: HTMLButtonElement) {
export async function newObject(arn: AnimeNotifier, button: HTMLButtonElement) {
let dataType = button.dataset.type
arn.post(`/api/new/${dataType}`)
.then(response => response.json())
.then(obj => arn.app.load(`/${dataType}/${obj.id}/edit`))
.catch(err => arn.statusMessage.showError(err))
if(!dataType) {
console.error("Missing data type:", button)
return
}
try {
let response = await arn.post(`/api/new/${dataType}`)
if(!response) {
throw `Failed creating ${dataType}`
}
let json = await response.json()
await arn.app.load(`/${dataType}/${json.id}/edit`)
} catch(err) {
arn.statusMessage.showError(err)
}
}
// Delete
export function deleteObject(arn: AnimeNotifier, button: HTMLButtonElement) {
export async function deleteObject(arn: AnimeNotifier, button: HTMLButtonElement) {
let confirmType = button.dataset.confirmType
let returnPath = button.dataset.returnPath
@ -28,13 +41,15 @@ export function deleteObject(arn: AnimeNotifier, button: HTMLButtonElement) {
let endpoint = arn.findAPIEndpoint(button)
arn.post(endpoint + "/delete")
.then(() => {
try {
await arn.post(endpoint + "/delete")
if(returnPath) {
arn.app.load(returnPath)
await arn.app.load(returnPath)
} else {
arn.reloadContent()
await arn.reloadContent()
}
})
.catch(err => arn.statusMessage.showError(err))
} catch(err) {
arn.statusMessage.showError(err)
}
}

View File

@ -1,19 +1,25 @@
import AnimeNotifier from "../AnimeNotifier"
// Publish
export function publish(arn: AnimeNotifier, button: HTMLButtonElement) {
export async function publish(arn: AnimeNotifier, button: HTMLButtonElement) {
let endpoint = arn.findAPIEndpoint(button)
arn.post(endpoint + "/publish")
.then(() => arn.app.load(arn.app.currentPath.replace("/edit", "")))
.catch(err => arn.statusMessage.showError(err))
try {
await arn.post(endpoint + "/publish")
await arn.app.load(arn.app.currentPath.replace("/edit", ""))
} catch(err) {
arn.statusMessage.showError(err)
}
}
// Unpublish
export function unpublish(arn: AnimeNotifier, button: HTMLButtonElement) {
export async function unpublish(arn: AnimeNotifier, button: HTMLButtonElement) {
let endpoint = arn.findAPIEndpoint(button)
arn.post(endpoint + "/unpublish")
.then(() => arn.reloadContent())
.catch(err => arn.statusMessage.showError(err))
try {
await arn.post(endpoint + "/unpublish")
await arn.reloadContent()
} catch(err) {
arn.statusMessage.showError(err)
}
}

View File

@ -514,7 +514,7 @@ export default class AnimeNotifier {
e.dataTransfer.setData("text", element.dataset.index)
}, false)
element.addEventListener("dblclick", e => {
element.addEventListener("dblclick", async e => {
if(!element.draggable || !element.dataset.index) {
return
}
@ -527,10 +527,13 @@ export default class AnimeNotifier {
let apiEndpoint = this.findAPIEndpoint(element)
this.post(apiEndpoint + "/use/" + element.dataset.index)
.then(() => this.reloadContent())
.then(() => this.statusMessage.showInfo(`You used ${itemName}.`))
.catch(err => this.statusMessage.showError(err))
try {
await this.post(apiEndpoint + "/use/" + element.dataset.index)
await this.reloadContent()
this.statusMessage.showInfo(`You used ${itemName}.`)
} catch(err) {
this.statusMessage.showError(err)
}
}, false)
element.addEventListener("dragenter", e => {