RevisionRenderer.tsx 1.3 KB

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