178 lines
4.2 KiB
TypeScript
178 lines
4.2 KiB
TypeScript
import AnimeNotifier from "../AnimeNotifier"
|
|
|
|
// Edit post
|
|
export function editPost(_: AnimeNotifier, element: HTMLElement) {
|
|
let postId = element.dataset.id
|
|
|
|
if(!postId) {
|
|
console.error("Post missing post ID:", postId)
|
|
return
|
|
}
|
|
|
|
let render = document.getElementById("render-" + postId) as HTMLElement
|
|
let source = document.getElementById("source-" + postId) as HTMLElement
|
|
let edit = document.getElementById("edit-toolbar-" + postId) as HTMLElement
|
|
|
|
render.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 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
|
|
let text = source.value
|
|
|
|
let updates: any = {
|
|
Text: text,
|
|
}
|
|
|
|
// Add title for threads only
|
|
if(title) {
|
|
updates.Title = title.value
|
|
}
|
|
|
|
let apiEndpoint = arn.findAPIEndpoint(element)
|
|
|
|
try {
|
|
await arn.post(apiEndpoint, updates)
|
|
arn.reloadContent()
|
|
} catch(err) {
|
|
arn.statusMessage.showError(err)
|
|
}
|
|
}
|
|
|
|
// Delete post
|
|
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)
|
|
|
|
try {
|
|
await arn.post(endpoint + "/delete")
|
|
arn.reloadContent()
|
|
} catch(err) {
|
|
arn.statusMessage.showError(err)
|
|
}
|
|
}
|
|
|
|
// Create post
|
|
export async function createPost(arn: AnimeNotifier, element: HTMLElement) {
|
|
let textarea = document.getElementById("new-post-text") as HTMLTextAreaElement
|
|
let {parentId, parentType} = element.dataset
|
|
|
|
let post = {
|
|
text: textarea.value,
|
|
parentId,
|
|
parentType,
|
|
tags: []
|
|
}
|
|
|
|
try {
|
|
await arn.post("/api/new/post", post)
|
|
await arn.reloadContent()
|
|
textarea.value = ""
|
|
} catch(err) {
|
|
arn.statusMessage.showError(err)
|
|
}
|
|
}
|
|
|
|
// Create thread
|
|
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
|
|
|
|
let thread = {
|
|
title: title.value,
|
|
text: text.value,
|
|
tags: [category.value]
|
|
}
|
|
|
|
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
|
|
export async function reply(arn: AnimeNotifier, element: HTMLElement) {
|
|
let apiEndpoint = arn.findAPIEndpoint(element)
|
|
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")
|
|
|
|
if(oldReplyArea) {
|
|
oldReplyArea.remove()
|
|
}
|
|
|
|
// Delete old reply button
|
|
let oldPostActions = document.getElementsByClassName("new-post-actions")[0]
|
|
|
|
if(oldPostActions) {
|
|
oldPostActions.remove()
|
|
}
|
|
|
|
// Fetch new reply UI
|
|
try {
|
|
let response = await fetch(`${apiEndpoint}/reply/ui`)
|
|
let html = await response.text()
|
|
replies.innerHTML = html + replies.innerHTML
|
|
arn.onNewContent(replies)
|
|
arn.assignActions()
|
|
} catch(err) {
|
|
arn.statusMessage.showError(err)
|
|
}
|
|
}
|
|
|
|
// Cancel replying to a post
|
|
export function cancelReply(arn: AnimeNotifier, _: HTMLElement) {
|
|
arn.reloadContent()
|
|
}
|
|
|
|
// Lock thread
|
|
export function lockThread(arn: AnimeNotifier, element: HTMLButtonElement) {
|
|
return setThreadLock(arn, element, true)
|
|
}
|
|
|
|
// Unlock thread
|
|
export function unlockThread(arn: AnimeNotifier, element: HTMLButtonElement) {
|
|
return setThreadLock(arn, element, false)
|
|
}
|
|
|
|
// Set thread locked state
|
|
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?`)) {
|
|
return
|
|
}
|
|
|
|
let endpoint = arn.findAPIEndpoint(element)
|
|
|
|
try {
|
|
await arn.post(`${endpoint}/${verb}`)
|
|
await arn.reloadContent()
|
|
} catch(err) {
|
|
arn.statusMessage.showError(err)
|
|
}
|
|
} |