Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / components / containers / login / AbuseModal.tsx
blobcffe49935e1da1ae494c1123823804602b3c2eb6
1 import DOMPurify from 'dompurify';
2 import { c } from 'ttag';
4 import { Button, Href } from '@proton/atoms';
5 import Prompt from '@proton/components/components/prompt/Prompt';
6 import { isElement } from '@proton/shared/lib/helpers/dom';
7 import { getAbuseURL } from '@proton/shared/lib/helpers/url';
9 interface Props {
10     message?: string;
11     open: boolean;
12     onClose: () => void;
15 const sanitize = (msg: string) => {
16     const sanitizedElement = DOMPurify.sanitize(msg, {
17         RETURN_DOM: true,
18         ALLOWED_TAGS: ['b', 'a', 'i', 'em', 'strong', 'br', 'p', 'span'],
19         ALLOWED_ATTR: ['href'],
20     });
22     sanitizedElement.querySelectorAll('a').forEach((node) => {
23         if (node.tagName === 'A') {
24             node.setAttribute('rel', 'noopener noreferrer');
25             node.setAttribute('target', '_blank');
26         }
27     });
29     return sanitizedElement;
32 const containsHTML = (el?: Node) => {
33     return el?.childNodes && Array.from(el.childNodes).some(isElement);
36 const purifyMessage = (msg: string) => {
37     const sanitizedElement = sanitize(msg);
39     if (containsHTML(sanitizedElement)) {
40         return <div dangerouslySetInnerHTML={{ __html: sanitizedElement.innerHTML }} />;
41     }
43     return <>{msg}</>;
46 const AbuseModal = ({ message, open, onClose }: Props) => {
47     const contactLink = (
48         <Href href={getAbuseURL()} key={1}>
49             {c('Info').t`here`}
50         </Href>
51     );
53     return (
54         <Prompt
55             open={open}
56             title={c('Title').t`Account suspended`}
57             onClose={onClose}
58             buttons={<Button onClick={onClose}>{c('Action').t`Close`}</Button>}
59         >
60             {message ? (
61                 purifyMessage(message)
62             ) : (
63                 <>
64                     <div className="mb-4">{c('Info')
65                         .t`This account has been suspended due to a potential policy violation.`}</div>
66                     <div>{c('Info').jt`If you believe this is in error, please contact us ${contactLink}.`}</div>
67                 </>
68             )}
69         </Prompt>
70     );
73 export default AbuseModal;