loading-spinner.tsx 1.0 KB

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