import { Box, Flex, HStack, Input, LoadingState, Text, VStack, } from '@metafam/ds'; import React, { useCallback, useEffect, useState } from 'react'; import { MetaLink } from '#components/Link'; import { Maybe } from '#graphql/autogen/hasura-sdk'; import { useDelay } from '#lib/hooks/useDelay'; import { BoxMetadata } from '#utils/boxTypes'; import { errorHandler } from '#utils/errorHandler'; const metadataLink = '/api/metadata?url='; type EmbeddedUrlProps = { url?: string; }; interface URIMetadata { url?: Maybe; title?: Maybe; description?: Maybe; image?: Maybe; site_name?: Maybe; } export const EmbeddedUrl: React.FC = ({ url: inputUrl = '', }) => { const [metadata, setMetadata] = useState>(null); const [loading, setLoading] = useState(true); const updateMetadata = useCallback(async (uri: string) => { setLoading(true); try { const res = await fetch(metadataLink + uri); const { error, response } = await res.json(); if (error) throw error; setMetadata(response.og as unknown as URIMetadata); } catch (err) { console.error(`No metadata found for the URL "${uri}"`, err); errorHandler(err as Error); setMetadata(null); } finally { setLoading(false); } }, []); const delayedUpdate = useDelay(updateMetadata); useEffect(() => delayedUpdate(inputUrl), [inputUrl, delayedUpdate]); if (!metadata || loading) { return ( {loading && } ); } const { image, description, title, site_name: siteName, url } = metadata; return ( {image && ( )} {title && ( {title} )} {description && ( {description} )} {siteName && ( {siteName} • )} {url ?? inputUrl} ); }; export const EmbeddedUrlMetadata: React.FC<{ metadata: BoxMetadata; setMetadata: (d: BoxMetadata) => void; }> = ({ metadata, setMetadata }) => ( setMetadata({ url })} size="lg" borderRadius={0} borderColor="borderPurple" fontSize="md" borderWidth="2px" /> );