RevisionRenderer.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import React, { type JSX } 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(
  15. ({ error, resetErrorBoundary }) => {
  16. return (
  17. <div role="alert">
  18. <p>Something went wrong:</p>
  19. <pre>{error.message}</pre>
  20. <button
  21. type="button"
  22. className="btn btn-primary"
  23. onClick={resetErrorBoundary}
  24. >
  25. Reload
  26. </button>
  27. </div>
  28. );
  29. },
  30. );
  31. ErrorFallback.displayName = 'ErrorFallback';
  32. const RevisionRenderer = React.memo((props: Props): JSX.Element => {
  33. const { rendererOptions, markdown, additionalClassName } = props;
  34. return (
  35. <ErrorBoundary FallbackComponent={ErrorFallback}>
  36. <ReactMarkdown
  37. {...rendererOptions}
  38. className={`wiki ${additionalClassName ?? ''}`}
  39. >
  40. {markdown}
  41. </ReactMarkdown>
  42. </ErrorBoundary>
  43. );
  44. });
  45. RevisionRenderer.displayName = 'RevisionRenderer';
  46. export default RevisionRenderer;