loading-spinner.tsx 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { useTranslation } from 'react-i18next'
  2. import Icon from './icon'
  3. import { useEffect, useState } from 'react'
  4. import PropTypes from 'prop-types'
  5. function LoadingSpinner({ delay = 0 }) {
  6. const { t } = useTranslation()
  7. const [show, setShow] = useState(false)
  8. useEffect(() => {
  9. const timer = window.setTimeout(() => {
  10. setShow(true)
  11. }, delay)
  12. return () => {
  13. window.clearTimeout(timer)
  14. }
  15. }, [delay])
  16. if (!show) {
  17. return null
  18. }
  19. return (
  20. <div className="loading">
  21. <Icon type="refresh" fw spin />
  22. &nbsp;
  23. {t('loading')}…
  24. </div>
  25. )
  26. }
  27. LoadingSpinner.propTypes = {
  28. delay: PropTypes.number,
  29. }
  30. export default LoadingSpinner
  31. export function FullSizeLoadingSpinner({
  32. delay = 0,
  33. minHeight,
  34. }: {
  35. delay?: number
  36. minHeight?: string
  37. }) {
  38. return (
  39. <div className="full-size-loading-spinner-container" style={{ minHeight }}>
  40. <LoadingSpinner delay={delay} />
  41. </div>
  42. )
  43. }
  44. FullSizeLoadingSpinner.propTypes = {
  45. delay: PropTypes.number,
  46. minHeight: PropTypes.string,
  47. }