Skip to content

Commit 264f840

Browse files
committed
feat: Only re-render if timing props have changed
1 parent b242bc0 commit 264f840

3 files changed

Lines changed: 18 additions & 7 deletions

File tree

packages/webui/src/client/ui/SegmentTimeline/Parts/SegmentTimelinePart.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,14 @@ export class SegmentTimelinePartClass extends React.Component<Translated<WithTim
314314
}
315315

316316
shouldComponentUpdate(nextProps: Readonly<WithTiming<IProps>>, nextState: Readonly<IState>): boolean {
317-
if (!_.isMatch(this.props, nextProps) || !_.isMatch(this.state, nextState)) {
318-
return true
319-
} else {
320-
return false
321-
}
317+
// Exclude segment object from deep comparison to prevent unnecessary re-renders when only
318+
// metadata (identifier, name, userEditOperations, etc.) changes. These don't affect part
319+
// positioning or rendering. Only check segment ID to detect segment switches.
320+
return (
321+
!_.isMatch(_.omit(this.props, 'segment'), _.omit(nextProps, 'segment')) ||
322+
this.props.segment._id !== nextProps.segment._id ||
323+
!_.isMatch(this.state, nextState)
324+
)
322325
}
323326

324327
componentDidUpdate(prevProps: Readonly<Translated<WithTiming<IProps>>>, prevState: IState, snapshot?: unknown): void {

packages/webui/src/client/ui/SegmentTimeline/SegmentTimeline.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ export class SegmentTimelineClass extends React.Component<Translated<WithTiming<
612612

613613
return {
614614
willChange: this.props.isLiveSegment ? 'transform' : 'none',
615-
transform: `translate3d(-${scrollLeftPx}px, 0, 0)`,
615+
transform: 'translateX(-' + scrollLeftPx + 'px)',
616616
height: `calc(${outputGroups.reduce(
617617
(mem, group) =>
618618
mem +

packages/webui/src/client/ui/SegmentTimeline/SegmentTimelineContainer.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,15 @@ const SegmentTimelineContainerContent = withResolvedSegment(
181181
}
182182

183183
shouldComponentUpdate(nextProps: IProps & ITrackedResolvedSegmentProps, nextState: IState) {
184-
return !_.isMatch(this.props, nextProps) || !_.isMatch(this.state, nextState)
184+
// Exclude segment and playlist objects from deep comparison since they frequently contain
185+
// metadata changes (identifier, name, etc.) that don't affect rendering or positioning.
186+
// Only check their IDs to detect actual segment/playlist switches.
187+
return (
188+
!_.isMatch(_.omit(this.props, 'segmentui', 'playlist'), _.omit(nextProps, 'segmentui', 'playlist')) ||
189+
this.props.segmentui?._id !== nextProps.segmentui?._id ||
190+
this.props.playlist?._id !== nextProps.playlist?._id ||
191+
!_.isMatch(this.state, nextState)
192+
)
185193
}
186194

187195
componentDidMount(): void {

0 commit comments

Comments
 (0)