'use client'; import { SponsorshipRequestItem } from '@/components/sponsors/SponsorshipRequestItem'; import { Badge } from '@/ui/Badge'; import { Heading } from '@/ui/Heading'; import { Icon } from '@/ui/Icon'; import { Stack } from '@/ui/Stack'; import { Text } from '@/ui/Text'; import { Building } from 'lucide-react'; import { useState } from 'react'; export interface PendingRequestDTO { id: string; sponsorId: string; sponsorName: string; sponsorLogo?: string | undefined; tier: string; offeredAmount: number; currency: string; formattedAmount: string; message?: string | undefined; createdAt: string | Date; platformFee: number; netAmount: number; } interface PendingSponsorshipRequestsProps { entityType: 'driver' | 'team' | 'race' | 'season'; entityId: string; entityName: string; requests: PendingRequestDTO[]; onAccept: (requestId: string) => Promise; onReject: (requestId: string, reason?: string) => Promise; isLoading?: boolean; } export function PendingSponsorshipRequests({ entityType, requests, onAccept, onReject, isLoading = false, }: PendingSponsorshipRequestsProps) { const [processingId, setProcessingId] = useState(null); const [rejectModalId, setRejectModalId] = useState(null); const [rejectReason, setRejectReason] = useState(''); const handleAccept = async (requestId: string) => { setProcessingId(requestId); try { await onAccept(requestId); } finally { setProcessingId(null); } }; const handleReject = async (requestId: string) => { setProcessingId(requestId); try { await onReject(requestId, rejectReason || undefined); setRejectModalId(null); setRejectReason(''); } finally { setProcessingId(null); } }; if (isLoading) { return ( Loading sponsorship requests... ); } if (requests.length === 0) { return ( No pending sponsorship requests When sponsors apply to sponsor this {entityType}, their requests will appear here. Sponsorships are attached to seasons, so you can change partners from season to season. ); } return ( Sponsorship Requests {requests.length} pending {requests.map((request) => ( handleAccept(request.id)} onRejectClick={() => setRejectModalId(request.id)} onRejectConfirm={() => handleReject(request.id)} onRejectCancel={() => { setRejectModalId(null); setRejectReason(''); }} onRejectReasonChange={setRejectReason} /> ))} Note: Accepting a request will activate the sponsorship. The sponsor will be charged per season and you'll receive the payment minus 10% platform fee. ); }