'use client'; import { useMemo, useState } from 'react'; import { Check, Loader2 } from 'lucide-react'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Textarea } from '@/components/ui/textarea'; import type { ApprovalRequest } from '@/components/video-page/types'; import type { ApprovalCandidate } from '@/components/video-page/hooks/use-approvals'; interface ApprovalRequestDialogProps { open: boolean; onOpenChange: (open: boolean) => void; candidates: ApprovalCandidate[]; currentUserId: string | null; activePendingRequest: ApprovalRequest | null; isLoadingCandidates: boolean; isSubmittingRequest: boolean; error: string; onRefreshCandidates: () => void; onCreateRequest: (approverIds: string[], message?: string) => Promise; } export function ApprovalRequestDialog({ open, onOpenChange, candidates, currentUserId, activePendingRequest, isLoadingCandidates, isSubmittingRequest, error, onRefreshCandidates, onCreateRequest, }: ApprovalRequestDialogProps) { const [selectedApproverIds, setSelectedApproverIds] = useState([]); const [message, setMessage] = useState(''); const selectableCandidates = useMemo( () => candidates.filter((candidate) => candidate.id !== currentUserId), [candidates, currentUserId] ); const toggleApprover = (userId: string) => { setSelectedApproverIds((current) => ( current.includes(userId) ? current.filter((id) => id !== userId) : [...current, userId] )); }; const handleCreate = async () => { const success = await onCreateRequest(selectedApproverIds, message.trim() || undefined); if (success) { setSelectedApproverIds([]); setMessage(''); onOpenChange(false); } }; const isBlockedByPendingRequest = !!activePendingRequest; return ( Request Approval Select one or more approvers for this version. {isBlockedByPendingRequest ? (
A pending approval request already exists for this version.
) : null} {error ? (
{error}
) : null}

Approvers ({selectedApproverIds.length} selected)

{selectableCandidates.length === 0 ? (

No eligible approvers found.

) : ( selectableCandidates.map((candidate) => { const selected = selectedApproverIds.includes(candidate.id); return ( ); }) )}

Message (optional)