@@ -24,6 +24,7 @@ import { useMenuController } from "./hooks/useMenuController";
2424import { useReviewController } from "./hooks/useReviewController" ;
2525import { buildAppMenus } from "./lib/appMenus" ;
2626import { fileRowId } from "./lib/ids" ;
27+ import { openSelectedFileInEditor } from "./lib/openInEditor" ;
2728import { resolveResponsiveLayout } from "./lib/responsive" ;
2829import { resizeSidebarWidth } from "./lib/sidebar" ;
2930import { resolveTheme , THEMES } from "./themes" ;
@@ -121,6 +122,8 @@ export function App({
121122 const [ sidebarWidth , setSidebarWidth ] = useState ( 34 ) ;
122123 const [ resizeDragOriginX , setResizeDragOriginX ] = useState < number | null > ( null ) ;
123124 const [ resizeStartWidth , setResizeStartWidth ] = useState < number | null > ( null ) ;
125+ const [ sessionNoticeText , setSessionNoticeText ] = useState < string | null > ( null ) ;
126+ const sessionNoticeTimeoutRef = useRef < ReturnType < typeof setTimeout > | null > ( null ) ;
124127
125128 const activeTheme = resolveTheme ( themeId , detectedThemeMode ?? null ) ;
126129 const review = useReviewController ( { files : bootstrap . changeset . files } ) ;
@@ -144,6 +147,26 @@ export function App({
144147 setShowAgentNotes ( true ) ;
145148 } , [ ] ) ;
146149
150+ const showSessionNotice = useCallback ( ( message : string ) => {
151+ setSessionNoticeText ( message ) ;
152+ if ( sessionNoticeTimeoutRef . current ) {
153+ clearTimeout ( sessionNoticeTimeoutRef . current ) ;
154+ }
155+
156+ sessionNoticeTimeoutRef . current = setTimeout ( ( ) => {
157+ setSessionNoticeText ( ( current ) => ( current === message ? null : current ) ) ;
158+ sessionNoticeTimeoutRef . current = null ;
159+ } , 4000 ) ;
160+ } , [ ] ) ;
161+
162+ useEffect ( ( ) => {
163+ return ( ) => {
164+ if ( sessionNoticeTimeoutRef . current ) {
165+ clearTimeout ( sessionNoticeTimeoutRef . current ) ;
166+ }
167+ } ;
168+ } , [ ] ) ;
169+
147170 useHunkSessionBridge ( {
148171 addLiveComment : review . addLiveComment ,
149172 addLiveCommentBatch : review . addLiveCommentBatch ,
@@ -384,6 +407,30 @@ export function App({
384407 } ) ;
385408 } , [ refreshCurrentInput ] ) ;
386409
410+ const triggerEditSelectedFile = useCallback ( ( ) => {
411+ const message = openSelectedFileInEditor ( {
412+ file : selectedFile ,
413+ renderer,
414+ selectedHunk : review . selectedHunk ,
415+ } ) ;
416+
417+ if ( message ) {
418+ showSessionNotice ( message ) ;
419+ return ;
420+ }
421+
422+ if ( canRefreshCurrentInput ) {
423+ triggerRefreshCurrentInput ( ) ;
424+ }
425+ } , [
426+ canRefreshCurrentInput ,
427+ renderer ,
428+ review . selectedHunk ,
429+ selectedFile ,
430+ showSessionNotice ,
431+ triggerRefreshCurrentInput ,
432+ ] ) ;
433+
387434 useEffect ( ( ) => {
388435 if ( ! watchEnabled ) {
389436 return ;
@@ -498,6 +545,7 @@ export function App({
498545 toggleLineNumbers,
499546 toggleLineWrap,
500547 toggleSidebar,
548+ triggerEditSelectedFile,
501549 wrapLines,
502550 } ) ,
503551 [
@@ -523,6 +571,7 @@ export function App({
523571 toggleLineNumbers ,
524572 toggleLineWrap ,
525573 toggleSidebar ,
574+ triggerEditSelectedFile ,
526575 wrapLines ,
527576 ] ,
528577 ) ;
@@ -571,6 +620,7 @@ export function App({
571620 toggleLineNumbers,
572621 toggleLineWrap,
573622 toggleSidebar,
623+ triggerEditSelectedFile,
574624 triggerRefreshCurrentInput,
575625 } ) ;
576626
@@ -738,11 +788,15 @@ export function App({
738788 />
739789 </ box >
740790
741- { ! pagerMode && ( focusArea === "filter" || Boolean ( review . filter ) || Boolean ( noticeText ) ) ? (
791+ { ! pagerMode &&
792+ ( focusArea === "filter" ||
793+ Boolean ( review . filter ) ||
794+ Boolean ( sessionNoticeText ) ||
795+ Boolean ( noticeText ) ) ? (
742796 < StatusBar
743797 filter = { review . filter }
744798 filterFocused = { focusArea === "filter" }
745- noticeText = { noticeText ?? undefined }
799+ noticeText = { sessionNoticeText ?? noticeText ?? undefined }
746800 terminalWidth = { terminal . width }
747801 theme = { activeTheme }
748802 onCloseMenu = { closeMenu }
0 commit comments