Skip to content

Commit d1e8a18

Browse files
committed
fix(webui): More fixes [copilot]
1 parent b5b4be2 commit d1e8a18

4 files changed

Lines changed: 39 additions & 11 deletions

File tree

packages/webui/src/client/lib/VirtualElement.tsx

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,14 @@ export function VirtualElement({
8484
}
8585
}, [])
8686

87+
const placeholderHeightPx = measurements?.clientHeight ?? placeholderHeight ?? ref?.clientHeight ?? 0
88+
8789
const styleObj = useMemo<React.CSSProperties>(
8890
() => ({
8991
width: width ?? 'auto',
90-
height: ((placeholderHeight || ref?.clientHeight) ?? '0') + 'px',
91-
// These properties are used to ensure that if a prior element is changed from
92-
// placeHolder to element, the position of visible elements are not affected.
93-
contentVisibility: 'auto',
94-
containIntrinsicSize: `0 ${(placeholderHeight || ref?.clientHeight) ?? '0'}px`,
95-
contain: 'size layout',
92+
height: `${placeholderHeightPx}px`,
9693
}),
97-
[width, placeholderHeight]
94+
[width, placeholderHeightPx]
9895
)
9996

10097
const handleResize = useCallback(() => {
@@ -420,6 +417,13 @@ export class ElementObserverManager {
420417
private observedElements: Map<HTMLElement, () => void>
421418
private isMutationObserverActive = false
422419

420+
private hasConnectedObservedElements(): boolean {
421+
for (const observedElement of this.observedElements.keys()) {
422+
if (document.contains(observedElement)) return true
423+
}
424+
return false
425+
}
426+
423427
private pruneDetachedObservedElements(): void {
424428
for (const observedElement of Array.from(this.observedElements.keys())) {
425429
if (!document.contains(observedElement)) {
@@ -448,6 +452,10 @@ export class ElementObserverManager {
448452
if (this.observedElements.size === 0) return
449453

450454
this.pruneDetachedObservedElements()
455+
if (this.observedElements.size === 0) {
456+
this.disconnectMutationObserver()
457+
return
458+
}
451459
const targets = new Set<HTMLElement>()
452460

453461
mutations.forEach((mutation) => {
@@ -479,13 +487,12 @@ export class ElementObserverManager {
479487
private ensureMutationObserverConnected(): void {
480488
if (this.isMutationObserverActive) return
481489
if (this.observedElements.size === 0) return
490+
if (!this.hasConnectedObservedElements()) return
482491
if (!document.body) return
483492

484493
this.mutationObserver.observe(document.body, {
485494
childList: true,
486495
subtree: true,
487-
attributes: true,
488-
characterData: true,
489496
})
490497
this.isMutationObserverActive = true
491498
}
@@ -522,6 +529,14 @@ export class ElementObserverManager {
522529
if (this.observedElements.size === 0) {
523530
this.resizeObserver.disconnect()
524531
this.disconnectMutationObserver()
532+
return
525533
}
534+
535+
if (!this.hasConnectedObservedElements()) {
536+
this.disconnectMutationObserver()
537+
return
538+
}
539+
540+
this.ensureMutationObserverConnected()
526541
}
527542
}

packages/webui/src/client/ui/ClockView/CameraScreen/index.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,13 @@ export function CameraScreen({ playlist, studioId }: Readonly<IProps>): JSX.Elem
149149
useEffect(() => {
150150
const getContainerEl = () => document.querySelector('#render-target > .container-fluid')
151151
const currentContainerEl = getContainerEl()
152-
if (currentContainerEl instanceof HTMLElement) currentContainerEl.classList.remove('header-clear')
152+
if (currentContainerEl instanceof HTMLElement && currentContainerEl.isConnected) {
153+
currentContainerEl.classList.remove('header-clear')
154+
}
153155

154156
return () => {
155157
const cleanupContainerEl = getContainerEl()
156-
if (cleanupContainerEl instanceof HTMLElement) {
158+
if (cleanupContainerEl instanceof HTMLElement && cleanupContainerEl.isConnected) {
157159
cleanupContainerEl.classList.add('header-clear')
158160
}
159161
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ export const PreviewPopUp = React.forwardRef<
9696
}
9797
}, [trackMouse])
9898

99+
useEffect(() => {
100+
return () => {
101+
anchorYRef.current = 0
102+
virtualElement.current.getBoundingClientRect = generateGetBoundingClientRect(0, 0)
103+
updateRef.current = null
104+
}
105+
}, [])
106+
99107
useImperativeHandle(ref, () => {
100108
return {
101109
update: () => {

packages/webui/src/client/ui/PreviewPopUp/PreviewPopUpContext.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ export function PreviewPopUpContextProvider({ children }: React.PropsWithChildre
393393
const [previewSession, setPreviewSession] = useState<PreviewSession | null>(null)
394394
const [previewContent, setPreviewContent] = useState<PreviewContentUI[] | null>(null)
395395
const [t, setTime] = useState<number | null>(null)
396+
const [previewSessionKey, setPreviewSessionKey] = useState(0)
396397

397398
const closeSession = useCallback(() => {
398399
const previousHandle = currentHandle.current
@@ -415,6 +416,7 @@ export function PreviewPopUpContextProvider({ children }: React.PropsWithChildre
415416
const context: IPreviewPopUpContext = {
416417
requestPreview: (anchor, content, opts) => {
417418
closeSession()
419+
setPreviewSessionKey((prev) => prev + 1)
418420

419421
if (opts?.time) {
420422
setTime(opts.time)
@@ -456,6 +458,7 @@ export function PreviewPopUpContextProvider({ children }: React.PropsWithChildre
456458
{children}
457459
{previewSession && (
458460
<PreviewPopUp
461+
key={previewSessionKey}
459462
ref={previewRef}
460463
anchor={previewSession.anchor}
461464
padding={previewSession.padding}

0 commit comments

Comments
 (0)