@@ -57,6 +57,7 @@ export function ResourceDetailPage<T>({
5757 buildDetailLines,
5858 additionalContent,
5959 pollResource,
60+ onPollUpdate,
6061 pollInterval = 3000 ,
6162} : ResourceDetailPageProps < T > ) {
6263 const isMounted = React . useRef ( true ) ;
@@ -74,6 +75,11 @@ export function ResourceDetailPage<T>({
7475 const [ currentResource , setCurrentResource ] = React . useState ( initialResource ) ;
7576 const [ copyStatus , setCopyStatus ] = React . useState < string | null > ( null ) ;
7677
78+ // Keep local resource in sync when parent provides fresher data.
79+ React . useEffect ( ( ) => {
80+ setCurrentResource ( initialResource ) ;
81+ } , [ initialResource ] ) ;
82+
7783 // Copy to clipboard with status feedback
7884 const handleCopy = React . useCallback ( async ( text : string ) => {
7985 const status = await copyToClipboard ( text ) ;
@@ -114,6 +120,7 @@ export function ResourceDetailPage<T>({
114120 const updatedResource = await pollResource ( ) ;
115121 if ( isMounted . current ) {
116122 setCurrentResource ( updatedResource ) ;
123+ onPollUpdate ?.( updatedResource ) ;
117124 }
118125 } catch {
119126 // Silently ignore polling errors
@@ -122,7 +129,7 @@ export function ResourceDetailPage<T>({
122129 } , pollInterval ) ;
123130
124131 return ( ) => clearInterval ( interval ) ;
125- } , [ pollResource , pollInterval , showDetailedInfo ] ) ;
132+ } , [ pollResource , pollInterval , showDetailedInfo , onPollUpdate ] ) ;
126133
127134 // Calculate viewport for detailed info view
128135 const detailViewport = useViewportHeight ( { overhead : 18 , minHeight : 10 } ) ;
0 commit comments