mirror of
https://github.com/p-stream/p-stream.git
synced 2026-04-21 05:32:23 +00:00
defer focustrap error to prevent crash
This commit is contained in:
parent
6d362294c4
commit
95d641695b
1 changed files with 52 additions and 1 deletions
|
|
@ -80,6 +80,7 @@ export function OverlayPortal(props: {
|
||||||
zIndex?: number;
|
zIndex?: number;
|
||||||
}) {
|
}) {
|
||||||
const [portalElement, setPortalElement] = useState<Element | null>(null);
|
const [portalElement, setPortalElement] = useState<Element | null>(null);
|
||||||
|
const [isReady, setIsReady] = useState(false);
|
||||||
const ref = useRef<HTMLDivElement>(null);
|
const ref = useRef<HTMLDivElement>(null);
|
||||||
const close = props.close;
|
const close = props.close;
|
||||||
const zIndex = props.zIndex ?? 999;
|
const zIndex = props.zIndex ?? 999;
|
||||||
|
|
@ -87,6 +88,44 @@ export function OverlayPortal(props: {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const element = ref.current?.closest(".popout-location");
|
const element = ref.current?.closest(".popout-location");
|
||||||
setPortalElement(element ?? document.body);
|
setPortalElement(element ?? document.body);
|
||||||
|
|
||||||
|
// Ensure DOM is ready before enabling focus trap
|
||||||
|
const timer = setTimeout(() => {
|
||||||
|
setIsReady(true);
|
||||||
|
}, 100); // Increased delay to ensure DOM is fully rendered
|
||||||
|
|
||||||
|
return () => clearTimeout(timer);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// Add global error handler for unhandled promise rejections
|
||||||
|
useEffect(() => {
|
||||||
|
const handleUnhandledRejection = (event: PromiseRejectionEvent) => {
|
||||||
|
if (
|
||||||
|
event.reason &&
|
||||||
|
typeof event.reason === "object" &&
|
||||||
|
"message" in event.reason
|
||||||
|
) {
|
||||||
|
const message = event.reason.message;
|
||||||
|
if (
|
||||||
|
message &&
|
||||||
|
typeof message === "string" &&
|
||||||
|
message.includes("matches.call")
|
||||||
|
) {
|
||||||
|
console.warn(
|
||||||
|
"Caught focus-trap matches.call error, preventing crash:",
|
||||||
|
event.reason,
|
||||||
|
);
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("unhandledrejection", handleUnhandledRejection);
|
||||||
|
return () =>
|
||||||
|
window.removeEventListener(
|
||||||
|
"unhandledrejection",
|
||||||
|
handleUnhandledRejection,
|
||||||
|
);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -94,7 +133,19 @@ export function OverlayPortal(props: {
|
||||||
{portalElement
|
{portalElement
|
||||||
? createPortal(
|
? createPortal(
|
||||||
<Transition show={props.show} animation="none">
|
<Transition show={props.show} animation="none">
|
||||||
<FocusTrap>
|
<FocusTrap
|
||||||
|
active={isReady && !!props.show}
|
||||||
|
focusTrapOptions={{
|
||||||
|
allowOutsideClick: true,
|
||||||
|
clickOutsideDeactivates: true,
|
||||||
|
fallbackFocus: () => document.body,
|
||||||
|
returnFocusOnDeactivate: true,
|
||||||
|
escapeDeactivates: true,
|
||||||
|
preventScroll: true,
|
||||||
|
// Disable the problematic check that causes the matches.call error
|
||||||
|
checkCanFocusTrap: () => Promise.resolve(),
|
||||||
|
}}
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
className="popout-wrapper fixed overflow-hidden pointer-events-auto inset-0 select-none"
|
className="popout-wrapper fixed overflow-hidden pointer-events-auto inset-0 select-none"
|
||||||
style={{ zIndex }}
|
style={{ zIndex }}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue