import { useMemo } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@renderer/components/ui/dialog'; import { MentionableTextarea } from '@renderer/components/ui/MentionableTextarea'; import { useDraftPersistence } from '@renderer/hooks/useDraftPersistence'; import { useStore } from '@renderer/store'; import { formatAgentRole } from '@renderer/utils/formatAgentRole'; import { buildMemberColorMap } from '@renderer/utils/memberHelpers'; import { MAX_TEXT_LENGTH } from '@shared/constants'; import { deriveTaskDisplayId } from '@shared/utils/taskIdentity'; import { Send } from 'lucide-react'; import type { MentionSuggestion } from '@renderer/types/mention'; import type { ResolvedTeamMember } from '@shared/types'; interface ReviewDialogProps { open: boolean; teamName: string; taskId: string | null; members: ResolvedTeamMember[]; onCancel: () => void; onSubmit: (comment?: string) => void; } export const ReviewDialog = ({ open, teamName, taskId, members, onCancel, onSubmit, }: ReviewDialogProps): React.JSX.Element => { const projectPath = useStore((s) => s.selectedTeamData?.config.projectPath ?? null); const draft = useDraftPersistence({ key: `requestChanges:${teamName}:${taskId ?? ''}`, enabled: Boolean(teamName && taskId), }); const colorMap = useMemo(() => buildMemberColorMap(members), [members]); const mentionSuggestions = useMemo( () => members.map((m) => ({ id: m.name, name: m.name, subtitle: formatAgentRole(m.role) ?? formatAgentRole(m.agentType) ?? undefined, color: colorMap.get(m.name), })), [members, colorMap] ); const trimmed = draft.value.trim(); const remaining = MAX_TEXT_LENGTH - trimmed.length; const handleSubmit = (): void => { const comment = trimmed || undefined; draft.clearDraft(); onSubmit(comment); }; return ( { if (!nextOpen) { onCancel(); } }} > Request Changes Task #{taskId ? deriveTaskDisplayId(taskId) : ''}
Submit } footerRight={
{remaining < 200 ? ( {remaining} chars left ) : null} {draft.isSaved ? ( Draft saved ) : null}
} />
); };