@@ -174,6 +174,7 @@ export default function UnifiedAnalysisHistory() {
174174 const [ runningAnalyses , setRunningAnalyses ] = useState < RunningAnalysisItem [ ] > ( [ ] ) ;
175175 const [ canceledAnalyses , setCanceledAnalyses ] = useState < AnalysisHistoryItem [ ] > ( [ ] ) ;
176176 const [ loading , setLoading ] = useState ( true ) ; // Start with loading true
177+ const [ activeTab , setActiveTab ] = useState < string > ( "all" ) ;
177178 const [ selectedTicker , setSelectedTicker ] = useState < string | null > ( null ) ;
178179 const [ selectedAnalysisDate , setSelectedAnalysisDate ] = useState < string | null > ( null ) ;
179180 const [ selectedViewAnalysisId , setSelectedViewAnalysisId ] = useState < string | null > ( null ) ; // For viewing specific analysis
@@ -188,6 +189,7 @@ export default function UnifiedAnalysisHistory() {
188189 const today = new Date ( ) ;
189190 const todayString = `${ today . getFullYear ( ) } -${ String ( today . getMonth ( ) + 1 ) . padStart ( 2 , '0' ) } -${ String ( today . getDate ( ) ) . padStart ( 2 , '0' ) } ` ;
190191 const [ selectedDate , setSelectedDate ] = useState < string > ( todayString ) ;
192+ const isTodaySelected = selectedDate === todayString ;
191193
192194 // Track if initial data has been loaded
193195 const [ initialLoadComplete , setInitialLoadComplete ] = useState ( false ) ;
@@ -221,10 +223,12 @@ export default function UnifiedAnalysisHistory() {
221223 } ) ;
222224 } ;
223225
224- const loadAllAnalyses = async ( ) => {
226+ const loadAllAnalyses = async ( withSpinner : boolean = true ) => {
225227 if ( ! user ) return ;
226228
227- setLoading ( true ) ;
229+ if ( withSpinner ) {
230+ setLoading ( true ) ;
231+ }
228232 try {
229233 // Build date range for the selected date using local date parsing
230234 const [ year , month , day ] = selectedDate . split ( '-' ) . map ( Number ) ;
@@ -333,7 +337,9 @@ export default function UnifiedAnalysisHistory() {
333337 } ) ;
334338 }
335339 } finally {
336- setLoading ( false ) ;
340+ if ( withSpinner ) {
341+ setLoading ( false ) ;
342+ }
337343 setInitialLoadComplete ( true ) ;
338344 }
339345 } ;
@@ -351,17 +357,26 @@ export default function UnifiedAnalysisHistory() {
351357 }
352358 } , [ isAuthenticated , user , selectedDate ] ) ; // Reload when selectedDate changes
353359
360+ useEffect ( ( ) => {
361+ if ( ! isAuthenticated || ! user || ! isTodaySelected ) return ;
362+
363+ const intervalId = setInterval ( ( ) => {
364+ loadAllAnalyses ( false ) ;
365+ } , 10000 ) ;
366+
367+ return ( ) => clearInterval ( intervalId ) ;
368+ } , [ isAuthenticated , user , selectedDate , activeTab , isTodaySelected ] ) ;
369+
354370 // Only poll for running analyses updates, not the entire list
355371 useEffect ( ( ) => {
356- if ( ! user || ! initialLoadComplete ) return ;
372+ if ( ! user || ! initialLoadComplete || ! isTodaySelected ) return ;
357373
358374 // Only set up polling if there are actually running analyses
359375 if ( runningAnalyses . length === 0 ) return ;
360376
361377 let intervalId : NodeJS . Timeout ;
362378
363- // Much slower polling - every 15 seconds instead of 3-5 seconds
364- // Users can manually refresh if they want faster updates
379+ // Poll running analyses separately every 10 seconds for live progress
365380 intervalId = setInterval ( async ( ) => {
366381 try {
367382 // Only check status of running analyses, don't reload everything
@@ -417,12 +432,19 @@ export default function UnifiedAnalysisHistory() {
417432 } catch ( error ) {
418433 console . error ( 'Error checking running analyses:' , error ) ;
419434 }
420- } , 15000 ) ; // Poll every 15 seconds instead of 3-5 seconds
435+ } , 10000 ) ; // Poll every 10 seconds to keep progress fresh
421436
422437 return ( ) => {
423438 if ( intervalId ) clearInterval ( intervalId ) ;
424439 } ;
425- } , [ user , runningAnalyses . length , selectedDate , initialLoadComplete ] ) ; // Keep minimal dependencies
440+ } , [ user , runningAnalyses . length , selectedDate , initialLoadComplete , isTodaySelected ] ) ; // Keep minimal dependencies
441+
442+ const handleTabChange = ( value : string ) => {
443+ setActiveTab ( value ) ;
444+ if ( isTodaySelected ) {
445+ loadAllAnalyses ( false ) ;
446+ }
447+ } ;
426448
427449 const viewRunningAnalysis = ( ticker : string ) => {
428450 setSelectedTicker ( ticker ) ;
@@ -951,7 +973,7 @@ export default function UnifiedAnalysisHistory() {
951973 </ div >
952974 </ div >
953975
954- < Tabs defaultValue = "all" className = "space-y-4" >
976+ < Tabs value = { activeTab } onValueChange = { handleTabChange } className = "space-y-4" >
955977 < TabsList className = "grid w-full grid-cols-4" >
956978 < TabsTrigger value = "all" >
957979 All < span className = "hidden sm:inline" > ({ displayHistory . length + runningAnalyses . length + displayCanceled . length } )</ span >
0 commit comments