|
1 | 1 | import { useCallback, useEffect, useRef, useState } from "react"; |
2 | 2 | import { extractDomain, faviconUrl } from "~/utils/favicon"; |
3 | 3 |
|
| 4 | +function resolve(input: string, size: number): string | null { |
| 5 | + const domain = extractDomain(input); |
| 6 | + return domain && domain.includes(".") ? faviconUrl(domain, size) : null; |
| 7 | +} |
| 8 | + |
4 | 9 | export function useFaviconUrl(urlInput: string, size: number = 64) { |
5 | | - const [url, setUrl] = useState<string | null>(null); |
| 10 | + const [url, setUrl] = useState<string | null>(() => resolve(urlInput, size)); |
6 | 11 | const timeoutRef = useRef<ReturnType<typeof setTimeout>>(); |
7 | 12 |
|
8 | | - const update = useCallback( |
9 | | - (value: string) => { |
10 | | - if (timeoutRef.current) clearTimeout(timeoutRef.current); |
11 | | - timeoutRef.current = setTimeout(() => { |
12 | | - const domain = extractDomain(value); |
13 | | - if (domain && domain.includes(".")) { |
14 | | - setUrl(faviconUrl(domain, size)); |
15 | | - } else { |
16 | | - setUrl(null); |
17 | | - } |
18 | | - }, 400); |
19 | | - }, |
20 | | - [size] |
21 | | - ); |
22 | | - |
23 | 13 | useEffect(() => { |
24 | | - update(urlInput); |
| 14 | + if (timeoutRef.current) clearTimeout(timeoutRef.current); |
| 15 | + timeoutRef.current = setTimeout(() => { |
| 16 | + setUrl(resolve(urlInput, size)); |
| 17 | + }, 400); |
25 | 18 | return () => { |
26 | 19 | if (timeoutRef.current) clearTimeout(timeoutRef.current); |
27 | 20 | }; |
28 | | - }, [urlInput, update]); |
| 21 | + }, [urlInput, size]); |
29 | 22 |
|
30 | 23 | return url; |
31 | 24 | } |
0 commit comments