@@ -69,6 +69,46 @@ class VTSourceRendererBase extends CustomLayerItemRenderer<IProps & WithTranslat
6969 this . rightLabel = e
7070 }
7171
72+ private removeAuxiliaryNode ( node : HTMLSpanElement | null ) : void {
73+ if ( ! node ) return
74+
75+ try {
76+ node . remove ( )
77+ } catch ( err ) {
78+ logger . error ( `Error in VTSourceRendererBase.removeAuxiliaryNode: ${ stringifyError ( err ) } ` )
79+ }
80+ }
81+
82+ private mountAuxiliaryNode ( node : HTMLSpanElement | null , target : HTMLElement | null ) : void {
83+ if ( ! node || ! target ) return
84+
85+ if ( node . parentElement !== target ) {
86+ this . removeAuxiliaryNode ( node )
87+ target . appendChild ( node )
88+ }
89+ }
90+
91+ private getRightLabelTarget ( itemElement : HTMLElement | null ) : HTMLElement | null {
92+ if ( ! itemElement ) return null
93+
94+ if ( this . getItemDuration ( true ) === Number . POSITIVE_INFINITY ) {
95+ return itemElement . parentElement ?. parentElement ?. parentElement ?? null
96+ }
97+
98+ return itemElement
99+ }
100+
101+ private getCountdownTarget ( itemElement : HTMLElement | null ) : HTMLElement | null {
102+ if ( ! itemElement ) return null
103+
104+
105+ const liveLine =
106+ itemElement . parentElement ?. parentElement ?. parentElement ?. parentElement ?. parentElement ?. querySelector (
107+ '.segment-timeline__liveline'
108+ )
109+ return liveLine instanceof HTMLElement ? liveLine : null
110+ }
111+
72112 getItemLabelOffsetRight ( ) : React . CSSProperties {
73113 return {
74114 ...super . getItemLabelOffsetRight ( ) ,
@@ -84,34 +124,23 @@ class VTSourceRendererBase extends CustomLayerItemRenderer<IProps & WithTranslat
84124 newState : Partial < IState > ,
85125 itemElement : HTMLElement | null
86126 ) : Partial < IState > {
87- if ( this . rightLabelContainer && itemElement ) {
127+ if ( this . rightLabelContainer ) {
88128 const itemDuration = this . getItemDuration ( true )
129+ const targetElement = this . getRightLabelTarget ( itemElement )
89130 if ( prevProps === null || itemElement !== prevProps . itemElement ) {
90- if ( itemDuration === Number . POSITIVE_INFINITY ) {
91- itemElement . parentElement ?. parentElement ?. parentElement ?. appendChild ( this . rightLabelContainer )
92-
93- newState . rightLabelIsAppendage = true
131+ if ( targetElement ) {
132+ this . mountAuxiliaryNode ( this . rightLabelContainer , targetElement )
133+ newState . rightLabelIsAppendage = itemDuration === Number . POSITIVE_INFINITY
94134 } else {
95- try {
96- this . rightLabelContainer ?. remove ( )
97- } catch ( err ) {
98- logger . error ( `Error in VTSourceRendererBase.mountRightLabelContainer 1: ${ stringifyError ( err ) } ` )
99- }
100- itemElement . appendChild ( this . rightLabelContainer )
135+ this . removeAuxiliaryNode ( this . rightLabelContainer )
101136 newState . rightLabelIsAppendage = false
102137 }
103138 } else if ( prevProps ?. partDuration !== props . partDuration ) {
104- if ( itemDuration === Number . POSITIVE_INFINITY && this . state . rightLabelIsAppendage !== true ) {
105- itemElement . parentElement ?. parentElement ?. parentElement ?. appendChild ( this . rightLabelContainer )
106-
107- newState . rightLabelIsAppendage = true
108- } else if ( itemDuration !== Number . POSITIVE_INFINITY && this . state . rightLabelIsAppendage === true ) {
109- try {
110- this . rightLabelContainer ?. remove ( )
111- } catch ( err ) {
112- logger . error ( `Error in VTSourceRendererBase.mountRightLabelContainer 2: ${ stringifyError ( err ) } ` )
113- }
114- itemElement . appendChild ( this . rightLabelContainer )
139+ if ( targetElement ) {
140+ this . mountAuxiliaryNode ( this . rightLabelContainer , targetElement )
141+ newState . rightLabelIsAppendage = itemDuration === Number . POSITIVE_INFINITY
142+ } else if ( this . state . rightLabelIsAppendage !== false ) {
143+ this . removeAuxiliaryNode ( this . rightLabelContainer )
115144 newState . rightLabelIsAppendage = false
116145 }
117146 }
@@ -126,32 +155,25 @@ class VTSourceRendererBase extends CustomLayerItemRenderer<IProps & WithTranslat
126155 itemElement : HTMLElement | null
127156 ) : Partial < IState > {
128157 const { relative : relativeRendering , isLiveLine, outputLayer } = props
158+ const targetElement = this . getCountdownTarget ( itemElement )
129159 if (
130160 this . countdownContainer &&
131161 ! this . state . sourceEndCountdownAppendage &&
132162 ! relativeRendering &&
133163 isLiveLine &&
134164 ! outputLayer . collapsed &&
135- itemElement
165+ targetElement
136166 ) {
137- const liveLine =
138- itemElement . parentElement ?. parentElement ?. parentElement ?. parentElement ?. parentElement ?. querySelector (
139- '.segment-timeline__liveline'
140- )
141- if ( liveLine ) {
142- liveLine . appendChild ( this . countdownContainer )
167+ if ( targetElement ) {
168+ this . mountAuxiliaryNode ( this . countdownContainer , targetElement )
143169 newState . sourceEndCountdownAppendage = true
144170 }
145171 } else if (
146172 this . countdownContainer &&
147173 this . state . sourceEndCountdownAppendage &&
148- ! ( ! relativeRendering && isLiveLine && ! outputLayer . collapsed && itemElement )
174+ ! ( ! relativeRendering && isLiveLine && ! outputLayer . collapsed && targetElement )
149175 ) {
150- try {
151- this . countdownContainer . remove ( )
152- } catch ( err ) {
153- logger . error ( `Error in VTSourceRendererBase.mountSourceEndedCountdownContainer 1: ${ stringifyError ( err ) } ` )
154- }
176+ this . removeAuxiliaryNode ( this . countdownContainer )
155177 newState . sourceEndCountdownAppendage = false
156178 }
157179
@@ -224,23 +246,10 @@ class VTSourceRendererBase extends CustomLayerItemRenderer<IProps & WithTranslat
224246 super . componentWillUnmount ( )
225247 }
226248
227- if ( this . rightLabelContainer ) {
228- try {
229- this . rightLabelContainer . remove ( )
230- } catch ( err ) {
231- logger . error ( `Error in VTSourceRendererBase.componentWillUnmount 1: ${ stringifyError ( err ) } ` )
232- }
233- this . rightLabelContainer = null
234- }
235-
236- if ( this . countdownContainer ) {
237- try {
238- this . countdownContainer . remove ( )
239- } catch ( err ) {
240- logger . error ( `Error in VTSourceRendererBase.componentWillUnmount 2: ${ stringifyError ( err ) } ` )
241- }
242- this . countdownContainer = null
243- }
249+ this . removeAuxiliaryNode ( this . rightLabelContainer )
250+ this . removeAuxiliaryNode ( this . countdownContainer )
251+ this . rightLabelContainer = null
252+ this . countdownContainer = null
244253 }
245254
246255 private renderLeftLabel ( ) {
0 commit comments