import { Link as MLink, Tooltip } from "@mui/joy"; import { useState } from "react"; import { markdownServiceClient } from "@/grpcweb"; import { workspaceStore } from "@/store/v2"; import { LinkMetadata } from "@/types/proto/api/v1/markdown_service"; import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; interface Props { url: string; text?: string; } const getFaviconWithGoogleS2 = (url: string) => { try { const urlObject = new URL(url); return `https://www.google.com/s2/favicons?sz=128&domain=${urlObject.hostname}`; } catch (error) { return undefined; } }; const Link: React.FC = ({ text, url }: Props) => { const workspaceMemoRelatedSetting = workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED).memoRelatedSetting || WorkspaceMemoRelatedSetting.fromPartial({}); const [initialized, setInitialized] = useState(false); const [showTooltip, setShowTooltip] = useState(false); const [linkMetadata, setLinkMetadata] = useState(); const handleMouseEnter = async () => { if (!workspaceMemoRelatedSetting.enableLinkPreview) { return; } setShowTooltip(true); if (!initialized) { try { const linkMetadata = await markdownServiceClient.getLinkMetadata({ link: url }); setLinkMetadata(linkMetadata); } catch (error) { console.error("Error fetching URL metadata:", error); } setInitialized(true); } }; return (
{linkMetadata?.title}

{linkMetadata?.title}

{linkMetadata.description && (

{linkMetadata.description}

)} ) } open={showTooltip} arrow > setShowTooltip(false)}> {text || url}
); }; export default Link;