loading-spinner.tsx 871 B

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