'use client' import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { useToast } from '@/components/ui/use-toast' import { Building2, Upload, X, Loader2, Shield, Trash2, AlertTriangle, } from 'lucide-react' interface OrgTabProps { tenantId?: string | null } export function OrgTab({ tenantId }: OrgTabProps) { const { toast } = useToast() const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) const [uploadingLogo, setUploadingLogo] = useState(false) const [tenant, setTenant] = useState(null) // Editable fields const [name, setName] = useState('') const [description, setDescription] = useState('') const [contactEmail, setContactEmail] = useState('') const [contactPhone, setContactPhone] = useState('') const [address, setAddress] = useState('') const fetchTenant = async () => { setLoading(true) try { const res = await fetch('/api/tenant/info') if (res.ok) { const data = await res.json() const t = data.tenant if (t) { setTenant(t) setName(t.name || '') setDescription(t.description || '') setContactEmail(t.contactEmail || '') setContactPhone(t.contactPhone || '') setAddress(t.address || '') } } } catch (e) { console.error('Failed to load tenant info:', e) } finally { setLoading(false) } } useEffect(() => { fetchTenant() }, [tenantId]) const handleSave = async () => { setSaving(true) try { const res = await fetch('/api/tenant/info', { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: name.trim(), description: description.trim() || null, contactEmail: contactEmail.trim() || null, contactPhone: contactPhone.trim() || null, address: address.trim() || null, }), }) if (res.ok) { toast({ title: 'Organisation aktualisiert' }) fetchTenant() } else { const err = await res.json() toast({ title: 'Fehler', description: err.error || 'Speichern fehlgeschlagen', variant: 'destructive' }) } } catch { toast({ title: 'Fehler', description: 'Verbindungsfehler', variant: 'destructive' }) } finally { setSaving(false) } } const handleLogoUpload = async (e: React.ChangeEvent) => { if (!e.target.files?.[0]) return setUploadingLogo(true) try { const formData = new FormData() formData.append('logo', e.target.files[0]) const res = await fetch('/api/tenant/logo', { method: 'POST', body: formData }) if (res.ok) { toast({ title: 'Logo hochgeladen' }) fetchTenant() } else { const data = await res.json() toast({ title: 'Fehler', description: data.error || 'Upload fehlgeschlagen', variant: 'destructive' }) } } catch { toast({ title: 'Fehler', description: 'Upload fehlgeschlagen', variant: 'destructive' }) } finally { setUploadingLogo(false) e.target.value = '' } } const handleLogoDelete = async () => { try { const res = await fetch('/api/tenant/logo', { method: 'DELETE' }) if (res.ok) { toast({ title: 'Logo entfernt' }) fetchTenant() } } catch { toast({ title: 'Fehler', variant: 'destructive' }) } } if (loading) { return (
) } if (!tenant) { return (
Keine Organisation zugeordnet.
) } return (
{/* Logo */}

Logo

{tenant.logoUrl ? ( Logo ) : ( )}
{tenant.logoUrl && ( )}

PNG, JPEG, SVG oder WebP, max. 2 MB. Wird auch im Rapport angezeigt.

{/* Organisation Details */}

Stammdaten

setName(e.target.value)} />
setDescription(e.target.value)} placeholder="z.B. Feuerwehr Musterstadt" />
setContactEmail(e.target.value)} placeholder="kontakt@feuerwehr.ch" />
setContactPhone(e.target.value)} placeholder="+41 ..." />
setAddress(e.target.value)} placeholder="Strasse, PLZ Ort" />
{/* Info (read-only) */}

Übersicht

Plan: {tenant.plan}
Status: {tenant.subscriptionStatus}
{tenant._count && ( <>
Benutzer: {tenant._count.memberships}
Einsätze: {tenant._count.projects}
)}
) }