Files
KanzlAI-mGMT/frontend/src/components/layout/Header.tsx
m bf225284d8 feat: add frontend auth pages, app layout, and Supabase integration (Phase 1E)
- Auth pages: login (password + magic link), register (with firm name), callback
- Supabase client setup: browser client, server client, middleware for session refresh
- App layout: sidebar (Dashboard, Akten, Fristen, Termine, AI Analyse, Einstellungen),
  header with user info and tenant switcher
- Shared: API client with auth headers, TypeScript types matching Go models,
  QueryClientProvider + Toaster providers
- Dependencies: @supabase/supabase-js, @supabase/ssr, @tanstack/react-query,
  lucide-react, date-fns, sonner
2026-03-25 13:39:16 +01:00

45 lines
1.2 KiB
TypeScript

"use client";
import { createClient } from "@/lib/supabase/client";
import { TenantSwitcher } from "./TenantSwitcher";
import { LogOut } from "lucide-react";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";
export function Header() {
const [email, setEmail] = useState<string | null>(null);
const router = useRouter();
const supabase = createClient();
useEffect(() => {
supabase.auth.getUser().then(({ data: { user } }) => {
setEmail(user?.email ?? null);
});
}, [supabase.auth]);
async function handleLogout() {
await supabase.auth.signOut();
router.push("/login");
router.refresh();
}
return (
<header className="flex h-14 items-center justify-between border-b border-neutral-200 bg-white px-4">
<div />
<div className="flex items-center gap-3">
<TenantSwitcher />
{email && (
<span className="text-sm text-neutral-500">{email}</span>
)}
<button
onClick={handleLogout}
title="Abmelden"
className="rounded-md p-1.5 text-neutral-400 hover:bg-neutral-100 hover:text-neutral-600"
>
<LogOut className="h-4 w-4" />
</button>
</div>
</header>
);
}