diff --git a/src/components/common/Document.tsx b/src/components/common/Document.tsx index 892e9dbba..871323aad 100644 --- a/src/components/common/Document.tsx +++ b/src/components/common/Document.tsx @@ -6,6 +6,7 @@ import { getActions } from '../../global'; import type { ApiDocument, ApiMessage } from '../../api/types'; import type { ObserveFn } from '../../hooks/useIntersectionObserver'; +import { SVG_EXTENSIONS } from '../../config'; import { getDocumentMediaHash, getMediaFormat, @@ -52,7 +53,6 @@ type OwnProps = { }); const BYTES_PER_MB = 1024 * 1024; -const SVG_EXTENSIONS = new Set(['svg', 'svgz']); const Document = ({ document, diff --git a/src/components/middle/MessageSelectToolbar.tsx b/src/components/middle/MessageSelectToolbar.tsx index d74bf89ac..3fba82e27 100644 --- a/src/components/middle/MessageSelectToolbar.tsx +++ b/src/components/middle/MessageSelectToolbar.tsx @@ -12,6 +12,7 @@ import { selectCanForwardMessages, selectCanReportSelectedMessages, selectCurrentChat, selectCurrentMessageList, selectHasProtectedMessage, + selectHasSvg, selectSelectedMessagesCount, selectTabState, } from '../../global/selectors'; @@ -50,6 +51,7 @@ type StateProps = { isAnyModalOpen?: boolean; selectedMessageIds?: number[]; shouldWarnAboutSvg?: boolean; + hasSvgs?: boolean; }; const MessageSelectToolbar: FC = ({ @@ -67,6 +69,7 @@ const MessageSelectToolbar: FC = ({ isAnyModalOpen, selectedMessageIds, shouldWarnAboutSvg, + hasSvgs, }) => { const { exitMessageSelectMode, @@ -125,7 +128,7 @@ const MessageSelectToolbar: FC = ({ }); const handleMessageDownload = useLastCallback(() => { - if (shouldWarnAboutSvg) { + if (shouldWarnAboutSvg && hasSvgs) { openSvgDialog(); return; } @@ -134,7 +137,7 @@ const MessageSelectToolbar: FC = ({ }); const handleSvgConfirm = useLastCallback(() => { - setSharedSettingOption({ shouldWarnAboutSvg: false }); + setSharedSettingOption({ shouldWarnAboutSvg: !shouldNotWarnAboutSvg }); closeSvgDialog(); handleDownload(); }); @@ -250,6 +253,7 @@ export default memo(withGlobal( const { messageIds: selectedMessageIds } = tabState.selectedMessages || {}; const hasProtectedMessage = chatId ? selectHasProtectedMessage(global, chatId, selectedMessageIds) : false; const canForward = !isSchedule && chatId ? selectCanForwardMessages(global, chatId, selectedMessageIds) : false; + const hasSvgs = selectedMessageIds && chatId ? selectHasSvg(global, chatId, selectedMessageIds) : false; const isShareMessageModalOpen = tabState.isShareMessageModalShown; const isAnyModalOpen = Boolean(isShareMessageModalOpen || tabState.requestedDraft || tabState.requestedAttachBotInChat || tabState.requestedAttachBotInstall || tabState.reportModal @@ -267,6 +271,7 @@ export default memo(withGlobal( hasProtectedMessage, isAnyModalOpen, shouldWarnAboutSvg, + hasSvgs, }; }, )(MessageSelectToolbar)); diff --git a/src/config.ts b/src/config.ts index f5b942e95..ed3d985aa 100644 --- a/src/config.ts +++ b/src/config.ts @@ -257,6 +257,7 @@ export const BIRTHDAY_NUMBERS_SET = 'FestiveFontEmoji'; export const RESTRICTED_EMOJI_SET = 'RestrictedEmoji'; export const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; +export const SVG_EXTENSIONS = new Set(['svg', 'svgz']); export const VIDEO_WEBM_TYPE = 'video/webm'; export const GIF_MIME_TYPE = 'image/gif'; diff --git a/src/global/selectors/messages.ts b/src/global/selectors/messages.ts index 87dc5ac1c..c7cefce6f 100644 --- a/src/global/selectors/messages.ts +++ b/src/global/selectors/messages.ts @@ -23,6 +23,7 @@ import { ApiMessageEntityTypes, MAIN_THREAD_ID } from '../../api/types'; import { ANONYMOUS_USER_ID, API_GENERAL_ID_LIMIT, GENERAL_TOPIC_ID, SERVICE_NOTIFICATIONS_USER_ID, + SVG_EXTENSIONS, } from '../../config'; import { IS_TRANSLATION_SUPPORTED } from '../../util/browser/windowEnvironment'; import { isUserId } from '../../util/entities/ids'; @@ -31,6 +32,7 @@ import { findLast } from '../../util/iteratees'; import { getMessageKey, isLocalMessageId } from '../../util/keys/messageKey'; import { MEMO_EMPTY_ARRAY } from '../../util/memo'; import { getServerTime } from '../../util/serverTime'; +import { getDocumentExtension } from '../../components/common/helpers/documentInfo'; import { canSendReaction, getAllowedAttachmentOptions, @@ -1270,6 +1272,24 @@ export function selectCanForwardMessages(global: T, chatI && (message.isForwardingAllowed || isServiceNotificationMessage(message))); } +export function selectHasSvg(global: T, chatId: string, messageIds: number[]) { + const messages = selectChatMessages(global, chatId); + + return messageIds + .map((id) => messages[id]) + .some((message) => { + if (!message) return false; + + const document = getMessageDocument(message); + if (!document) return false; + + const extension = getDocumentExtension(document); + if (!extension) return false; + + return SVG_EXTENSIONS.has(extension); + }); +} + export function selectSponsoredMessage(global: T, chatId: string) { const message = global.messages.sponsoredByChatId[chatId];