// TeamInvitationBanner.tsx 'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import Button from './Button' import TeamPremierRankBadge from './TeamPremierRankBadge' import type { Invitation } from '../types/invitation' import type { Team } from '../types/team' type Props = { invitation: Invitation notificationId: string onAction: (action: 'accept' | 'reject', invitationId: string) => Promise onMarkAsRead: (id: string) => Promise } export default function TeamInvitationBanner({ invitation, notificationId, onAction, onMarkAsRead, }: Props) { const router = useRouter() const [isSubmitting, setIsSubmitting] = useState<'accept' | 'reject' | null>(null) if (!invitation?.team) return null const team: Team = invitation.team const targetHref = `/team/${team.id}` const active = team.activePlayers ?? [] const inactive = team.inactivePlayers ?? [] const badgePlayers = active.length ? active : inactive const handleRespond = async (action: 'accept' | 'reject') => { if (isSubmitting) return try { setIsSubmitting(action) await onAction(action, invitation.id) await onMarkAsRead(notificationId) } catch (err) { console.error(`[TeamInvitationView] ${action} failed:`, err) } finally { setIsSubmitting(null) } } // Klassen als Ausdruck (keine mehrzeiligen String-Literals im JSX) const cardClasses = 'relative overflow-hidden rounded-xl border bg-white/90 dark:bg-neutral-800/90 ' + 'dark:border-neutral-700 shadow-sm hover:shadow-md transition cursor-pointer ' + 'focus:outline-none ring-1 ring-green-500/15 hover:ring-green-500/25 mb-5'; return (
router.push(targetHref)} onKeyDown={(e) => e.key === 'Enter' && router.push(targetHref)} className={cardClasses} > {/* animierter, dezenter grüner Gradient */}
{/* Inhalt */}
{team.name
{team.name ?? 'Team'} {badgePlayers.length > 0 && }
Du wurdest in dieses Team eingeladen.
{/* Teammitglieder */}
{[...(team.activePlayers ?? []), ...(team.inactivePlayers ?? [])].map((p) => ( {p.name} ))}
) }