import type { FC } from '../../lib/teact/teact'; import { memo } from '../../lib/teact/teact'; import type { ApiMessage, ApiWebPage } from '../../api/types'; import type { ObserveFn } from '../../hooks/useIntersectionObserver'; import type { TextPart } from '../../types'; import { getFirstLinkInMessage, getMessageText, getMessageWebPage, } from '../../global/helpers'; import buildClassName from '../../util/buildClassName'; import { formatPastTimeShort } from '../../util/dates/dateFormat'; import trimText from '../../util/trimText'; import { renderMessageSummary } from './helpers/renderMessageText'; import renderText from './helpers/renderText'; import useLastCallback from '../../hooks/useLastCallback'; import useOldLang from '../../hooks/useOldLang'; import Link from '../ui/Link'; import Media from './Media'; import SafeLink from './SafeLink'; import './WebLink.scss'; const MAX_TEXT_LENGTH = 170; // symbols type OwnProps = { message: ApiMessage; senderTitle?: string; isProtected?: boolean; observeIntersection?: ObserveFn; onMessageClick: (message: ApiMessage) => void; }; type ApiWebPageWithFormatted = ApiWebPage & { formattedDescription?: TextPart[] }; const WebLink: FC = ({ message, senderTitle, isProtected, observeIntersection, onMessageClick, }) => { const lang = useOldLang(); let linkData: ApiWebPageWithFormatted | undefined = getMessageWebPage(message); if (!linkData) { const link = getFirstLinkInMessage(message); if (link) { const { url, domain } = link; linkData = { siteName: domain.replace(/^www./, ''), url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`, formattedDescription: getMessageText(message)?.text !== url ? renderMessageSummary(lang, message, undefined, undefined, MAX_TEXT_LENGTH) : undefined, } as ApiWebPageWithFormatted; } } const handleMessageClick = useLastCallback(() => { onMessageClick(message); }); if (!linkData) { return undefined; } const { siteName, url, displayUrl, title, description, formattedDescription, photo, video, } = linkData; const truncatedDescription = !senderTitle && description && trimText(description, MAX_TEXT_LENGTH); const className = buildClassName( 'WebLink scroll-item', (!photo && !video) && 'without-media', ); const safeLinkContent = url.replace('mailto:', '') || displayUrl; return (
{photo && ( )}
{renderText(title || siteName || displayUrl)} {(truncatedDescription || formattedDescription) && ( {formattedDescription || (truncatedDescription && renderText(truncatedDescription))} )} {senderTitle &&
{renderText(senderTitle)}
}
{senderTitle && (
{formatPastTimeShort(lang, message.date * 1000)}
)}
); }; export default memo(WebLink);