import { useState, useEffect } from 'react' import { Lightbulb, Loader2, RefreshCw, CheckCircle2, Clock, Sparkles, } from 'lucide-react' import { flowProposalsApi } from '@/api' import { toast } from '@/lib/toast' import type { FlowProposalSummary, FlowProposalDetail, FlowProposalStats } from '@/types/flow-proposal' import { ProposalCard } from '@/components/flowpilot/ProposalCard' import { ProposalDetail } from '@/components/flowpilot/ProposalDetail' const STATUS_TABS = [ { key: 'pending', label: 'Pending' }, { key: 'approved', label: 'Approved' }, { key: 'rejected', label: 'Rejected' }, { key: 'dismissed', label: 'Dismissed' }, { key: '', label: 'All' }, ] as const export default function ReviewQueuePage() { const [proposals, setProposals] = useState([]) const [stats, setStats] = useState(null) const [selectedId, setSelectedId] = useState(null) const [detail, setDetail] = useState(null) const [isLoading, setIsLoading] = useState(true) const [isLoadingDetail, setIsLoadingDetail] = useState(false) const [activeTab, setActiveTab] = useState('pending') const [sortBy, setSortBy] = useState('newest') const loadProposals = async () => { setIsLoading(true) try { const [data, statsData] = await Promise.all([ flowProposalsApi.list({ status: activeTab || undefined, sort_by: sortBy, limit: 50, }), flowProposalsApi.getStats(), ]) setProposals(data) setStats(statsData) } catch { toast.error('Failed to load proposals') } finally { setIsLoading(false) } } useEffect(() => { loadProposals() }, [activeTab, sortBy]) // eslint-disable-line react-hooks/exhaustive-deps const loadDetail = async (id: string) => { setSelectedId(id) setIsLoadingDetail(true) try { const data = await flowProposalsApi.get(id) setDetail(data) } catch { toast.error('Failed to load proposal') } finally { setIsLoadingDetail(false) } } const handleReview = async (action: 'approve' | 'reject' | 'modify' | 'dismiss', notes?: string) => { if (!selectedId) return try { await flowProposalsApi.review(selectedId, { action, reviewer_notes: notes || null, }) toast.success( action === 'approve' ? 'Flow published!' : action === 'dismiss' ? 'Proposal dismissed' : action === 'reject' ? 'Proposal rejected' : 'Flow published with modifications' ) setSelectedId(null) setDetail(null) loadProposals() } catch { toast.error('Review action failed') } } return (
{/* Left panel — Proposal list */}
{/* Header */}

Review Queue

{/* Stats bar */} {stats && (
{stats.pending_count} pending {stats.approved_this_week} approved {stats.auto_reinforced_this_week} reinforced
)} {/* Tabs */}
{STATUS_TABS.map((tab) => ( ))}
{/* Sort */}
{/* Proposal list */}
{isLoading ? (
) : proposals.length === 0 ? (

No proposals found

) : ( proposals.map((proposal) => ( loadDetail(proposal.id)} /> )) )}
{/* Right panel — Detail */}
{isLoadingDetail ? (
) : detail ? ( ) : (

Select a proposal to review

)}
) }