import { useEffect, useState, type ReactNode } from "react"; import { Link, useLocation } from "wouter"; import { Calendar, ChevronsUpDown, FolderOpen, HelpCircle, Mail, Menu as MenuIcon, PenSquare, Settings, Users, LogOut, Plus, RefreshCw } from "lucide-react"; import { useSession } from "@/store/session"; import { useSettings } from "@/store/settings"; import { useMail } from "@/store/mail"; import { draftFromMailto, useCompose } from "@/store/compose"; import { Avatar, useIsMobile } from "@/ui/misc"; import { MenuItem, MenuSep, MenuTitle, Popover, useMenu } from "@/ui/popover"; import { SearchBar } from "./SearchBar"; import { MailboxTree } from "./mail/MailboxTree"; import { CalendarSidebar } from "./calendar/CalendarSidebar"; import { ShortcutsDialog, useGlobalShortcuts } from "./Shortcuts"; import { formatSize } from "@/lib/format"; import { CAP } from "@/jmap/client"; export function AppShell({ children }: { children: ReactNode }) { const [location, navigate] = useLocation(); const isMobile = useIsMobile(); const collapsed = useSettings((s) => s.settings.sidebarCollapsed); const update = useSettings((s) => s.update); const [drawer, setDrawer] = useState(false); const [helpOpen, setHelpOpen] = useState(false); const openCompose = useCompose((s) => s.open); const pushConnected = useSession((s) => s.pushConnected); const session = useSession((s) => s.session); const accountId = useSession((s) => s.accountId); const setAccount = useSession((s) => s.setAccount); const logout = useSession((s) => s.logout); const acctMenu = useMenu(); const section = location.split("/")[1] || "mail"; useGlobalShortcuts({ onHelp: () => setHelpOpen(true) }); useEffect(() => setDrawer(false), [location]); // Deep link: /mail?compose=new (PWA shortcut) / mailto handler useEffect(() => { const params = new URLSearchParams(window.location.search); if (params.get("compose") === "new") { openCompose(); navigate("/mail", { replace: true }); } const mailto = params.get("mailto"); if (mailto) { openCompose(draftFromMailto(mailto)); navigate("/mail", { replace: true }); } }, [openCompose, navigate]); const accounts = session ? Object.entries(session.accounts) : []; const mailAccounts = accounts.filter(([, a]) => CAP.mail in (a.accountCapabilities ?? {})); return (
ihasmail{mailAccounts.length > 1 ? "" : ""}