WebPage: Show document photo preview if available (#6704)

This commit is contained in:
zubiden 2026-02-22 23:43:47 +01:00 committed by Alexander Zinchuk
parent 9c66d6cc86
commit 98c7e88f31
3 changed files with 19 additions and 21 deletions

View File

@ -13,6 +13,7 @@ import {
getMediaFormat, getMediaThumbUri, getMediaTransferState, getPhotoMediaHash, getMediaFormat, getMediaThumbUri, getMediaTransferState, getPhotoMediaHash,
} from '../../../global/helpers'; } from '../../../global/helpers';
import buildClassName from '../../../util/buildClassName'; import buildClassName from '../../../util/buildClassName';
import buildStyle from '../../../util/buildStyle';
import getCustomAppendixBg from './helpers/getCustomAppendixBg'; import getCustomAppendixBg from './helpers/getCustomAppendixBg';
import { calculateMediaDimensions, MIN_MEDIA_HEIGHT } from './helpers/mediaDimensions'; import { calculateMediaDimensions, MIN_MEDIA_HEIGHT } from './helpers/mediaDimensions';
@ -256,8 +257,15 @@ const Photo = <T,>({
className, className,
); );
const dimensionsStyle = dimensions ? ` width: ${width}px; left: ${dimensions.x}px; top: ${dimensions.y}px;` : ''; const dimensionsStyle = dimensions && buildStyle(
const style = size === 'inline' ? `height: ${height}px;${dimensionsStyle}` : undefined; `left: ${dimensions.x}px`,
`top: ${dimensions.y}px`,
);
const style = size === 'inline' ? buildStyle(
`height: ${height}px`,
`width: ${width}px`,
dimensionsStyle,
) : undefined;
return ( return (
<div <div

View File

@ -1,14 +1,11 @@
import type { FC } from '../../../lib/teact/teact';
import type React from '../../../lib/teact/teact';
import { memo, useMemo, useRef } from '../../../lib/teact/teact'; import { memo, useMemo, useRef } from '../../../lib/teact/teact';
import { getActions, withGlobal } from '../../../global'; import { getActions } from '../../../global';
import type { ApiMessage, ApiMessageWebPage, ApiTypeStory, ApiWebPage, ApiWebPageFull } from '../../../api/types'; import type { ApiMessage, ApiMessageWebPage, ApiTypeStory, ApiWebPage, ApiWebPageFull } from '../../../api/types';
import type { ObserveFn } from '../../../hooks/useIntersectionObserver'; import type { ObserveFn } from '../../../hooks/useIntersectionObserver';
import { AudioOrigin, type ThemeKey, type WebPageMediaSize } from '../../../types'; import { AudioOrigin, type ThemeKey, type WebPageMediaSize } from '../../../types';
import { getPhotoFullDimensions } from '../../../global/helpers'; import { getPhotoFullDimensions } from '../../../global/helpers';
import { selectCanPlayAnimatedEmojis } from '../../../global/selectors';
import buildClassName from '../../../util/buildClassName'; import buildClassName from '../../../util/buildClassName';
import { tryParseDeepLink } from '../../../util/deepLinkParser'; import { tryParseDeepLink } from '../../../util/deepLinkParser';
import trimText from '../../../util/trimText'; import trimText from '../../../util/trimText';
@ -68,11 +65,8 @@ type OwnProps = {
onCancelMediaTransfer?: NoneToVoidFunction; onCancelMediaTransfer?: NoneToVoidFunction;
onContainerClick?: ((e: React.MouseEvent) => void); onContainerClick?: ((e: React.MouseEvent) => void);
}; };
type StateProps = {
canPlayAnimatedEmojis: boolean;
};
const WebPage: FC<OwnProps & StateProps> = ({ const WebPage = ({
messageWebPage, messageWebPage,
webPage, webPage,
message, message,
@ -96,7 +90,7 @@ const WebPage: FC<OwnProps & StateProps> = ({
onContainerClick, onContainerClick,
onAudioPlay, onAudioPlay,
onCancelMediaTransfer, onCancelMediaTransfer,
}) => { }: OwnProps) => {
const { openUrl, openTelegramLink } = getActions(); const { openUrl, openTelegramLink } = getActions();
const stickersRef = useRef<HTMLDivElement>(); const stickersRef = useRef<HTMLDivElement>();
@ -249,7 +243,7 @@ const WebPage: FC<OwnProps & StateProps> = ({
)} )}
</div> </div>
)} )}
{photo && !isGift && !isAuction && !video && !document && ( {photo && !isGift && !isAuction && !video && (
<Photo <Photo
photo={photo} photo={photo}
isOwn={message?.isOutgoing} isOwn={message?.isOutgoing}
@ -295,7 +289,7 @@ const WebPage: FC<OwnProps & StateProps> = ({
onCancelUpload={onCancelMediaTransfer} onCancelUpload={onCancelMediaTransfer}
/> />
)} )}
{document && ( {document && !photo && (
<Document <Document
document={document} document={document}
message={message} message={message}
@ -346,10 +340,4 @@ function getIsSmallPhoto(webPage: ApiWebPageFull, mediaSize?: WebPageMediaSize)
return width === height && !webPage.hasLargeMedia; return width === height && !webPage.hasLargeMedia;
} }
export default memo(withGlobal<OwnProps>( export default memo(WebPage);
(global): Complete<StateProps> => {
return {
canPlayAnimatedEmojis: selectCanPlayAnimatedEmojis(global),
};
},
)(WebPage));

View File

@ -21,6 +21,7 @@ import {
getMessageVideo, getMessageVideo,
getMessageVoice, getMessageVoice,
getWebPageAudio, getWebPageAudio,
getWebPageDocument,
getWebPagePhoto, getWebPagePhoto,
getWebPageVideo, getWebPageVideo,
} from '../helpers'; } from '../helpers';
@ -54,12 +55,13 @@ export function selectMessageDownloadableMedia<T extends GlobalState>(global: T,
const webPage = selectWebPageFromMessage(global, message); const webPage = selectWebPageFromMessage(global, message);
return ( return (
customEmoji || animatedEmoji customEmoji || animatedEmoji
|| getMessageDocument(message)
|| getMessagePhoto(message) || getMessagePhoto(message)
|| getMessageVideo(message) || getMessageVideo(message)
|| getMessageDocument(message)
|| getMessageSticker(message) || getMessageSticker(message)
|| getMessageAudio(message) || getMessageAudio(message)
|| getMessageVoice(message) || getMessageVoice(message)
|| getWebPageDocument(webPage)
|| getWebPagePhoto(webPage) || getWebPagePhoto(webPage)
|| getWebPageVideo(webPage) || getWebPageVideo(webPage)
|| getWebPageAudio(webPage) || getWebPageAudio(webPage)