nim/admin/panel/api.js
2025-06-17 00:57:41 +08:00

163 lines
5 KiB
JavaScript

class Post {
content;
signing;
post_at;
media;
id;
constructor(id, content, signing, post_at, media) {
this.id = id;
this.content = content;
this.signing = signing;
this.post_at = post_at;
this.media = media;
}
verify(check) {
this.check = check;
}
get verify_blk() {
return {
post: this.id,
check: this.check,
};
}
}
const Fetch = async () => {
let result = await fetch("/api/admin/fetch_post", {
credentials: "include",
});
return (await result.json()).map((e) => {
return new Post(e.id, e.content, e.signing, e.post_at, e.enclosure);
});
};
let sending = [];
document.addEventListener("DOMContentLoaded", function () {
let verix_container = document.getElementById("verix_container");
const verify = (id, obj, ck) => {
obj.verify(ck);
sending.push(obj);
let child = document.getElementById(`post-${id}`);
verix_container.removeChild(child);
};
let hv = document.getElementById("hv");
const disable_display = () => {
hv.classList.add("hidden");
};
hv.onclick = disable_display;
const hover_display_img = (src) => {
hv.classList.remove("hidden");
console.log(hv.children);
hv.children[0].src = src;
};
Fetch()
.then((e) => {
if (e.length == 0) {
let nothing = document.createElement("div");
nothing.appendChild(document.createTextNode("Nothing!!!"));
nothing.className = "text-slate-300 text-3xl mx-auto";
verix_container.appendChild(nothing);
} else
e.forEach((x) => {
let post = document.createElement("div");
post.className =
"rounded bg-zinc-800 w-full h-fit text-slate-200 px-2 relative break-all";
let post_content = document.createElement("p");
post_content.className = "h-fit text-md min-h-20 mr-[30px]";
post_content.appendChild(document.createTextNode(x.content));
post.appendChild(post_content);
let media = document.createElement("div");
media.className = "w-full flex flex-row gap-2 h-fit overflow-x-auto";
post.appendChild(media);
if (x.media) {
x.media.forEach((src) => {
let media_cell = document.createElement("img");
media_cell.className = "h-30 w-auto my-auto";
media_cell.src = `/static/${src}`;
media_cell.onclick = () => {
hover_display_img(media_cell.src);
};
media.appendChild(media_cell);
});
}
let btm_bar = document.createElement("div");
let msg = document.createElement("p");
msg.className = "text-sm border-t-3";
msg.appendChild(
document.createTextNode(
`id: ${x.id}, ${x.signing ? "sign: " + x.signing + ", " : ""}post_at: ${new Date(x.post_at).toDateString()}`,
),
);
btm_bar.appendChild(msg);
post.appendChild(btm_bar);
let right_bar = document.createElement("div");
right_bar.classList =
"h-10 w-fit absolute right-0 top-0 flex flex-col gap-2 text-lg";
post.appendChild(right_bar);
let btn_cls = "rounded-2xl w-[30px] h-[30px] bg-zinc-400";
let revoke = document.createElement("button");
revoke.className = btn_cls;
revoke.onclick = () => {
verify(x.id, x, false);
};
revoke.appendChild(document.createTextNode("X"));
let issue = document.createElement("button");
issue.className = btn_cls;
issue.onclick = () => {
verify(x.id, x, true);
};
issue.appendChild(document.createTextNode("Y"));
right_bar.appendChild(revoke);
right_bar.appendChild(issue);
post.id = `post-${x.id}`;
verix_container.appendChild(post);
});
})
.catch((err) => {
alert(err);
});
const sendbtn = document.getElementById("send");
const send = () => {
sendbtn.disabled = true;
sendbtn.classList.remove("text-zinc-200");
sendbtn.classList.add("text-zinc-400");
if (sending.length > 0) {
fetch("/api/admin/verify_post", {
body: JSON.stringify({ choice: sending.map((e) => e.verify_blk) }),
headers: { "Content-Type": "application/json" },
credentials: "include",
method: "PUT",
})
.then(async (resp) => {
if (resp.status == 200) {
sending = [];
alert("成功");
} else {
alert(`Err: ${resp.statusText}, ${await resp.text()}`);
}
})
.catch((err) => alert(err))
.finally(() => {
sendbtn.disabled = false;
sendbtn.classList.add("text-zinc-200");
sendbtn.classList.remove("text-zinc-400");
});
} else {
alert("Nothing");
sendbtn.classList.add("text-zinc-200");
sendbtn.classList.remove("text-zinc-400");
sendbtn.disabled = false;
}
};
sendbtn.onclick = send;
});