|
1 | 1 | import clsx from 'clsx' |
| 2 | +import {useEffect, useRef} from 'react' |
| 3 | +import FavIcon from "web/public/FavIcon"; |
| 4 | + |
2 | 5 | export type SpinnerSize = 'sm' | 'md' | 'lg' |
3 | 6 |
|
4 | | -function getSizeClass(size: SpinnerSize) { |
5 | | - switch (size) { |
6 | | - case 'sm': |
7 | | - return 'h-4 w-4 border-2' |
8 | | - case 'md': |
9 | | - return 'h-6 w-6 border-4' |
10 | | - case 'lg': |
11 | | - default: |
12 | | - return 'h-8 w-8 border-4' |
13 | | - } |
14 | | -} |
| 7 | +// function getSizeClass(size: SpinnerSize) { |
| 8 | +// switch (size) { |
| 9 | +// case 'sm': |
| 10 | +// return 'h-4 w-4 border-2' |
| 11 | +// case 'md': |
| 12 | +// return 'h-6 w-6 border-4' |
| 13 | +// case 'lg': |
| 14 | +// default: |
| 15 | +// return 'h-8 w-8 border-4' |
| 16 | +// } |
| 17 | +// } |
| 18 | + |
15 | 19 |
|
16 | 20 | export function LoadingIndicator(props: { |
17 | 21 | className?: string |
18 | 22 | spinnerClassName?: string |
19 | | - size?: SpinnerSize |
| 23 | + size?: 'sm' | 'md' | 'lg' |
20 | 24 | }) { |
21 | | - const { className, spinnerClassName, size = 'lg' } = props |
| 25 | + const {className, spinnerClassName} = props |
| 26 | + const compassRef = useRef<HTMLDivElement>(null) |
| 27 | + |
| 28 | + useEffect(() => { |
| 29 | + const el = compassRef.current |
| 30 | + if (!el) return |
| 31 | + |
| 32 | + let angle = 0 |
| 33 | + let timeoutId: number |
| 34 | + |
| 35 | + const randomTurn = () => { |
| 36 | + // Randomly choose direction and angle |
| 37 | + const direction = Math.random() > 0.5 ? 1 : -1 |
| 38 | + const delta = Math.random() * 75 + 5 |
| 39 | + angle = direction * delta |
| 40 | + |
| 41 | + el.style.transform = `rotate(${angle}deg)` |
| 42 | + |
| 43 | + // Random delay before next movement |
| 44 | + const delay = Math.random() * 400 + 400 |
| 45 | + timeoutId = window.setTimeout(randomTurn, delay) |
| 46 | + } |
| 47 | + |
| 48 | + randomTurn() |
| 49 | + return () => clearTimeout(timeoutId) |
| 50 | + }, []) |
| 51 | + |
22 | 52 | return ( |
23 | | - <div className={clsx('flex items-center justify-center', className)}> |
| 53 | + <div className={clsx('flex items-center justify-center mt-8', className)}> |
24 | 54 | <div |
| 55 | + ref={compassRef} |
25 | 56 | className={clsx( |
26 | | - 'border-primary-500 inline-block animate-spin rounded-full border-solid border-r-transparent', |
27 | | - getSizeClass(size), |
| 57 | + 'inline-block transition-transform duration-700 ease-in-out', |
| 58 | + // getSizeClass(size), |
28 | 59 | spinnerClassName |
29 | 60 | )} |
30 | 61 | role="status" |
31 | | - /> |
| 62 | + > |
| 63 | + <FavIcon className="dark:invert w-20 h-20"/> |
| 64 | + </div> |
32 | 65 | </div> |
33 | 66 | ) |
34 | 67 | } |
| 68 | + |
0 commit comments