aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/components/dialog/DialogOverlay.tsx
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-09-22 16:58:30 +0800
committercrupest <crupest@outlook.com>2023-09-22 16:59:41 +0800
commit6dd0bafa45ce22f0acac7d6e097e3f1790cdb5d7 (patch)
tree6378aa13ebc5974cbfeeca9f6d525a643993687d /FrontEnd/src/components/dialog/DialogOverlay.tsx
parentd477c7270c90b190ed82b13f48f39a05d83503d2 (diff)
downloadtimeline-6dd0bafa45ce22f0acac7d6e097e3f1790cdb5d7.tar.gz
timeline-6dd0bafa45ce22f0acac7d6e097e3f1790cdb5d7.tar.bz2
timeline-6dd0bafa45ce22f0acac7d6e097e3f1790cdb5d7.zip
...
Diffstat (limited to 'FrontEnd/src/components/dialog/DialogOverlay.tsx')
-rw-r--r--FrontEnd/src/components/dialog/DialogOverlay.tsx66
1 files changed, 66 insertions, 0 deletions
diff --git a/FrontEnd/src/components/dialog/DialogOverlay.tsx b/FrontEnd/src/components/dialog/DialogOverlay.tsx
new file mode 100644
index 00000000..f7b58474
--- /dev/null
+++ b/FrontEnd/src/components/dialog/DialogOverlay.tsx
@@ -0,0 +1,66 @@
+import { ReactNode, useRef } from "react";
+import classNames from "classnames";
+import { CSSTransition } from "react-transition-group";
+
+import InPortal from "../InPortal";
+
+import "./DialogOverlay.css";
+
+interface DialogOverlayProps {
+ open: boolean;
+ onClose: () => void;
+ transitionClassNames: string;
+ overlayClassName?: string;
+ containerClassName?: string;
+ children?: ReactNode;
+ disableCloseOnClickOnOverlay?: boolean;
+}
+
+export default function DialogOverlay({
+ open,
+ onClose,
+ transitionClassNames,
+ overlayClassName,
+ containerClassName,
+ children,
+ disableCloseOnClickOnOverlay,
+}: DialogOverlayProps) {
+ const nodeRef = useRef(null);
+ const lastPointerDownIdRef = useRef<number | null>(null);
+
+ return (
+ <InPortal>
+ <CSSTransition
+ nodeRef={nodeRef}
+ mountOnEnter
+ unmountOnExit
+ in={open}
+ timeout={300}
+ classNames={transitionClassNames}
+ >
+ <div
+ ref={nodeRef}
+ className={classNames("cru-dialog-overlay", overlayClassName)}
+ >
+ <div
+ className="cru-dialog-background"
+ onPointerDown={(e) => {
+ lastPointerDownIdRef.current = e.pointerId;
+ }}
+ onPointerUp={(e) => {
+ if (lastPointerDownIdRef.current === e.pointerId) {
+ if (!disableCloseOnClickOnOverlay) onClose();
+ }
+ lastPointerDownIdRef.current = null;
+ }}
+ />
+ <div
+ className={classNames("cru-dialog-container", containerClassName)}
+ >
+ {children}
+ </div>
+ </div>
+ </CSSTransition>
+ </InPortal>
+ );
+}