import { flushSync } from "react-dom"; import { t } from "../i18n"; import type { DialogProps } from "./Dialog"; import { Dialog } from "./Dialog"; import "./ConfirmDialog.scss"; import DialogActionButton from "./DialogActionButton"; import { useSetAtom } from "jotai"; import { isLibraryMenuOpenAtom } from "./LibraryMenu"; import { useExcalidrawContainer, useExcalidrawSetAppState } from "./App"; import { jotaiScope } from "../jotai"; interface Props extends Omit { onConfirm: () => void; onCancel: () => void; confirmText?: string; cancelText?: string; } const ConfirmDialog = (props: Props) => { const { onConfirm, onCancel, children, confirmText = t("buttons.confirm"), cancelText = t("buttons.cancel"), className = "", ...rest } = props; const setAppState = useExcalidrawSetAppState(); const setIsLibraryMenuOpen = useSetAtom(isLibraryMenuOpenAtom, jotaiScope); const { container } = useExcalidrawContainer(); return ( {children}
{ setAppState({ openMenu: null }); setIsLibraryMenuOpen(false); // flush any pending updates synchronously, // otherwise it could lead to crash in some chromium versions (131.0.6778.86), // when `.focus` is invoked with container in some intermediate state // (container seems mounted in DOM, but focus still causes a crash) flushSync(() => { onCancel(); }); container?.focus(); }} /> { setAppState({ openMenu: null }); setIsLibraryMenuOpen(false); // flush any pending updates synchronously, // otherwise it leads to crash in some chromium versions (131.0.6778.86), // when `.focus` is invoked with container in some intermediate state // (container seems mounted in DOM, but focus still causes a crash) flushSync(() => { onConfirm(); }); container?.focus(); }} actionType="danger" />
); }; export default ConfirmDialog;