import { useEffect, useState } from "preact/hooks"; import { EditorMode } from "./Editor.tsx"; import Button from "../components/form/Button.tsx"; import Input from "../components/form/Input.tsx"; import Checkbox from "../components/form/Checkbox.tsx"; import ThemeToggle from "./ThemeToggle.tsx"; interface TopBarProps { allowMode: EditorMode; isLogined: boolean; shared: boolean; title: string; id: string; } const settingsData: { [key: string]: string } = {}; const shareData: { [key: string]: boolean | string } = {}; 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"] as boolean : props.shared; shareData["password"] = shareData["submittedPassword"] || ""; globalThis.$modal?.show( "Share options",
{ shareData["shared"] = (e.target as HTMLInputElement).checked; const extraEl = document.querySelector( "#share-extra", ) as HTMLDivElement; extraEl.style.display = shareData["shared"] ? "flex" : "none"; }} />
Password { shareData["password"] = (e.target as HTMLInputElement).value; }} />
, [ { 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"], password: shareData["password"] || "", }), }); const respJson = await resp.json(); if (respJson.success) { shareData["submittedShared"] = shareData["shared"]; shareData["submittedPassword"] = shareData["password"]; globalThis.$modal?.hide(); } }, }, ], ); }; const showSetting = () => { settingsData["title"] = settingsData["submittedTitle"] || props.title; globalThis.$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"]; globalThis.$modal?.hide(); } }, }, ], ); }; // Event listener const modeChangeListener = (e: Event) => { const { detail } = e as CustomEvent; if ( detail && (props.allowMode === detail || props.allowMode === EditorMode.Both) ) { setMode(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}
); }