/** @jsx h */ import { h } from "preact"; 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"] || 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}
); }