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 { useTaskSuggestions } from '@renderer/hooks/useTaskSuggestions'; import { useStore } from '@renderer/store'; import { formatAgentRole } from '@renderer/utils/formatAgentRole'; import { buildMemberColorMap } from '@renderer/utils/memberHelpers'; import { extractTaskRefsFromText, stripEncodedTaskReferenceMetadata, } from '@renderer/utils/taskReferenceUtils'; 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, TaskRef } from '@shared/types'; interface ReviewDialogProps { open: boolean; teamName: string; taskId: string | null; members: ResolvedTeamMember[]; onCancel: () => void; onSubmit: (comment?: string, taskRefs?: TaskRef[]) => void; } export const ReviewDialog = ({ open, teamName, taskId, members, onCancel, onSubmit, }: ReviewDialogProps): React.JSX.Element => { const projectPath = useStore((s) => s.selectedTeamData?.config.projectPath ?? null); const { suggestions: taskSuggestions } = useTaskSuggestions(teamName); 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 = stripEncodedTaskReferenceMetadata(draft.value).trim(); const remaining = MAX_TEXT_LENGTH - trimmed.length; const handleSubmit = (): void => { const comment = stripEncodedTaskReferenceMetadata(trimmed) || undefined; const taskRefs = trimmed ? extractTaskRefsFromText(draft.value, taskSuggestions) : []; draft.clearDraft(); onSubmit(comment, taskRefs); }; return ( { if (!nextOpen) { onCancel(); } }} > Request Changes Task #{taskId ? deriveTaskDisplayId(taskId) : ''}
Submit } footerRight={
{remaining < 200 ? ( {remaining} chars left ) : null} {draft.isSaved ? ( Saved ) : null}
} />
); };