loadingIndicator.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. relative?: boolean;
  11. hideMessage?: boolean;
  12. hideSpinner?: boolean;
  13. size?: number;
  14. className?: string;
  15. style?: React.CSSProperties;
  16. children?: React.ReactNode;
  17. };
  18. function renderLogoSpinner() {
  19. return <img src={sentryLoader} />;
  20. }
  21. function LoadingIndicator(props: Props) {
  22. const {
  23. hideMessage,
  24. mini,
  25. triangle,
  26. overlay,
  27. dark,
  28. children,
  29. className,
  30. style,
  31. relative,
  32. size,
  33. hideSpinner,
  34. } = props;
  35. const cx = classNames(className, {
  36. overlay,
  37. dark,
  38. loading: true,
  39. mini,
  40. triangle,
  41. });
  42. const loadingCx = classNames({
  43. relative,
  44. 'loading-indicator': true,
  45. });
  46. let loadingStyle = {};
  47. if (size) {
  48. loadingStyle = {
  49. width: size,
  50. height: size,
  51. };
  52. }
  53. return (
  54. <div className={cx} style={style} data-test-id="loading-indicator">
  55. {!hideSpinner && (
  56. <div className={loadingCx} style={loadingStyle}>
  57. {triangle && renderLogoSpinner()}
  58. </div>
  59. )}
  60. {!hideMessage && <div className="loading-message">{children}</div>}
  61. </div>
  62. );
  63. }
  64. export default withProfiler(LoadingIndicator, {
  65. includeUpdates: false,
  66. });