- 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
45 lines
1.2 KiB
TypeScript
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>
|
|
);
|
|
}
|