@@ -1435,9 +1435,22 @@ export default function Sidebar() {
14351435 if ( selectedThreadIds . size > 0 ) {
14361436 clearSelection ( ) ;
14371437 }
1438+ // When expanding a project with exactly one thread, navigate directly to it.
1439+ const project = projects . find ( ( p ) => p . id === projectId ) ;
1440+ if ( project && ! project . expanded ) {
1441+ const projectThreads = threads . filter ( ( t ) => t . projectId === projectId ) ;
1442+ if ( projectThreads . length === 1 ) {
1443+ toggleProject ( projectId ) ;
1444+ void navigate ( {
1445+ to : "/$threadId" ,
1446+ params : { threadId : projectThreads [ 0 ] ! . id } ,
1447+ } ) ;
1448+ return ;
1449+ }
1450+ }
14381451 toggleProject ( projectId ) ;
14391452 } ,
1440- [ clearSelection , selectedThreadIds . size , toggleProject ] ,
1453+ [ clearSelection , navigate , projects , selectedThreadIds . size , threads , toggleProject ] ,
14411454 ) ;
14421455
14431456 const handleProjectTitleKeyDown = useCallback (
@@ -1447,9 +1460,22 @@ export default function Sidebar() {
14471460 if ( dragInProgressRef . current ) {
14481461 return ;
14491462 }
1463+ // When expanding a project with exactly one thread, navigate directly to it.
1464+ const project = projects . find ( ( p ) => p . id === projectId ) ;
1465+ if ( project && ! project . expanded ) {
1466+ const projectThreads = threads . filter ( ( t ) => t . projectId === projectId ) ;
1467+ if ( projectThreads . length === 1 ) {
1468+ toggleProject ( projectId ) ;
1469+ void navigate ( {
1470+ to : "/$threadId" ,
1471+ params : { threadId : projectThreads [ 0 ] ! . id } ,
1472+ } ) ;
1473+ return ;
1474+ }
1475+ }
14501476 toggleProject ( projectId ) ;
14511477 } ,
1452- [ toggleProject ] ,
1478+ [ navigate , projects , threads , toggleProject ] ,
14531479 ) ;
14541480
14551481 useEffect ( ( ) => {
0 commit comments