'use client'; import { useState } from 'react'; import { CheckCircle, FileText, Flag, Shield, XCircle, Building2, } from 'lucide-react'; import { Badge } from '@nextcraft/ui'; import { employerVerificationQueue, flaggedContentQueue, jobReviewQueue, } from '@nextcraft/mock-data'; import type { EmployerVerificationItem, FlaggedContentItem, JobReviewItem, } from '@nextcraft/mock-data'; type TabId = 'jobs' | 'employers' | 'flagged'; const TABS: Array<{ id: TabId; label: string }> = [ { id: 'jobs', label: 'Job Posting Review' }, { id: 'employers', label: 'Employer Verification' }, { id: 'flagged', label: 'Flagged Content' }, ]; const STATUS_VARIANT = { ok: 'success', warn: 'warning', err: 'error' } as const; export function ModerationTabs() { const [tab, setTab] = useState('jobs'); const counts: Record = { jobs: jobReviewQueue.length, employers: employerVerificationQueue.length, flagged: flaggedContentQueue.length, }; return (
{/* Tab bar */}
{TABS.map((t) => { const active = t.id === tab; return ( ); })}
{tab === 'jobs' && } {tab === 'employers' && } {tab === 'flagged' && }
); } // --------------------------------------------------------------------------- // Tab 1: Job Posting Review // --------------------------------------------------------------------------- function JobReviewTab() { return (
{jobReviewQueue.map((item) => ( ))}
); } function JobReviewCard({ item }: { item: JobReviewItem }) { return (

{item.title}

{item.employerName} · {item.stackName}

{item.location} · Submitted {formatDate(item.submittedAt)}

}> Approve }> Reject }> Flag
); } // --------------------------------------------------------------------------- // Tab 2: Employer Verification // --------------------------------------------------------------------------- function EmployerVerificationTab() { return (
{employerVerificationQueue.map((item) => ( ))}
); } function EmployerVerificationCard({ item }: { item: EmployerVerificationItem }) { return (
{item.logoInitials}

{item.name}

{item.industry} · {item.location}

Submitted {formatDate(item.submittedAt)}

}> Verify }> Request More Info }> Reject
); } // --------------------------------------------------------------------------- // Tab 3: Flagged Content // --------------------------------------------------------------------------- function FlaggedContentTab() { return (
{flaggedContentQueue.map((item) => ( ))}
); } function FlaggedContentCard({ item }: { item: FlaggedContentItem }) { return (

{item.title}

{item.contentType}

Flagged by {item.flaggedBy} · {item.reason}

{formatDate(item.flaggedAt)}

}> Dismiss Flag }> Remove Content }> Warn User
); } // --------------------------------------------------------------------------- // Shared action button // --------------------------------------------------------------------------- type ActionTone = 'success' | 'error' | 'warning' | 'info' | 'neutral'; const ACTION_CLASSES: Record = { success: 'border-emerald-300 bg-emerald-50 text-emerald-700 hover:bg-emerald-100 dark:border-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-300 dark:hover:bg-emerald-900/50', error: 'border-rose-300 bg-rose-50 text-rose-700 hover:bg-rose-100 dark:border-rose-800 dark:bg-rose-900/30 dark:text-rose-300 dark:hover:bg-rose-900/50', warning: 'border-amber-300 bg-amber-50 text-amber-700 hover:bg-amber-100 dark:border-amber-800 dark:bg-amber-900/30 dark:text-amber-300 dark:hover:bg-amber-900/50', info: 'border-primary-300 bg-primary-50 text-primary-700 hover:bg-primary-100 dark:border-primary-800 dark:bg-primary-900/30 dark:text-primary-300 dark:hover:bg-primary-900/50', neutral: 'border-slate-300 bg-slate-50 text-slate-700 hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700', }; function ActionButton({ tone, icon, children, }: { tone: ActionTone; icon: React.ReactNode; children: React.ReactNode; }) { return ( ); } function formatDate(iso: string): string { return new Date(iso).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', }); }