"use client"; import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { UserPlus, Trash2, Shield, Crown, User } from "lucide-react"; import { api } from "@/lib/api"; import type { UserTenant } from "@/lib/types"; import { Skeleton } from "@/components/ui/Skeleton"; import { EmptyState } from "@/components/ui/EmptyState"; const ROLE_LABELS: Record = { owner: { label: "Eigentümer", icon: Crown }, admin: { label: "Administrator", icon: Shield }, member: { label: "Mitglied", icon: User }, }; export function TeamSettings() { const queryClient = useQueryClient(); const tenantId = typeof window !== "undefined" ? localStorage.getItem("kanzlai_tenant_id") : null; const [email, setEmail] = useState(""); const [role, setRole] = useState("member"); const { data: members, isLoading, error, } = useQuery({ queryKey: ["tenant-members", tenantId], queryFn: () => api.get(`/tenants/${tenantId}/members`), enabled: !!tenantId, }); const inviteMutation = useMutation({ mutationFn: (data: { email: string; role: string }) => api.post(`/tenants/${tenantId}/invite`, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["tenant-members"] }); setEmail(""); setRole("member"); toast.success("Benutzer eingeladen"); }, onError: (err: { error?: string }) => { toast.error(err.error || "Fehler beim Einladen"); }, }); const removeMutation = useMutation({ mutationFn: (userId: string) => api.delete(`/tenants/${tenantId}/members/${userId}`), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["tenant-members"] }); toast.success("Mitglied entfernt"); }, onError: (err: { error?: string }) => { toast.error(err.error || "Fehler beim Entfernen"); }, }); const handleInvite = (e: React.FormEvent) => { e.preventDefault(); if (!email.trim()) return; inviteMutation.mutate({ email: email.trim(), role }); }; if (isLoading) { return (
); } if (error) { return ( ); } return (
{/* Invite Form */}
setEmail(e.target.value)} placeholder="name@example.com" className="flex-1 rounded-md border border-neutral-200 px-3 py-1.5 text-sm outline-none focus:border-neutral-400 focus:ring-1 focus:ring-neutral-400" />
{/* Members List */} {Array.isArray(members) && members.length > 0 ? (
{members.map((member, i) => { const roleInfo = ROLE_LABELS[member.role] || ROLE_LABELS.member; const RoleIcon = roleInfo.icon; return (

{member.user_id.slice(0, 8)}...

{roleInfo.label}

{member.role !== "owner" && ( )}
); })}
) : ( )}
); }