RevisionRenderer.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import React from 'react';
  2. import type { FallbackProps } from 'react-error-boundary';
  3. import { ErrorBoundary } from 'react-error-boundary';
  4. import ReactMarkdown from 'react-markdown';
  5. import type { RendererOptions } from '~/interfaces/renderer-options';
  6. import loggerFactory from '~/utils/logger';
  7. import 'katex/dist/katex.min.css';
  8. const logger = loggerFactory('components:Page:RevisionRenderer');
  9. type Props = {
  10. rendererOptions: RendererOptions,
  11. markdown: string,
  12. additionalClassName?: string,
  13. }
  14. const ErrorFallback: React.FC<FallbackProps> = React.memo(({ error, resetErrorBoundary }) => {
  15. return (
  16. <div role="alert">
  17. <p>Something went wrong:</p>
  18. <pre>{error.message}</pre>
  19. <button type="button" className="btn btn-primary" onClick={resetErrorBoundary}>Reload</button>
  20. </div>
  21. );
  22. });
  23. ErrorFallback.displayName = 'ErrorFallback';
  24. const RevisionRenderer = React.memo((props: Props): JSX.Element => {
  25. const {
  26. rendererOptions, markdown, additionalClassName,
  27. } = props;
  28. return (
  29. <ErrorBoundary FallbackComponent={ErrorFallback}>
  30. <ReactMarkdown
  31. {...rendererOptions}
  32. className={`wiki ${additionalClassName ?? ''}`}
  33. >
  34. {markdown}
  35. </ReactMarkdown>
  36. </ErrorBoundary>
  37. );
  38. });
  39. RevisionRenderer.displayName = 'RevisionRenderer';
  40. export default RevisionRenderer;