import { ModalExitCode, ModalObject, ModalService } from "renderer/services/modale.service"; import { AnimatePresence, motion } from "framer-motion"; import { useObservable } from "renderer/hooks/use-observable.hook"; import { useEffect } from "react"; import { BsmIcon } from "../svgs/bsm-icon.component"; import { ThemeColorGradientSpliter } from "../shared/theme-color-gradient-spliter.component"; import { map } from "rxjs"; import { useConstant } from "renderer/hooks/use-constant.hook"; export function Modal() { const modalSevice = ModalService.getInstance(); const modals$ = useConstant(() => modalSevice.getModalToShow()); const modals = useObservable(() => modals$); const currentModal = useObservable(() =>modals$.pipe(map(modals => modals?.at(-1)))); useEffect(() => { const onEscape = (e: KeyboardEvent) => { if (currentModal.options?.closable === false || e.key !== "Escape") { return; } currentModal.resolver({ exitCode: ModalExitCode.CLOSED }); }; if (currentModal) { window.addEventListener("keyup", onEscape); } else { window.removeEventListener("keyup", onEscape); } return () => { window.removeEventListener("keyup", onEscape); }; }, [currentModal]); const renderCloseButton = (modal: ModalObject) => { return (
{ e.stopPropagation(); modal.resolver({ exitCode: ModalExitCode.CLOSED }); }} >
) } const renderModal = (modal: ModalObject) => { if (!modal?.modal) { return null; } if(modal.options?.noStyle){ return } return (
{modal.options?.closable === false ? undefined : renderCloseButton(modal)}
) } const onOverlayClicked = () => { if (currentModal.options?.closable === false) { return; } currentModal.resolver({ exitCode: ModalExitCode.NO_CHOICE }); } return ( {currentModal ? : undefined} {modals?.map(modal => ( {renderModal(modal)} ))} ); }