diff --git a/packages/review-editor/components/AnnotationToolbar.tsx b/packages/review-editor/components/AnnotationToolbar.tsx index 40f2795a3..9d9c8f4ea 100644 --- a/packages/review-editor/components/AnnotationToolbar.tsx +++ b/packages/review-editor/components/AnnotationToolbar.tsx @@ -22,6 +22,7 @@ interface AnnotationToolbarProps { selectedOriginalCode?: string; isEditing?: boolean; setShowCodeModal: (show: boolean) => void; + setShowCommentModal: (show: boolean) => void; onSubmit: () => void; onDismiss: () => void; onCancel: () => void; @@ -54,6 +55,7 @@ export const AnnotationToolbar: React.FC = ({ selectedOriginalCode, isEditing = false, setShowCodeModal, + setShowCommentModal, onSubmit, onDismiss, onCancel, @@ -128,7 +130,7 @@ export const AnnotationToolbar: React.FC = ({ dragHandleProps={dragHandleProps} /> ) : ( -
+
{isEditing @@ -137,15 +139,25 @@ export const AnnotationToolbar: React.FC = ({ ? formatTokenContext(toolbarState.tokenSelection) : formatLineRange(toolbarState.range.start, toolbarState.range.end)} - +
+ + +
{conventionalCommentsEnabled && ( @@ -162,7 +174,7 @@ export const AnnotationToolbar: React.FC = ({ value={commentText} onChange={(e) => setCommentText(e.target.value)} placeholder="Leave feedback..." - className="w-full px-3 py-2 bg-muted rounded-lg text-xs resize-none focus:outline-none focus:ring-1 focus:ring-primary/50" + className="w-full min-h-[4.5rem] max-h-[calc(100vh-16rem)] px-3 py-2 bg-muted rounded-lg text-xs leading-6 resize-y border-0 focus:outline-none focus:ring-1 focus:ring-primary/50 placeholder:text-muted-foreground" rows={3} autoFocus onKeyDown={(e) => { @@ -272,3 +284,9 @@ export const AnnotationToolbar: React.FC = ({ return createPortal(content, document.body); }; + +const ExpandIcon = () => ( + + + +); diff --git a/packages/review-editor/components/ExpandedCommentDialog.tsx b/packages/review-editor/components/ExpandedCommentDialog.tsx new file mode 100644 index 000000000..7d4c112f0 --- /dev/null +++ b/packages/review-editor/components/ExpandedCommentDialog.tsx @@ -0,0 +1,149 @@ +import React, { useEffect, useRef } from 'react'; +import { createPortal } from 'react-dom'; +import { SparklesIcon } from '@plannotator/ui/components/SparklesIcon'; + +interface ExpandedCommentDialogProps { + title: string; + commentText: string; + setCommentText: (text: string) => void; + isEditing: boolean; + canSubmit: boolean; + aiAvailable?: boolean; + onAskAI?: (question: string) => void; + onSubmit: () => void; + onCollapse: () => void; + onCancel: () => void; +} + +export const ExpandedCommentDialog: React.FC = ({ + title, + commentText, + setCommentText, + isEditing, + canSubmit, + aiAvailable = false, + onAskAI, + onSubmit, + onCollapse, + onCancel, +}) => { + const textareaRef = useRef(null); + const askAIEnabled = aiAvailable && !!onAskAI && commentText.trim().length > 0; + const submitLabel = isEditing ? 'Update' : 'Add Comment'; + + useEffect(() => { + const id = window.setTimeout(() => { + const textarea = textareaRef.current; + if (!textarea) return; + textarea.focus(); + textarea.selectionStart = textarea.selectionEnd = textarea.value.length; + }, 0); + + return () => window.clearTimeout(id); + }, []); + + const handleAskAI = () => { + if (!askAIEnabled) return; + onAskAI?.(commentText.trim()); + }; + + return createPortal( +
+
+
+
+ {title} +
+ + +
+
+ +
+