/* This file is part of GNU Taler (C) 2021-2024 Taler Systems S.A. GNU Taler is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ import { ComponentChildren, Fragment, h, VNode } from "preact"; import { useEffect, useState } from "preact/hooks"; import { AdminPaths } from "../../AdminRoutes.js"; import { InstancePaths } from "../../Routing.js"; import { Notification } from "../../utils/types.js"; import { NavigationBar } from "./NavigationBar.js"; import { Sidebar } from "./SideBar.js"; import { useSessionContext } from "../../context/session.js"; import { useNavigationContext } from "@gnu-taler/web-util/browser"; function getInstanceTitle(path: string, id: string): string { switch (path) { case InstancePaths.settings: return `${id}: Settings`; case InstancePaths.order_list: return `${id}: Orders`; case InstancePaths.order_new: return `${id}: New order`; case InstancePaths.inventory_list: return `${id}: Inventory`; case InstancePaths.inventory_new: return `${id}: New product`; case InstancePaths.inventory_update: return `${id}: Update product`; case InstancePaths.reserves_new: return `${id}: New reserve`; case InstancePaths.reserves_list: return `${id}: Reserves`; case InstancePaths.transfers_list: return `${id}: Transfers`; case InstancePaths.transfers_new: return `${id}: New transfer`; case InstancePaths.webhooks_list: return `${id}: Webhooks`; case InstancePaths.webhooks_new: return `${id}: New webhook`; case InstancePaths.webhooks_update: return `${id}: Update webhook`; case InstancePaths.otp_devices_list: return `${id}: otp devices`; case InstancePaths.otp_devices_new: return `${id}: New otp devices`; case InstancePaths.otp_devices_update: return `${id}: Update otp devices`; case InstancePaths.templates_new: return `${id}: New template`; case InstancePaths.templates_update: return `${id}: Update template`; case InstancePaths.templates_list: return `${id}: Templates`; case InstancePaths.templates_use: return `${id}: Use template`; case InstancePaths.interface: return `${id}: Interface`; default: return ""; } } function getAdminTitle(path: string, instance: string) { if (path === AdminPaths.new_instance) return `New instance`; if (path === AdminPaths.list_instances) return `Instances`; return getInstanceTitle(path, instance); } interface MenuProps {} function WithTitle({ title, children, }: { title: string; children: ComponentChildren; }): VNode { useEffect(() => { document.title = `Taler Backoffice: ${title}`; }, [title]); return {children}; } export function Menu(_p: MenuProps): VNode { const [mobileOpen, setMobileOpen] = useState(false); const { state, deImpersonate } = useSessionContext(); const { path } = useNavigationContext(); const titleWithSubtitle = !state.isAdmin ? getInstanceTitle(path, state.instance) : getAdminTitle(path, state.instance); const isLoggedIn =state.status === "loggedIn"; return (
setMobileOpen(false)} > setMobileOpen(!mobileOpen)} title={titleWithSubtitle} /> {isLoggedIn && ( )} {state.status !== "loggedOut" && state.impersonate !== undefined && ( )}
); } interface NotYetReadyAppMenuProps { title: string; onShowSettings: () => void; onLogout?: () => void; isPasswordOk: boolean; } interface NotifProps { notification?: Notification; } export function NotificationCard({ notification: n, }: NotifProps): VNode | null { if (!n) return null; return (

{n.message}

{n.description && (
{n.description}
{n.details &&
{n.details}
}
)}
); } interface NotConnectedAppMenuProps { title: string; } export function NotConnectedAppMenu({ title, }: NotConnectedAppMenuProps): VNode { const [mobileOpen, setMobileOpen] = useState(false); useEffect(() => { document.title = `Taler Backoffice: ${title}`; }, [title]); return (
setMobileOpen(false)} > setMobileOpen(!mobileOpen)} title={title} />
); } export function NotYetReadyAppMenu({ title }: NotYetReadyAppMenuProps): VNode { const [mobileOpen, setMobileOpen] = useState(false); const { state } = useSessionContext(); useEffect(() => { document.title = `Taler Backoffice: ${title}`; }, [title]); const isLoggedIn = state.status === "loggedIn"; return (
setMobileOpen(false)} > setMobileOpen(!mobileOpen)} title={title} /> {isLoggedIn && }
); }