@@ -127,9 +127,31 @@ function PhaseTimelineBar({ phases }: { phases: PhaseTiming[] }) {
127127 < Typography variant = "body2" >
128128 { formatDurationLong ( phase . duration ) } ({ percentage . toFixed ( 1 ) } %)
129129 </ Typography >
130- { phase . breakdown ?. map ( ( item , idx ) => (
131- < Typography key = { idx } variant = "caption" sx = { { display : 'block' , pl : 1 } } >
132- { item . label } : { formatDuration ( item . duration ) }
130+ { phase . breakdown ?. map ( ( item , idx ) => {
131+ const isChild = item . label . startsWith ( ' ' ) ;
132+ return (
133+ < Typography
134+ key = { idx }
135+ variant = "caption"
136+ sx = { {
137+ display : 'block' ,
138+ pl : isChild ? 2.5 : 1 ,
139+ fontWeight : isChild ? 400 : 600 ,
140+ fontSize : isChild ? '0.65rem' : '0.7rem' ,
141+ color : isChild ? 'text.secondary' : 'text.primary' ,
142+ } }
143+ >
144+ { item . label . trimStart ( ) } : { formatDuration ( item . duration ) }
145+ </ Typography >
146+ ) ;
147+ } ) }
148+ { phase . details ?. map ( ( line , idx ) => (
149+ < Typography
150+ key = { `d-${ idx } ` }
151+ variant = "caption"
152+ sx = { { display : 'block' , pl : line . startsWith ( ' ' ) ? 2 : 0 , mt : idx === 0 ? 0.5 : 0 , fontFamily : 'monospace' , fontSize : '0.65rem' } }
153+ >
154+ { line }
133155 </ Typography >
134156 ) ) }
135157 </ Box >
@@ -177,21 +199,29 @@ interface TxToastProps {
177199}
178200
179201function TxToast ( { event, onDismiss } : TxToastProps ) {
180- const [ elapsed , setElapsed ] = useState ( Date . now ( ) - event . startTime ) ;
181- const [ expanded , setExpanded ] = useState ( true ) ;
182- const frozenElapsed = useRef < number | null > ( null ) ;
183202 const isActive = event . phase !== 'complete' && event . phase !== 'error' ;
184203
204+ // For completed events, compute total from recorded phase timings (stable across refreshes)
205+ const computeFinalElapsed = ( ) => {
206+ const t = event . phaseTimings ;
207+ const fromTimings = ( t . simulation ?? 0 ) + ( t . proving ?? 0 ) + ( t . sending ?? 0 ) + ( t . mining ?? 0 ) ;
208+ return fromTimings > 0 ? fromTimings : Date . now ( ) - event . startTime ;
209+ } ;
210+
211+ const [ elapsed , setElapsed ] = useState ( ( ) => isActive ? Date . now ( ) - event . startTime : computeFinalElapsed ( ) ) ;
212+ const [ expanded , setExpanded ] = useState ( true ) ;
213+ const frozen = useRef ( ! isActive ) ;
214+
185215 // Tick elapsed time while active, freeze when done
186216 useEffect ( ( ) => {
187217 if ( ! isActive ) {
188- if ( frozenElapsed . current === null ) {
189- frozenElapsed . current = Date . now ( ) - event . startTime ;
190- setElapsed ( frozenElapsed . current ) ;
218+ if ( ! frozen . current ) {
219+ frozen . current = true ;
220+ setElapsed ( computeFinalElapsed ( ) ) ;
191221 }
192222 return ;
193223 }
194- frozenElapsed . current = null ;
224+ frozen . current = false ;
195225 const interval = setInterval ( ( ) => setElapsed ( Date . now ( ) - event . startTime ) , 200 ) ;
196226 return ( ) => clearInterval ( interval ) ;
197227 } , [ isActive , event . startTime ] ) ;
0 commit comments