diff options
author | crupest <crupest@outlook.com> | 2023-08-31 23:56:13 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2023-08-31 23:56:13 +0800 |
commit | 6664fb3506b1ea4af712fa849bd7c761a06c9843 (patch) | |
tree | 1a15efb73c5608d336587390aadea9a9a210cc25 /FrontEnd/src/components/dialog/FullPageDialog.tsx | |
parent | a1f69d978426c6a4cb7e8f3116e087553dbbffd5 (diff) | |
download | timeline-6664fb3506b1ea4af712fa849bd7c761a06c9843.tar.gz timeline-6664fb3506b1ea4af712fa849bd7c761a06c9843.tar.bz2 timeline-6664fb3506b1ea4af712fa849bd7c761a06c9843.zip |
...
Diffstat (limited to 'FrontEnd/src/components/dialog/FullPageDialog.tsx')
-rw-r--r-- | FrontEnd/src/components/dialog/FullPageDialog.tsx | 80 |
1 files changed, 39 insertions, 41 deletions
diff --git a/FrontEnd/src/components/dialog/FullPageDialog.tsx b/FrontEnd/src/components/dialog/FullPageDialog.tsx index cba57e21..d18bcf73 100644 --- a/FrontEnd/src/components/dialog/FullPageDialog.tsx +++ b/FrontEnd/src/components/dialog/FullPageDialog.tsx @@ -1,53 +1,51 @@ -import * as React from "react"; +import { ReactNode } from "react"; import { createPortal } from "react-dom"; -import classnames from "classnames"; -import { CSSTransition } from "react-transition-group"; +import classNames from "classnames"; + +import { ThemeColor, UiLogicError } from "../common"; +import { IconButton } from "../button"; + +import { useCloseDialog } from "./DialogProvider"; import "./FullPageDialog.css"; -import IconButton from "../button/IconButton"; -export interface FullPageDialogProps { - show: boolean; - onBack: () => void; +const optionalPortalElement = document.getElementById("portal"); +if (optionalPortalElement == null) { + throw new UiLogicError(); +} +const portalElement = optionalPortalElement; + +interface FullPageDialogProps { + color?: ThemeColor; contentContainerClassName?: string; - children: React.ReactNode; + children: ReactNode; } -const FullPageDialog: React.FC<FullPageDialogProps> = ({ - show, - onBack, +export default function FullPageDialog({ + color, children, contentContainerClassName, -}) => { +}: FullPageDialogProps) { + const closeDialog = useCloseDialog(); + return createPortal( - <CSSTransition - mountOnEnter - unmountOnExit - in={show} - timeout={300} - classNames="cru-full-page" - > - <div className="cru-full-page"> - <div className="cru-full-page-top-bar"> - <IconButton - icon="arrow-left" - className="ms-3 cru-full-page-back-button" - onClick={onBack} - /> - </div> - <div - className={classnames( - "cru-full-page-content-container", - contentContainerClassName, - )} - > - {children} - </div> + <div className={`cru-dialog-full-page cru-theme-${color ?? "primary"}`}> + <div className="cru-dialog-full-page-top-bar"> + <IconButton + icon="arrow-left" + className="cru-dialog-full-page-back-button" + onClick={closeDialog} + /> + </div> + <div + className={classNames( + "cru-dialog-full-page-content-container", + contentContainerClassName, + )} + > + {children} </div> - </CSSTransition>, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - document.getElementById("portal")!, + </div>, + portalElement, ); -}; - -export default FullPageDialog; +} |