159 lines
3.8 KiB
TypeScript
159 lines
3.8 KiB
TypeScript
import type {
|
|
ApiMessage, ApiPeer, ApiPeerPhotos, ApiSponsoredMessage,
|
|
} from '../../../api/types';
|
|
import type { GlobalState } from '../../../global/types';
|
|
import { type MediaViewerMedia, MediaViewerOrigin } from '../../../types';
|
|
|
|
import { getMessageContent, isDocumentPhoto, isDocumentVideo } from '../../../global/helpers';
|
|
import { selectWebPageFromMessage } from '../../../global/selectors';
|
|
|
|
export type MediaViewerItem = {
|
|
type: 'message';
|
|
message: ApiMessage;
|
|
mediaIndex?: number;
|
|
} | {
|
|
type: 'avatar';
|
|
avatarOwner: ApiPeer;
|
|
profilePhotos: ApiPeerPhotos;
|
|
mediaIndex: number;
|
|
} | {
|
|
type: 'standalone';
|
|
media: MediaViewerMedia[];
|
|
mediaIndex: number;
|
|
} | {
|
|
type: 'sponsoredMessage';
|
|
message: ApiSponsoredMessage;
|
|
mediaIndex?: number;
|
|
};
|
|
|
|
export type ViewableMedia = {
|
|
media: MediaViewerMedia;
|
|
isGif?: boolean;
|
|
isSingle?: boolean;
|
|
};
|
|
|
|
export function getMediaViewerItem({
|
|
message, avatarOwner, profilePhotos, standaloneMedia, mediaIndex, sponsoredMessage,
|
|
}: {
|
|
message?: ApiMessage;
|
|
avatarOwner?: ApiPeer;
|
|
profilePhotos?: ApiPeerPhotos;
|
|
standaloneMedia?: MediaViewerMedia[];
|
|
sponsoredMessage?: ApiSponsoredMessage;
|
|
mediaIndex?: number;
|
|
}): MediaViewerItem | undefined {
|
|
if (avatarOwner && profilePhotos) {
|
|
return {
|
|
type: 'avatar',
|
|
avatarOwner,
|
|
profilePhotos,
|
|
mediaIndex: mediaIndex!,
|
|
};
|
|
}
|
|
|
|
if (standaloneMedia) {
|
|
return {
|
|
type: 'standalone',
|
|
media: standaloneMedia,
|
|
mediaIndex: mediaIndex!,
|
|
};
|
|
}
|
|
|
|
if (message) {
|
|
return {
|
|
type: 'message',
|
|
message,
|
|
mediaIndex,
|
|
};
|
|
}
|
|
|
|
if (sponsoredMessage) {
|
|
return {
|
|
type: 'sponsoredMessage',
|
|
message: sponsoredMessage,
|
|
mediaIndex,
|
|
};
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
export default function selectViewableMedia(
|
|
global: GlobalState, origin?: MediaViewerOrigin, params?: MediaViewerItem,
|
|
): ViewableMedia | undefined {
|
|
if (!params) return undefined;
|
|
|
|
if (params.type === 'standalone') {
|
|
const media = params.media[params.mediaIndex];
|
|
return {
|
|
media,
|
|
isGif: media.mediaType === 'video' && media.isGif,
|
|
isSingle: params.media.length === 1,
|
|
};
|
|
}
|
|
|
|
if (params.type === 'avatar') {
|
|
const avatar = params.profilePhotos?.photos[params.mediaIndex];
|
|
if (avatar) {
|
|
return {
|
|
media: avatar,
|
|
};
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
const {
|
|
action, document, photo, video, paidMedia,
|
|
} = getMessageContent(params.message);
|
|
|
|
if (action?.type === 'chatEditPhoto' || action?.type === 'suggestProfilePhoto') {
|
|
return {
|
|
media: action.photo!,
|
|
isSingle: true,
|
|
};
|
|
}
|
|
|
|
if (document && (isDocumentPhoto(document) || isDocumentVideo(document))) {
|
|
return {
|
|
media: document,
|
|
};
|
|
}
|
|
|
|
const webPage = selectWebPageFromMessage(global, params.message);
|
|
if (webPage?.webpageType === 'full') {
|
|
const { photo: webPagePhoto, video: webPageVideo, document: webPageDocument } = webPage;
|
|
const isDocumentMedia = webPageDocument && (isDocumentPhoto(webPageDocument) || isDocumentVideo(webPageDocument));
|
|
const mediaDocument = isDocumentMedia ? webPageDocument : undefined;
|
|
const media = webPageVideo || mediaDocument || webPagePhoto;
|
|
if (media) {
|
|
return {
|
|
media,
|
|
isSingle: true,
|
|
};
|
|
}
|
|
}
|
|
|
|
if (paidMedia) {
|
|
const extendedMedia = paidMedia.extendedMedia[params.mediaIndex || 0];
|
|
if (!('mediaType' in extendedMedia)) {
|
|
const { photo: extendedPhoto, video: extendedVideo } = extendedMedia;
|
|
return {
|
|
media: (extendedPhoto || extendedVideo)!,
|
|
isGif: extendedVideo?.isGif,
|
|
};
|
|
}
|
|
}
|
|
|
|
const media = video || photo;
|
|
|
|
if (media) {
|
|
return {
|
|
media,
|
|
isGif: video?.isGif,
|
|
isSingle: video?.isGif && origin !== MediaViewerOrigin.SharedMedia,
|
|
};
|
|
}
|
|
|
|
return undefined;
|
|
}
|