import { useParams, useNavigate } from 'react-router-dom'; import { AppLayout } from '@/components/layout/AppLayout'; import { mockPartners, mockDealTerms, mockLedger, mockKYCDocuments, mockPartnerEvents } from '@/data/mockPartnerData'; import { getRiskLevel } from '@/types/partner'; import { StatusBadge, TypeBadge } from './components/PartnerBadges'; import { KYCVaultPanel } from './components/KYCVaultPanel'; import { EventApprovalQueue } from './components/EventApprovalQueue'; import { ImpersonationDialog } from './components/ImpersonationDialog'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from '@/components/ui/accordion'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@/components/ui/alert-dialog'; import { Mail, Phone, ArrowLeft, LogIn, KeyRound, ShieldOff, Ban, UserCheck, Calendar, Wallet, TrendingUp, AlertTriangle, ExternalLink, FileSignature, DollarSign, } from 'lucide-react'; import { toast } from 'sonner'; import { cn } from '@/lib/utils'; import { resetPartner2FA, resetPartnerPassword, suspendPartner, unsuspendPartner, } from '@/lib/actions/partner-governance'; import { useState } from 'react'; export default function PartnerProfile() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const partner = mockPartners.find(p => p.id === id); const [partnerStatus, setPartnerStatus] = useState(partner?.status || 'Active'); if (!partner) { return (

Partner not found.

); } const kycDocs = mockKYCDocuments.filter(d => d.partnerId === partner.id); const partnerEvents = mockPartnerEvents.filter(e => e.partnerId === partner.id); const dealTerms = mockDealTerms.filter(d => d.partnerId === partner.id); const ledger = mockLedger.filter(l => l.partnerId === partner.id); const riskLevel = getRiskLevel(partner.riskScore); const handleReset2FA = async () => { const result = await resetPartner2FA(partner.id); if (result.success) toast.success(result.message); else toast.error(result.message); }; const handleResetPassword = async () => { const result = await resetPartnerPassword(partner.id); if (result.success) toast.success(result.message); else toast.error(result.message); }; const handleSuspend = async () => { const result = await suspendPartner(partner.id, 'Suspended by admin from profile page'); if (result.success) { toast.success(result.message); setPartnerStatus('Suspended'); } else { toast.error(result.message); } }; const handleUnsuspend = async () => { const result = await unsuspendPartner(partner.id); if (result.success) { toast.success(result.message); setPartnerStatus('Active'); } else { toast.error(result.message); } }; return ( {/* Header */}
{partner.logo ? ( {partner.name} ) : ( {partner.name.substring(0, 2)} )}

{partner.name}

{/* 3-Column Layout */}
{/* ── Column 1: Identity & Stats ───────────────────────────── */}
{/* Contact Card */}

Contact

{partner.primaryContact.name.substring(0, 2)}

{partner.primaryContact.name}

{partner.primaryContact.role || 'Contact'}

{partner.primaryContact.email}
{partner.primaryContact.phone && (
{partner.primaryContact.phone}
)}
Joined {new Date(partner.joinedAt).toLocaleDateString()}
{/* Quick Stats */}

Stats

Revenue

₹{partner.metrics.totalRevenue.toLocaleString()}

Events

{partner.metrics.eventsCount}

Open Bal.

₹{partner.metrics.openBalance.toLocaleString()}

Risk

{partner.riskScore}

{/* Admin Actions */}

Admin Actions

Reset Password This will send a password reset email to {partner.primaryContact.email}. This action is logged. Cancel Send Reset Email Reset Two-Factor Authentication This will remove {partner.name}'s 2FA setup. They will be required to re-enroll on their next login. This action is logged. Cancel Reset 2FA {partnerStatus === 'Suspended' ? ( ) : ( Suspend Partner This will suspend {partner.name}'s account. They will be unable to access their dashboard or manage events. This action is logged. Cancel Suspend )}
{/* Deal Terms & Finance Accordion */} Deal Terms {dealTerms.length} {dealTerms.length > 0 ? (
{dealTerms.map(dt => (

{dt.name}

{dt.status}

{dt.type} • {dt.params.percentage ? `${dt.params.percentage}%` : `₹${dt.params.amount}`}

))}
) : (

No deals configured

)}
Finance Ledger {ledger.length} {ledger.length > 0 ? (
{ledger.map(entry => (

{entry.description}

{new Date(entry.createdAt).toLocaleDateString()} • {entry.type}

= 0 ? 'text-success' : 'text-destructive')}> {entry.amount >= 0 ? '+' : ''}₹{Math.abs(entry.amount).toLocaleString()}

))}
) : (

No ledger entries

)}
{/* ── Column 2: KYC Vault ──────────────────────────────────── */}

KYC & Compliance

{/* ── Column 3: Event Governance ──────────────────────────── */}

Event Governance

{/* Tags */} {partner.tags && partner.tags.length > 0 && (
{partner.tags.map(tag => ( {tag} ))}
)} {/* Notes */} {partner.notes && (

Notes

{partner.notes}

)}
); }