From 9192eb10fef784d968717b3f876bebeafec74683 Mon Sep 17 00:00:00 2001 From: zubiden <19638254+zubiden@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:37:45 +0100 Subject: [PATCH] Profile: Show links without preview in the list (#6450) --- src/components/common/WebLink.tsx | 57 ++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/components/common/WebLink.tsx b/src/components/common/WebLink.tsx index 7b1e4a929..8880dac4c 100644 --- a/src/components/common/WebLink.tsx +++ b/src/components/common/WebLink.tsx @@ -1,4 +1,4 @@ -import { memo } from '../../lib/teact/teact'; +import { memo, useMemo } from '../../lib/teact/teact'; import { withGlobal } from '../../global'; import type { ApiMessage, ApiWebPage } from '../../api/types'; @@ -50,41 +50,64 @@ const WebLink = ({ const lang = useLang(); const oldLang = useOldLang(); + const handleMessageClick = useLastCallback(() => { + onMessageClick(message); + }); + let linkData: ApiWebPageWithFormatted | undefined = webPage; if (!linkData) { const link = getFirstLinkInMessage(message); if (link) { - const { url, domain } = link; + const { url: linkUrl, domain } = link; linkData = { + mediaType: 'webpage', + webpageType: 'full', + id: '', + displayUrl: linkUrl, siteName: domain.replace(/^www./, ''), - url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`, - formattedDescription: getMessageTextWithFallback(lang, message)?.text !== url + url: linkUrl.includes('://') ? linkUrl : linkUrl.includes('@') ? `mailto:${linkUrl}` : `http://${linkUrl}`, + formattedDescription: getMessageTextWithFallback(lang, message)?.text !== linkUrl ? renderMessageSummary(lang, message, undefined, undefined, MAX_TEXT_LENGTH) : undefined, - } as ApiWebPageWithFormatted; + } satisfies ApiWebPageWithFormatted; } } - const handleMessageClick = useLastCallback(() => { - onMessageClick(message); - }); + const fullLinkData = linkData?.webpageType === 'full' ? linkData : undefined; - if (linkData?.webpageType !== 'full') { - return undefined; - } + const { url } = linkData || {}; + + const fallbackDescription = useMemo(() => { + return getMessageTextWithFallback(lang, message)?.text !== url + ? renderMessageSummary(lang, message, undefined, undefined, MAX_TEXT_LENGTH) + : undefined; + }, [lang, message, url]); const { siteName, - url, displayUrl, title, description, - formattedDescription, + formattedDescription = fallbackDescription, photo, video, - } = linkData; + } = fullLinkData || {}; + + const siteTitle = useMemo(() => { + const text = title || siteName || displayUrl; + if (text) return text; + if (!url) return ''; + try { + const parsedUrl = new URL(url); + return parsedUrl.hostname; + } catch (e) { + return ''; + } + }, [title, siteName, displayUrl, url]); + + if (!url) return undefined; const truncatedDescription = !senderTitle && description && trimText(description, MAX_TEXT_LENGTH); @@ -93,12 +116,12 @@ const WebLink = ({ (!photo && !video) && 'without-media', ); - const safeLinkContent = url.replace('mailto:', '') || displayUrl; + const safeLinkContent = displayUrl || url.replace('mailto:', ''); return (
{photo && ( @@ -106,7 +129,7 @@ const WebLink = ({ )}
- {renderText(title || siteName || displayUrl)} + {renderText(siteTitle)} {(truncatedDescription || formattedDescription) && (