import { Center, Loader } from '@mantine/core'; import { useEffect, useRef, useState } from 'react'; import { TfiWorld } from 'react-icons/tfi'; import styles from './link_favicon.module.css'; const IMG_LOAD_TIMEOUT = 7_500; interface LinkFaviconProps { url: string; size?: number; } export default function LinkFavicon({ url, size = 32 }: LinkFaviconProps) { const imgRef = useRef(null); const [isFailed, setFailed] = useState(false); const [isLoading, setLoading] = useState(true); const setFallbackFavicon = () => setFailed(true); const handleStopLoading = () => setLoading(false); const handleErrorLoading = () => { setFallbackFavicon(); handleStopLoading(); }; useEffect(() => { if (imgRef.current?.complete) { handleStopLoading(); return; } const id = setTimeout(() => handleErrorLoading(), IMG_LOAD_TIMEOUT); return () => clearTimeout(id); }, [isLoading]); return (
{!isFailed ? ( icon ) : ( )} {isLoading && (
)}
); }