loadingIndicator.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import * as React from 'react';
  2. import {withProfiler} from '@sentry/react';
  3. import classNames from 'classnames';
  4. import sentryLoader from 'sentry-images/sentry-loader.svg';
  5. type Props = {
  6. overlay?: boolean;
  7. dark?: boolean;
  8. mini?: boolean;
  9. triangle?: boolean;
  10. finished?: boolean;
  11. relative?: boolean;
  12. hideMessage?: boolean;
  13. hideSpinner?: boolean;
  14. size?: number;
  15. className?: string;
  16. style?: React.CSSProperties;
  17. children?: React.ReactNode;
  18. };
  19. function renderLogoSpinner() {
  20. return <img src={sentryLoader} />;
  21. }
  22. function LoadingIndicator(props: Props) {
  23. const {
  24. hideMessage,
  25. mini,
  26. triangle,
  27. overlay,
  28. dark,
  29. children,
  30. finished,
  31. className,
  32. style,
  33. relative,
  34. size,
  35. hideSpinner,
  36. } = props;
  37. const cx = classNames(className, {
  38. overlay,
  39. dark,
  40. loading: true,
  41. mini,
  42. triangle,
  43. });
  44. const loadingCx = classNames({
  45. relative,
  46. 'loading-indicator': true,
  47. 'load-complete': finished,
  48. });
  49. let loadingStyle = {};
  50. if (size) {
  51. loadingStyle = {
  52. width: size,
  53. height: size,
  54. };
  55. }
  56. return (
  57. <div className={cx} style={style} data-test-id="loading-indicator">
  58. {!hideSpinner && (
  59. <div className={loadingCx} style={loadingStyle}>
  60. {triangle && renderLogoSpinner()}
  61. {finished ? <div className="checkmark draw" style={style} /> : null}
  62. </div>
  63. )}
  64. {!hideMessage && <div className="loading-message">{children}</div>}
  65. </div>
  66. );
  67. }
  68. export default withProfiler(LoadingIndicator, {
  69. includeUpdates: false,
  70. });