import { useEffect, useState } from "preact/hooks";
import { EditorMode } from "./Editor.tsx";
interface TopBarProps {
allowMode: EditorMode;
isLogined: boolean;
shared: boolean;
title: string;
id: string;
}
const settingsData: { [key: string]: string } = {};
const shareData: { [key: string]: boolean } = {};
export default function TopBar(props: TopBarProps) {
const [mode, setMode] = useState(props.allowMode);
const doLogout = async () => {
const resp = await fetch("/api/user/logout");
const respJson = await resp.json();
if (respJson.success) {
location.href = "/login";
return true;
}
return false;
};
const goHome = () => {
location.href = "/";
};
const showShare = () => {
shareData["shared"] = shareData["submittedShared"] !== undefined
? shareData["submittedShared"]
: props.shared;
window.$modal?.show(
"Share options",
{
shareData["shared"] = (e.target as HTMLInputElement).checked;
(
document.querySelector("#shared-button") as HTMLButtonElement
).style.visibility = shareData["shared"] ? "visible" : "hidden";
}}
/>
Shared to friends
,
[
{
text: "Confirm",
onClick: async () => {
const resp = await fetch("/api/share", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
id: props.id,
shared: shareData["shared"],
}),
});
const respJson = await resp.json();
if (respJson.success) {
shareData["submittedShared"] = shareData["shared"];
window.$modal?.hide();
}
},
},
],
);
};
const showSetting = () => {
settingsData["title"] = settingsData["submittedTitle"] || props.title;
window.$modal?.show(
"Post Settings",
Title
{
settingsData["title"] = (e.target as HTMLInputElement).value;
}}
/>
,
[
{
text: "Confirm",
onClick: async () => {
const resp = await fetch("/api/post", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
id: props.id,
title: settingsData["title"],
}),
});
const respJson = await resp.json();
if (respJson.success) {
settingsData["submittedTitle"] = settingsData["title"];
document.title = settingsData["title"];
window.$modal?.hide();
}
},
},
],
);
};
// Event listener
const modeChangeListener = (e: CustomEvent) => {
if (
e.detail &&
(props.allowMode === e.detail || props.allowMode === EditorMode.Both)
) {
setMode(e.detail);
}
};
// Event dispatcher
const modeChangeDispatcher = (mode: EditorMode) => {
dispatchEvent(new CustomEvent("ModeChange", { detail: mode }));
};
// Init event listeners
useEffect(() => {
addEventListener("ModeChange", modeChangeListener);
return () => {
removeEventListener("ModeChange", modeChangeListener);
};
}, []);
return (
{!props.isLogined
?
{props.title}
: null}
{props.isLogined
? (
)
: null}
);
}