-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathConfirmModal.tsx
More file actions
128 lines (116 loc) · 2.88 KB
/
Copy pathConfirmModal.tsx
File metadata and controls
128 lines (116 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import {
ButtonPresetTheme,
ButtonVariant,
Dialog,
DialogVariant,
IconAlertCircle,
IconInfoCircle,
} from 'hds-react';
import React from 'react';
import { useTranslation } from 'react-i18next';
import Button from '../../button/Button';
import LoadingButton from '../../loadingButton/LoadingButton';
import styles from '../dialog.module.scss';
export type CommonConfirmModalProps = {
isOpen: boolean;
isSaving: boolean;
onClose: () => void;
onConfirm: () => void;
};
type ConfirmModalProps = {
bodyContent?: React.ReactElement;
confirmButtonIcon: React.ReactElement;
confirmButtonText: string;
description: string;
extraWarning?: React.ReactElement;
heading: string;
id: string;
variant: DialogVariant;
} & CommonConfirmModalProps;
const ConfirmModal: React.FC<ConfirmModalProps> = ({
bodyContent,
confirmButtonIcon,
confirmButtonText,
description,
extraWarning,
heading,
id,
isOpen,
isSaving,
onClose,
onConfirm,
variant,
}) => {
const { t } = useTranslation();
const handleClose = (event?: React.MouseEvent | React.KeyboardEvent) => {
event?.preventDefault();
event?.stopPropagation();
onClose();
};
const handleConfirm = (event: React.MouseEvent<HTMLButtonElement>) => {
event.preventDefault();
event.stopPropagation();
onConfirm();
};
const titleId = `${id}-title`;
const descriptionId = `${id}-description`;
if (!isOpen) return null;
return (
<Dialog
id={id}
aria-labelledby={titleId}
aria-describedby={descriptionId}
className={styles.dialog}
isOpen={isOpen}
variant={variant}
>
<Dialog.Header
id={titleId}
iconStart={
variant === 'primary' ? (
<IconInfoCircle aria-hidden={true} />
) : (
<IconAlertCircle aria-hidden={true} />
)
}
title={heading}
/>
<Dialog.Content>
{extraWarning}
{variant === 'danger' && (
<p className={styles.warning}>
<strong>{t('common.warning')}</strong>
</p>
)}
<p id={descriptionId}>{description}</p>
{bodyContent}
</Dialog.Content>
<Dialog.ActionButtons>
<LoadingButton
disabled={isSaving}
icon={confirmButtonIcon}
loading={isSaving}
onClick={handleConfirm}
type="button"
variant={
variant === ButtonVariant.Danger
? ButtonVariant.Danger
: ButtonVariant.Primary
}
>
{confirmButtonText}
</LoadingButton>
<Button
disabled={isSaving}
onClick={handleClose}
theme={ButtonPresetTheme.Black}
type="button"
variant={ButtonVariant.Secondary}
>
{t('common.cancel')}
</Button>
</Dialog.ActionButtons>
</Dialog>
);
};
export default ConfirmModal;