mirror of
https://github.com/hexastack/hexabot
synced 2025-06-03 11:06:34 +00:00
75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
/*
|
|
* Copyright © 2025 Hexastack. All rights reserved.
|
|
*
|
|
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
|
|
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
|
|
* 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file).
|
|
*/
|
|
|
|
import {
|
|
Button,
|
|
Dialog,
|
|
DialogActions,
|
|
DialogContent,
|
|
Grid,
|
|
} from "@mui/material";
|
|
import { cloneElement, FC, ReactNode } from "react";
|
|
|
|
import { useTranslate } from "@/hooks/useTranslate";
|
|
import { ConfirmOptions, DialogProps } from "@/types/common/dialogs.types";
|
|
|
|
import { DialogTitle } from "../DialogTitle";
|
|
|
|
import { useDialogLoadingButton } from "./hooks/useDialogLoadingButton";
|
|
|
|
export interface ConfirmDialogPayload extends ConfirmOptions {
|
|
msg: ReactNode;
|
|
}
|
|
|
|
export interface ConfirmDialogProps
|
|
extends DialogProps<ConfirmDialogPayload, boolean> {
|
|
mode?: "selection" | "click";
|
|
count?: number;
|
|
}
|
|
|
|
export const ConfirmDialog: FC<ConfirmDialogProps> = ({ payload, ...rest }) => {
|
|
const { t } = useTranslate();
|
|
const cancelButtonProps = useDialogLoadingButton(() => rest.onClose(false));
|
|
const okButtonProps = useDialogLoadingButton(() => rest.onClose(true));
|
|
// @ts-ignore
|
|
const messageReactNode = cloneElement(payload.msg, {
|
|
mode: rest.mode,
|
|
count: rest.count,
|
|
});
|
|
|
|
return (
|
|
<Dialog
|
|
maxWidth="sm"
|
|
fullWidth
|
|
{...rest}
|
|
onClose={() => rest.onClose(false)}
|
|
>
|
|
<DialogTitle onClose={() => rest.onClose(false)}>
|
|
{payload.title || t("title.warning")}
|
|
</DialogTitle>
|
|
<DialogContent>{messageReactNode}</DialogContent>
|
|
<DialogActions style={{ padding: "0.5rem" }}>
|
|
<Grid p="0.3rem 1rem" gap="0.5rem" display="flex">
|
|
<Button
|
|
color={payload.severity || "error"}
|
|
variant="contained"
|
|
disabled={!open}
|
|
autoFocus
|
|
{...okButtonProps}
|
|
>
|
|
{payload.okText || t("label.yes")}
|
|
</Button>
|
|
<Button variant="outlined" disabled={!open} {...cancelButtonProps}>
|
|
{payload.cancelText || t("label.no")}
|
|
</Button>
|
|
</Grid>
|
|
</DialogActions>
|
|
</Dialog>
|
|
);
|
|
};
|