import { useState, useEffect } from "react"; import { useDispatch } from "react-redux"; import { useLazyGetOGInfoQuery } from "../../../app/services/message"; import { upsertOG } from "../../../app/slices/footprint"; import { useAppSelector } from "../../../app/store"; export default function URLPreview({ url = "" }) { const dispatch = useDispatch(); const [favicon, setFavicon] = useState(""); const [getInfo, { isLoading }] = useLazyGetOGInfoQuery(); const ogData = useAppSelector(store => store.footprint.og[url]); const [data, setData] = useState<{ title: string; description: string; ogImage: string } | null>( null ); useEffect(() => { if (ogData) { let defaultFavIcon = ""; try { defaultFavIcon = `${new URL(url).origin}/favicon.ico`; } catch { defaultFavIcon = `${location.origin}/favicon.ico`; } const title = ogData?.title || ogData?.site_name || ""; const description = ogData?.description || ""; const ogImage = ogData?.images.find((i) => !!i.url)?.url || ""; const favicon = ogData?.favicon_url || defaultFavIcon; setFavicon(favicon); setData({ title, description, ogImage }); } else if (url) { // fetch first getInfo(url); } }, [url, ogData]); // const handleFavError = () => { // setFavicon(""); // }; const handleOGImageError = () => { dispatch(upsertOG({ key: url, value: { ...ogData, images: [] } })); }; if (isLoading) return
; if (!url || !data || !data.title) return null; const { title, description, ogImage } = data; const containerClass = `flex items-center border border-solid border-gray-300 dark:border-gray-600 box-border rounded-md w-[80%] md:w-[380px]`; return ogImage ? ( // 简版{description}
{description}
{url}