'use client' import { useState, useEffect, useCallback } from 'react' import { useTheme } from '@/lib/ThemeContext' import { calendarApi } from '@/lib/schulkalender/api' import { classesApi } from '@/lib/stundenplan/api' import type { ParentInviteListItem, InviteParentResponse } from '@/app/schulkalender/types' import type { TimetableClass } from '@/app/stundenplan/types' const LANGS: { code: string; name: string }[] = [ { code: 'de', name: 'Deutsch' }, { code: 'en', name: 'English' }, { code: 'tr', name: 'Tuerkce' }, { code: 'ar', name: 'العربية' }, { code: 'uk', name: 'Українська' }, { code: 'ru', name: 'Русский' }, { code: 'pl', name: 'Polski' }, { code: 'fr', name: 'Francais' }, ] export function ParentManager() { const { isDark } = useTheme() const [items, setItems] = useState([]) const [classes, setClasses] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showForm, setShowForm] = useState(false) const [submitting, setSubmitting] = useState(false) const [lastInvite, setLastInvite] = useState(null) const [form, setForm] = useState({ email: '', preferred_language: 'de', child_first_name: '', child_last_name: '', tt_class_id: '', }) const load = useCallback(async () => { setLoading(true) try { const [list, cls] = await Promise.all([calendarApi.listParents(), classesApi.list()]) setItems(list || []) setClasses(cls || []) setError(null) } catch (e) { setError(e instanceof Error ? e.message : 'Laden fehlgeschlagen') } finally { setLoading(false) } }, []) useEffect(() => { load() }, [load]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSubmitting(true) setError(null) try { const res = await calendarApi.inviteParent(form) setLastInvite(res) setForm({ ...form, child_first_name: '', child_last_name: '' }) await load() } catch (err) { setError(err instanceof Error ? err.message : 'Einladen fehlgeschlagen') } finally { setSubmitting(false) } } const handleDelete = async (childId: string) => { if (!confirm('Eltern-Zuordnung wirklich loeschen?')) return try { await calendarApi.deleteParentChild(childId); await load() } catch (e) { setError(e instanceof Error ? e.message : 'Loeschen fehlgeschlagen') } } const fullLink = (path: string) => typeof window === 'undefined' ? path : `${window.location.origin}${path}` const copyLink = (path: string) => { navigator.clipboard?.writeText(fullLink(path)) } const cardClass = isDark ? 'bg-white/10 border-white/20 text-white' : 'bg-white/80 border-black/10 text-slate-900' const inputClass = isDark ? 'bg-white/10 border-white/20 text-white' : 'bg-white border-slate-300 text-slate-900' return (

Eltern verwalten ({items.length})

{classes.length === 0 && (

Zuerst Klassen im Stundenplan-Modul anlegen.

)} {error && (
{error}
)} {showForm && (
setForm({ ...form, email: e.target.value })} data-testid="parent-email" className={`px-3 py-2 rounded-lg border ${inputClass}`} /> setForm({ ...form, child_first_name: e.target.value })} data-testid="parent-child-first" className={`px-3 py-2 rounded-lg border ${inputClass}`} /> setForm({ ...form, child_last_name: e.target.value })} data-testid="parent-child-last" className={`px-3 py-2 rounded-lg border ${inputClass}`} />
)} {lastInvite && (
Einladungs-Link fuer {lastInvite.parent.email}
{fullLink(lastInvite.magic_url)}

Gueltig bis {new Date(lastInvite.expires_at).toLocaleString('de-DE')}

)} {loading ? (
Laedt…
) : items.length === 0 ? (
Keine eingeladenen Eltern.
) : ( {items.map(it => ( ))}
E-Mail Kind Klasse Sprache
{it.email} {it.child_first_name} {it.child_last_name} {it.class_name} {it.preferred_language}
)}
) }