import "./confirm-dialog.scss"; import React, { ReactNode } from "react"; import { observable } from "mobx"; import { observer } from "mobx-react"; import { cssNames, noop, prevDefault } from "../../utils"; import { Button, ButtonProps } from "../button"; import { Dialog, DialogProps } from "../dialog"; import { Icon } from "../icon"; export interface ConfirmDialogProps extends Partial { } export interface ConfirmDialogParams { ok?: () => void; labelOk?: ReactNode; labelCancel?: ReactNode; message?: ReactNode; icon?: ReactNode; okButtonProps?: Partial cancelButtonProps?: Partial } @observer export class ConfirmDialog extends React.Component { @observable static isOpen = false; @observable.ref static params: ConfirmDialogParams; @observable isSaving = false; static open(params: ConfirmDialogParams) { ConfirmDialog.isOpen = true; ConfirmDialog.params = params; } static close() { ConfirmDialog.isOpen = false; } public defaultParams: ConfirmDialogParams = { ok: noop, labelOk: "Ok", labelCancel: "Cancel", icon: , }; get params(): ConfirmDialogParams { return Object.assign({}, this.defaultParams, ConfirmDialog.params); } ok = async () => { try { this.isSaving = true; await Promise.resolve(this.params.ok()).catch(noop); } finally { this.isSaving = false; } this.close(); }; onClose = () => { this.isSaving = false; }; close = () => { ConfirmDialog.close(); }; render() { const { className, ...dialogProps } = this.props; const { icon, labelOk, labelCancel, message, okButtonProps = {}, cancelButtonProps = {}, } = this.params; return (
{icon} {message}
); } }