import "./LinkPreview.css"; import { CSSProperties, useEffect, useState } from "react"; import Spinner from "Icons/Spinner"; import SnortApi, { LinkPreviewData } from "SnortApi"; import useImgProxy from "Hooks/useImgProxy"; async function fetchUrlPreviewInfo(url: string) { const api = new SnortApi(); try { return await api.linkPreview(url); } catch (e) { console.warn(`Failed to load link preview`, url); } } const LinkPreview = ({ url }: { url: string }) => { const [preview, setPreview] = useState(); const { proxy } = useImgProxy(); useEffect(() => { (async () => { const data = await fetchUrlPreviewInfo(url); if (data && data.image) { setPreview(data); } else { setPreview(null); } })(); }, [url]); if (preview === null) return ( e.stopPropagation()} target="_blank" rel="noreferrer" className="ext"> {url} ); const backgroundImage = preview?.image ? `url(${proxy(preview?.image)})` : ""; const style = { "--img-url": backgroundImage } as CSSProperties; return (
{preview && ( e.stopPropagation()} target="_blank" rel="noreferrer" className="ext"> {preview?.image &&
}

{preview?.title} {preview?.description && ( <>
{preview.description.slice(0, 160)} )}

)} {!preview && }
); }; export default LinkPreview;