From 7cc64ed6bb4cb5b46edea59b691a07d78ecbd1b2 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Sun, 13 Nov 2022 17:06:25 +0400 Subject: [PATCH] More improvements for shared canvas emoji --- src/components/common/CustomEmoji.tsx | 12 +----------- src/components/common/EmbeddedMessage.scss | 6 +++--- src/components/common/EmbeddedMessage.tsx | 2 +- .../common/FullNameTitle.module.scss | 1 - src/components/common/StickerView.tsx | 11 ++++++----- src/components/left/main/Chat.scss | 4 ---- src/components/left/main/Chat.tsx | 4 ++-- .../mediaViewer/MediaViewerFooter.scss | 4 ---- src/components/middle/MiddleHeader.scss | 4 ---- src/components/middle/composer/Composer.scss | 1 - .../middle/composer/StickerSetCover.tsx | 8 ++++---- src/components/middle/message/Message.tsx | 4 ++-- .../middle/message/_message-content.scss | 1 - ...vasCoords.ts => useBoundsInSharedCanvas.ts} | 13 ++++++++++--- src/lib/rlottie/rlottie.worker.ts | 18 ++++++++++++------ src/styles/_variables.scss | 2 +- 16 files changed, 42 insertions(+), 53 deletions(-) rename src/hooks/{useSharedCanvasCoords.ts => useBoundsInSharedCanvas.ts} (80%) diff --git a/src/components/common/CustomEmoji.tsx b/src/components/common/CustomEmoji.tsx index a16398cfd..13817fe95 100644 --- a/src/components/common/CustomEmoji.tsx +++ b/src/components/common/CustomEmoji.tsx @@ -7,7 +7,6 @@ import type { FC, TeactNode } from '../../lib/teact/teact'; import type { ObserveFn } from '../../hooks/useIntersectionObserver'; import { ApiMessageEntityTypes } from '../../api/types'; -import { REM } from './helpers/mediaDimensions'; import { getPropertyHexColor } from '../../util/themeStyle'; import { hexToRgb } from '../../util/switchTheme'; import buildClassName from '../../util/buildClassName'; @@ -79,8 +78,6 @@ const CustomEmoji: FC = ({ const [customColor, setCustomColor] = useState<[number, number, number] | undefined>(); const hasCustomColor = customEmoji && selectIsDefaultEmojiStatusPack(getGlobal(), customEmoji.stickerSetInfo); - const [realSize, setRealSize] = useState(size); - useEffect(() => { if (!hasCustomColor) { setCustomColor(undefined); @@ -95,13 +92,6 @@ const CustomEmoji: FC = ({ setCustomColor([customColorRgb.r, customColorRgb.g, customColorRgb.b]); }, [hasCustomColor]); - useEffect(() => { - const computedSize = getComputedStyle(containerRef.current!).getPropertyValue('--custom-emoji-size'); - if (computedSize) { - setRealSize(Math.round(Number(computedSize.replace(/[^\d.]/g, '')) * REM)); - } - }, []); - const handleVideoEnded = useCallback((e) => { if (!loopLimit) return; @@ -154,7 +144,7 @@ const CustomEmoji: FC = ({ containerRef={containerRef} sticker={customEmoji} isSmall - size={realSize} + size={size} customColor={customColor} thumbClassName={styles.thumb} fullMediaClassName={styles.media} diff --git a/src/components/common/EmbeddedMessage.scss b/src/components/common/EmbeddedMessage.scss index 348856340..ea5b5f1b8 100644 --- a/src/components/common/EmbeddedMessage.scss +++ b/src/components/common/EmbeddedMessage.scss @@ -36,7 +36,7 @@ bottom: 0.625rem; } - img:not(.emoji) { + .pictogram { margin-inline-start: 0.5rem; } @@ -120,7 +120,7 @@ opacity: 0.75; } - img:not(.emoji) { + .pictogram { width: 2rem; height: 2rem; object-fit: cover; @@ -144,7 +144,7 @@ bottom: 0.3125rem; } - img:not(.emoji) { + .pictogram { margin-left: 0.125rem; } diff --git a/src/components/common/EmbeddedMessage.tsx b/src/components/common/EmbeddedMessage.tsx index b1ac1fbf3..cc93e8263 100644 --- a/src/components/common/EmbeddedMessage.tsx +++ b/src/components/common/EmbeddedMessage.tsx @@ -120,7 +120,7 @@ function renderPictogram( width={width} height={height} alt="" - className={isRoundVideo ? 'round' : ''} + className={buildClassName('pictogram', isRoundVideo && 'round')} draggable={!isProtected} /> {isProtected && } diff --git a/src/components/common/FullNameTitle.module.scss b/src/components/common/FullNameTitle.module.scss index d88e7c267..957253340 100644 --- a/src/components/common/FullNameTitle.module.scss +++ b/src/components/common/FullNameTitle.module.scss @@ -2,7 +2,6 @@ display: flex; align-items: center; gap: 0.25rem; - --custom-emoji-size: 1.25rem; > h3 { margin-bottom: 0; diff --git a/src/components/common/StickerView.tsx b/src/components/common/StickerView.tsx index ef1d243f6..4386d0e7c 100644 --- a/src/components/common/StickerView.tsx +++ b/src/components/common/StickerView.tsx @@ -17,7 +17,7 @@ import { useIsIntersecting } from '../../hooks/useIntersectionObserver'; import useThumbnail from '../../hooks/useThumbnail'; import useMediaTransition from '../../hooks/useMediaTransition'; import useFlag from '../../hooks/useFlag'; -import useSharedCanvasCoords from '../../hooks/useSharedCanvasCoords'; +import useBoundsInSharedCanvas from '../../hooks/useBoundsInSharedCanvas'; import AnimatedSticker from './AnimatedSticker'; import OptimizedVideo from '../ui/OptimizedVideo'; @@ -114,14 +114,15 @@ const StickerView: FC = ({ const fullMediaClassNames = useMediaTransition(isFullMediaReady); const noTransition = isLottie && preloadedPreviewData; - const sharedCanvasCoords = useSharedCanvasCoords(containerRef, sharedCanvasRef); + const bounds = useBoundsInSharedCanvas(containerRef, sharedCanvasRef); + const realSize = bounds.size || size; // Preload preview for Message Input and local message useMedia(previewMediaHash, !shouldLoad || !shouldPreloadPreview, undefined, cacheBuster); const randomIdPrefix = useMemo(() => generateIdFor(ID_STORE, true), []); const idKey = [ - (withSharedAnimation ? SHARED_PREFIX : randomIdPrefix), id, size, customColor?.join(','), + (withSharedAnimation ? SHARED_PREFIX : randomIdPrefix), id, realSize, customColor?.join(','), ].filter(Boolean).join('_'); return ( @@ -141,7 +142,7 @@ const StickerView: FC = ({ = ({ forceOnHeavyAnimation={forceOnHeavyAnimation} isLowPriority={isSmall && !selectIsAlwaysHighPriorityEmoji(getGlobal(), stickerSetInfo)} sharedCanvas={sharedCanvasRef?.current || undefined} - sharedCanvasCoords={sharedCanvasCoords} + sharedCanvasCoords={bounds.coords} onLoad={markPlayerReady} onLoop={onAnimatedStickerLoop} onEnded={onAnimatedStickerLoop} diff --git a/src/components/left/main/Chat.scss b/src/components/left/main/Chat.scss index 468fc5e38..36577cd43 100644 --- a/src/components/left/main/Chat.scss +++ b/src/components/left/main/Chat.scss @@ -175,10 +175,6 @@ vertical-align: -0.125rem; } - .custom-emoji { - --custom-emoji-size: 1.25rem; - } - .icon-play { position: relative; display: inline-block; diff --git a/src/components/left/main/Chat.tsx b/src/components/left/main/Chat.tsx index a082dfefa..21209f2fe 100644 --- a/src/components/left/main/Chat.tsx +++ b/src/components/left/main/Chat.tsx @@ -263,7 +263,7 @@ const Chat: FC = ({ const isChat = chat && (isChatChannel(chat) || lastMessage.senderId === lastMessage.chatId); return ( -

+

{renderActionMessageText( lang, lastMessage, @@ -281,7 +281,7 @@ const Chat: FC = ({ const senderName = getMessageSenderName(lang, chatId, lastMessageSender); return ( -

+

{senderName && ( <> {renderText(senderName)} diff --git a/src/components/mediaViewer/MediaViewerFooter.scss b/src/components/mediaViewer/MediaViewerFooter.scss index d2286dbbe..da84ee56a 100644 --- a/src/components/mediaViewer/MediaViewerFooter.scss +++ b/src/components/mediaViewer/MediaViewerFooter.scss @@ -73,10 +73,6 @@ vertical-align: -2px; } - .custom-emoji { - --custom-emoji-size: 1.25rem; - } - &.multiline { &::before { content: ""; diff --git a/src/components/middle/MiddleHeader.scss b/src/components/middle/MiddleHeader.scss index 93c0ad6e0..5edce8ba5 100644 --- a/src/components/middle/MiddleHeader.scss +++ b/src/components/middle/MiddleHeader.scss @@ -519,10 +519,6 @@ body.is-ios & { font-size: 0.9375rem; } - - .custom-emoji { - --custom-emoji-size: 1.25rem; - } } } diff --git a/src/components/middle/composer/Composer.scss b/src/components/middle/composer/Composer.scss index ff21f6d7a..17de952af 100644 --- a/src/components/middle/composer/Composer.scss +++ b/src/components/middle/composer/Composer.scss @@ -572,7 +572,6 @@ } .custom-emoji { - --custom-emoji-size: 1.25rem; vertical-align: text-top; } } diff --git a/src/components/middle/composer/StickerSetCover.tsx b/src/components/middle/composer/StickerSetCover.tsx index cf2349c20..667e77104 100644 --- a/src/components/middle/composer/StickerSetCover.tsx +++ b/src/components/middle/composer/StickerSetCover.tsx @@ -13,7 +13,7 @@ import buildClassName from '../../../util/buildClassName'; import { useIsIntersecting } from '../../../hooks/useIntersectionObserver'; import useMedia from '../../../hooks/useMedia'; import useMediaTransition from '../../../hooks/useMediaTransition'; -import useSharedCanvasCoords from '../../../hooks/useSharedCanvasCoords'; +import useBoundsInSharedCanvas from '../../../hooks/useBoundsInSharedCanvas'; import AnimatedSticker from '../../common/AnimatedSticker'; import OptimizedVideo from '../../ui/OptimizedVideo'; @@ -46,7 +46,7 @@ const StickerSetCover: FC = ({ const isReady = mediaData && (!isVideo || IS_WEBM_SUPPORTED); const transitionClassNames = useMediaTransition(isReady); - const sharedCanvasCoords = useSharedCanvasCoords(containerRef, sharedCanvasRef); + const bounds = useBoundsInSharedCanvas(containerRef, sharedCanvasRef); return (

@@ -55,11 +55,11 @@ const StickerSetCover: FC = ({ ) : isVideo ? ( , sharedCanvasRef?: React.RefObject, ) { const [x, setX] = useState(); const [y, setY] = useState(); + const [size, setSize] = useState(); const recalculate = useCallback(() => { const container = containerRef.current; @@ -25,8 +27,11 @@ export default function useSharedCanvasCoords( // Factor coords are used to support rendering while being rescaled (e.g. message appearance animation) setX(round((targetBounds.left - canvasBounds.left) / canvasBounds.width, 4)); setY(round((targetBounds.top - canvasBounds.top) / canvasBounds.height, 4)); + setSize(Math.round(targetBounds.width)); }, [containerRef, sharedCanvasRef]); + useLayoutEffect(recalculate, [recalculate]); + useEffect(() => { if (!('ResizeObserver' in window) || !sharedCanvasRef?.current) { return undefined; @@ -48,5 +53,7 @@ export default function useSharedCanvasCoords( }; }, [recalculate, sharedCanvasRef]); - return useMemo(() => (x !== undefined && y !== undefined ? { x, y } : undefined), [x, y]); + const coords = useMemo(() => (x !== undefined && y !== undefined ? { x, y } : undefined), [x, y]); + + return { coords, size }; } diff --git a/src/lib/rlottie/rlottie.worker.ts b/src/lib/rlottie/rlottie.worker.ts index b3abd3b35..cf36e8dbb 100644 --- a/src/lib/rlottie/rlottie.worker.ts +++ b/src/lib/rlottie/rlottie.worker.ts @@ -28,6 +28,7 @@ const rLottieApiPromise = new Promise((resolve) => { const HIGH_PRIORITY_MAX_FPS = 60; const LOW_PRIORITY_MAX_FPS = 30; +const DESTROY_REPEAT_DELAY = 1000; const renderers = new Map destroy(key, true), DESTROY_REPEAT_DELAY); + } + } } createWorkerInterface({ diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index 3fc7e8ccf..82532e487 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -184,7 +184,7 @@ $color-message-reaction-own-hover: #b5e0a4; --messages-container-width: 45.5rem; --right-column-width: 26.5rem; --header-height: 3.5rem; - --custom-emoji-size: 1.5rem; + --custom-emoji-size: 1.25rem; --symbol-menu-width: 26.25rem; --symbol-menu-height: 23.25rem;