@@ -337,56 +337,96 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
337337 /*
338338 This logic depends on the useEffect[messages] above to set clineAsk, after which buttons are shown and we then send an askResponse to the extension.
339339 */
340- const handlePrimaryButtonClick = useCallback ( ( ) => {
341- switch ( clineAsk ) {
342- case "api_req_failed" :
343- case "command" :
344- case "command_output" :
345- case "tool" :
346- case "browser_action_launch" :
347- case "use_mcp_server" :
348- case "resume_task" :
349- case "mistake_limit_reached" :
350- vscode . postMessage ( { type : "askResponse" , askResponse : "yesButtonClicked" } )
351- break
352- case "completion_result" :
353- case "resume_completed_task" :
354- // extension waiting for feedback. but we can just present a new task button
355- startNewTask ( )
356- break
357- }
358- setTextAreaDisabled ( true )
359- setClineAsk ( undefined )
360- setEnableButtons ( false )
361- disableAutoScrollRef . current = false
362- } , [ clineAsk , startNewTask ] )
363-
364- const handleSecondaryButtonClick = useCallback ( ( ) => {
365- if ( isStreaming ) {
366- vscode . postMessage ( { type : "cancelTask" } )
367- setDidClickCancel ( true )
368- return
369- }
340+ const handlePrimaryButtonClick = useCallback (
341+ ( text ?: string , images ?: string [ ] ) => {
342+ const trimmedInput = text ?. trim ( )
343+ switch ( clineAsk ) {
344+ case "api_req_failed" :
345+ case "command" :
346+ case "command_output" :
347+ case "tool" :
348+ case "browser_action_launch" :
349+ case "use_mcp_server" :
350+ case "resume_task" :
351+ case "mistake_limit_reached" :
352+ // Only send text/images if they exist
353+ if ( trimmedInput || ( images && images . length > 0 ) ) {
354+ vscode . postMessage ( {
355+ type : "askResponse" ,
356+ askResponse : "yesButtonClicked" ,
357+ text : trimmedInput ,
358+ images : images ,
359+ } )
360+ } else {
361+ vscode . postMessage ( {
362+ type : "askResponse" ,
363+ askResponse : "yesButtonClicked" ,
364+ } )
365+ }
366+ // Clear input state after sending
367+ setInputValue ( "" )
368+ setSelectedImages ( [ ] )
369+ break
370+ case "completion_result" :
371+ case "resume_completed_task" :
372+ // extension waiting for feedback. but we can just present a new task button
373+ startNewTask ( )
374+ break
375+ }
376+ setTextAreaDisabled ( true )
377+ setClineAsk ( undefined )
378+ setEnableButtons ( false )
379+ disableAutoScrollRef . current = false
380+ } ,
381+ [ clineAsk , startNewTask ] ,
382+ )
370383
371- switch ( clineAsk ) {
372- case "api_req_failed" :
373- case "mistake_limit_reached" :
374- case "resume_task" :
375- startNewTask ( )
376- break
377- case "command" :
378- case "tool" :
379- case "browser_action_launch" :
380- case "use_mcp_server" :
381- // responds to the API with a "This operation failed" and lets it try again
382- vscode . postMessage ( { type : "askResponse" , askResponse : "noButtonClicked" } )
383- break
384- }
385- setTextAreaDisabled ( true )
386- setClineAsk ( undefined )
387- setEnableButtons ( false )
388- disableAutoScrollRef . current = false
389- } , [ clineAsk , startNewTask , isStreaming ] )
384+ const handleSecondaryButtonClick = useCallback (
385+ ( text ?: string , images ?: string [ ] ) => {
386+ const trimmedInput = text ?. trim ( )
387+ if ( isStreaming ) {
388+ vscode . postMessage ( { type : "cancelTask" } )
389+ setDidClickCancel ( true )
390+ return
391+ }
392+
393+ switch ( clineAsk ) {
394+ case "api_req_failed" :
395+ case "mistake_limit_reached" :
396+ case "resume_task" :
397+ startNewTask ( )
398+ break
399+ case "command" :
400+ case "tool" :
401+ case "browser_action_launch" :
402+ case "use_mcp_server" :
403+ // Only send text/images if they exist
404+ if ( trimmedInput || ( images && images . length > 0 ) ) {
405+ vscode . postMessage ( {
406+ type : "askResponse" ,
407+ askResponse : "noButtonClicked" ,
408+ text : trimmedInput ,
409+ images : images ,
410+ } )
411+ } else {
412+ // responds to the API with a "This operation failed" and lets it try again
413+ vscode . postMessage ( {
414+ type : "askResponse" ,
415+ askResponse : "noButtonClicked" ,
416+ } )
417+ }
418+ // Clear input state after sending
419+ setInputValue ( "" )
420+ setSelectedImages ( [ ] )
421+ break
422+ }
423+ setTextAreaDisabled ( true )
424+ setClineAsk ( undefined )
425+ setEnableButtons ( false )
426+ disableAutoScrollRef . current = false
427+ } ,
428+ [ clineAsk , startNewTask , isStreaming ] ,
429+ )
390430
391431 const handleTaskCloseButtonClick = useCallback ( ( ) => {
392432 startNewTask ( )
@@ -430,10 +470,10 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
430470 handleSendMessage ( message . text ?? "" , message . images ?? [ ] )
431471 break
432472 case "primaryButtonClick" :
433- handlePrimaryButtonClick ( )
473+ handlePrimaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
434474 break
435475 case "secondaryButtonClick" :
436- handleSecondaryButtonClick ( )
476+ handleSecondaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
437477 break
438478 }
439479 }
@@ -1038,7 +1078,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
10381078 flex : secondaryButtonText ? 1 : 2 ,
10391079 marginRight : secondaryButtonText ? "6px" : "0" ,
10401080 } }
1041- onClick = { handlePrimaryButtonClick } >
1081+ onClick = { ( e ) => handlePrimaryButtonClick ( inputValue , selectedImages ) } >
10421082 { primaryButtonText }
10431083 </ VSCodeButton >
10441084 ) }
@@ -1050,7 +1090,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
10501090 flex : isStreaming ? 2 : 1 ,
10511091 marginLeft : isStreaming ? 0 : "6px" ,
10521092 } }
1053- onClick = { handleSecondaryButtonClick } >
1093+ onClick = { ( e ) => handleSecondaryButtonClick ( inputValue , selectedImages ) } >
10541094 { isStreaming ? "Cancel" : secondaryButtonText }
10551095 </ VSCodeButton >
10561096 ) }
0 commit comments