import { useState, useRef, useEffect } from 'react' import { Package, GitBranch, RefreshCw, Sparkles, FileText, Bell, Settings, FolderOpen, Check, Github, FolderPlus, CircleDot } from 'lucide-react' export interface VaultOption { label: string path: string } interface StatusBarProps { noteCount: number modifiedCount?: number vaultPath: string vaults: VaultOption[] onSwitchVault: (path: string) => void onOpenSettings?: () => void onOpenLocalFolder?: () => void onCreateNewVault?: () => void onConnectGitHub?: () => void hasGitHub?: boolean } function VaultMenuItem({ vault, isActive, onSelect }: { vault: VaultOption; isActive: boolean; onSelect: () => void }) { return (
{ if (!isActive) e.currentTarget.style.background = 'var(--hover)' }} onMouseLeave={(e) => { if (!isActive) e.currentTarget.style.background = 'transparent' }} > {isActive ? : } {vault.label}
) } function VaultMenu({ vaults, vaultPath, onSwitchVault, onOpenLocalFolder, onCreateNewVault, onConnectGitHub, hasGitHub }: { vaults: VaultOption[]; vaultPath: string; onSwitchVault: (path: string) => void; onOpenLocalFolder?: () => void; onCreateNewVault?: () => void; onConnectGitHub?: () => void; hasGitHub?: boolean }) { const [open, setOpen] = useState(false) const menuRef = useRef(null) const activeVault = vaults.find((v) => v.path === vaultPath) useEffect(() => { if (!open) return const handleClick = (e: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) setOpen(false) } document.addEventListener('mousedown', handleClick) return () => document.removeEventListener('mousedown', handleClick) }, [open]) return (
setOpen((v) => !v)} style={{ display: 'flex', alignItems: 'center', gap: 4, cursor: 'pointer', padding: '2px 4px', borderRadius: 3, background: open ? 'var(--hover)' : 'transparent' }} title="Switch vault"> {activeVault?.label ?? 'Vault'} {open && (
{vaults.map((v) => { onSwitchVault(v.path); setOpen(false) }} />)}
{onOpenLocalFolder && (
{ onOpenLocalFolder(); setOpen(false) }} style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '4px 8px', borderRadius: 4, cursor: 'pointer', background: 'transparent', color: 'var(--muted-foreground)', fontSize: 12, }} onMouseEnter={e => { e.currentTarget.style.background = 'var(--hover)' }} onMouseLeave={e => { e.currentTarget.style.background = 'transparent' }} data-testid="vault-menu-open-local" > Open local folder
)} {onCreateNewVault && (
{ onCreateNewVault(); setOpen(false) }} style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '4px 8px', borderRadius: 4, cursor: 'pointer', background: 'transparent', color: 'var(--muted-foreground)', fontSize: 12, }} onMouseEnter={e => { e.currentTarget.style.background = 'var(--hover)' }} onMouseLeave={e => { e.currentTarget.style.background = 'transparent' }} data-testid="vault-menu-create-new" > Create new vault
)} {onConnectGitHub && (
{ onConnectGitHub(); setOpen(false) }} style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '4px 8px', borderRadius: 4, cursor: 'pointer', background: 'transparent', color: hasGitHub ? 'var(--muted-foreground)' : 'var(--accent-blue)', fontSize: 12, }} onMouseEnter={e => { e.currentTarget.style.background = 'var(--hover)' }} onMouseLeave={e => { e.currentTarget.style.background = 'transparent' }} data-testid="vault-menu-connect-github" > Connect GitHub repo
)}
)}
) } const ICON_STYLE = { display: 'flex', alignItems: 'center', gap: 4 } as const const DISABLED_STYLE = { display: 'flex', alignItems: 'center', opacity: 0.4, cursor: 'not-allowed' } as const const SEP_STYLE = { color: 'var(--border)' } as const export function StatusBar({ noteCount, modifiedCount = 0, vaultPath, vaults, onSwitchVault, onOpenSettings, onOpenLocalFolder, onCreateNewVault, onConnectGitHub, hasGitHub }: StatusBarProps) { return ( ) }