'use client'; import { useMemo, useState } from 'react'; import { CheckCircle2, Clock3, Loader2, RefreshCcw, ShieldX, XCircle } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from '@/components/ui/sheet'; import type { ApprovalRequest } from '@/components/video-page/types'; interface ApprovalRequestsPanelProps { open: boolean; onOpenChange: (open: boolean) => void; requests: ApprovalRequest[]; currentUserId: string | null; canRequestApproval: boolean; onOpenApprovalRequest: () => void; isLoadingRequests: boolean; isSubmittingDecision: boolean; isCancelingRequest: boolean; error: string; onRefresh: () => void; onSubmitDecision: ( requestId: string, decision: 'APPROVED' | 'REJECTED', note?: string ) => Promise; onCancelRequest: (requestId: string) => Promise; } function statusBadge(status: ApprovalRequest['status']) { if (status === 'PENDING') { return ( Pending ); } if (status === 'APPROVED') { return ( Approved ); } if (status === 'REJECTED') { return ( Rejected ); } return ( Canceled ); } function decisionLabel( requestStatus: ApprovalRequest['status'], decisionStatus: 'PENDING' | 'APPROVED' | 'REJECTED' ) { if (decisionStatus === 'APPROVED') return 'Approved'; if (decisionStatus === 'REJECTED') return 'Rejected'; if (requestStatus === 'CANCELED') return 'Canceled'; return 'Pending'; } export function ApprovalRequestsPanel({ open, onOpenChange, requests, currentUserId, canRequestApproval, onOpenApprovalRequest, isLoadingRequests, isSubmittingDecision, isCancelingRequest, error, onRefresh, onSubmitDecision, onCancelRequest, }: ApprovalRequestsPanelProps) { const [decisionNote, setDecisionNote] = useState(''); const pendingRequest = useMemo( () => requests.find((request) => request.status === 'PENDING') || null, [requests] ); const myPendingDecision = useMemo(() => { if (!currentUserId || !pendingRequest) return null; return ( pendingRequest.decisions.find( (decision) => decision.approverId === currentUserId && decision.status === 'PENDING' ) || null ); }, [currentUserId, pendingRequest]); const canCancelPendingRequest = !!pendingRequest && !!currentUserId && (pendingRequest.requestedById === currentUserId || canRequestApproval); const handleDecision = async (decision: 'APPROVED' | 'REJECTED') => { if (!pendingRequest) return; const success = await onSubmitDecision( pendingRequest.id, decision, decisionNote.trim() || undefined ); if (success) { setDecisionNote(''); } }; return ( Approvals Review request history and respond to pending approvals.

{requests.length} request(s)

{error ? (
{error}
) : null} {pendingRequest && myPendingDecision ? (

Your response is required

{pendingRequest.requestedBy.name || pendingRequest.requestedBy.email || 'A user'}{' '} requested approval.