Files
planka/client/src/lib/custom-ui/components/Markdown/Markdown.jsx

55 lines
1.5 KiB
React
Raw Normal View History

import React, { useCallback } from 'react';
import PropTypes from 'prop-types';
import ReactMarkdown from 'react-markdown';
2022-04-22 02:06:12 +05:00
import remarkGfm from 'remark-gfm';
import remarkBreaks from 'remark-breaks';
2022-04-22 02:06:12 +05:00
import './Markdown.module.scss'; // FIXME: import as styles?
2022-08-30 13:47:50 +02:00
const ABSOLUTE_URL_REGEX = /^(?:https?:)?\/\//i;
const Markdown = React.memo(({ linkStopPropagation, ...props }) => {
2020-03-25 00:15:47 +05:00
const handleLinkClick = useCallback((event) => {
event.stopPropagation();
}, []);
const linkRenderer = useCallback(
2022-08-30 13:47:50 +02:00
({ node, ...linkProps }) => (
2023-01-09 12:33:49 +01:00
/* eslint-disable-next-line jsx-a11y/anchor-has-content,
jsx-a11y/click-events-have-key-events,
jsx-a11y/no-static-element-interactions */
2022-08-30 13:47:50 +02:00
<a
2023-01-09 12:33:49 +01:00
{...linkProps} // eslint-disable-line react/jsx-props-no-spreading
2022-08-30 13:47:50 +02:00
rel={
ABSOLUTE_URL_REGEX.test(linkProps.href) && linkProps.target === '_blank'
? 'noreferrer'
: undefined
}
onClick={linkStopPropagation ? handleLinkClick : undefined}
/>
),
[linkStopPropagation, handleLinkClick],
);
2022-04-22 02:06:12 +05:00
return (
<ReactMarkdown
{...props} // eslint-disable-line react/jsx-props-no-spreading
2022-08-30 13:47:50 +02:00
components={{
a: linkRenderer,
}}
remarkPlugins={[remarkGfm, remarkBreaks]}
2022-04-22 02:06:12 +05:00
className="markdown-body"
/>
);
});
Markdown.propTypes = {
linkStopPropagation: PropTypes.bool,
};
Markdown.defaultProps = {
linkStopPropagation: false,
};
export default Markdown;