mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 21:45:31 +09:00
32 lines
927 B
TypeScript
32 lines
927 B
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import styles from '@app/features/voice/components/IncomingCallManager.module.css';
|
|
import {useEffect, useState} from 'react';
|
|
|
|
let portalRoot: HTMLElement | null = null;
|
|
|
|
function createPortalRoot(): HTMLElement | null {
|
|
if (portalRoot && document.body.contains(portalRoot)) {
|
|
return portalRoot;
|
|
}
|
|
const root = document.createElement('div');
|
|
root.className = styles.portalRoot;
|
|
root.dataset.incomingCallPortal = 'true';
|
|
root.dataset.floatingUiPortal = 'true';
|
|
document.body.appendChild(root);
|
|
portalRoot = root;
|
|
return root;
|
|
}
|
|
|
|
export function ensureIncomingCallPortalRoot(): HTMLElement | null {
|
|
return createPortalRoot();
|
|
}
|
|
|
|
export function useIncomingCallPortalRoot(): HTMLElement | null {
|
|
const [root, setRoot] = useState<HTMLElement | null>(() => createPortalRoot());
|
|
useEffect(() => {
|
|
setRoot((prev) => prev ?? createPortalRoot());
|
|
}, []);
|
|
return root;
|
|
}
|