Chat, Embedded Message: Fix round video preview in dark theme (#1136)

This commit is contained in:
Alexander Zinchuk 2021-06-11 01:19:05 +03:00
parent 23529106b3
commit 32c7b083c8
5 changed files with 32 additions and 8 deletions

View File

@ -97,6 +97,10 @@
border-radius: .25rem; border-radius: .25rem;
margin-left: .25rem; margin-left: .25rem;
flex-shrink: 0; flex-shrink: 0;
&.round {
border-radius: 1rem;
}
} }
&.inside-input { &.inside-input {

View File

@ -7,6 +7,7 @@ import {
isActionMessage, isActionMessage,
getMessageSummaryText, getMessageSummaryText,
getSenderTitle, getSenderTitle,
getMessageRoundVideo,
} from '../../modules/helpers'; } from '../../modules/helpers';
import renderText from './helpers/renderText'; import renderText from './helpers/renderText';
import { getPictogramDimensions } from './helpers/mediaDimensions'; import { getPictogramDimensions } from './helpers/mediaDimensions';
@ -48,6 +49,7 @@ const EmbeddedMessage: FC<OwnProps> = ({
const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting); const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);
const pictogramId = message && `sticker-reply-thumb${message.id}`; const pictogramId = message && `sticker-reply-thumb${message.id}`;
const mediaThumbnail = useWebpThumbnail(message); const mediaThumbnail = useWebpThumbnail(message);
const isRoundVideo = Boolean(message && getMessageRoundVideo(message));
const lang = useLang(); const lang = useLang();
@ -59,7 +61,7 @@ const EmbeddedMessage: FC<OwnProps> = ({
className={buildClassName('EmbeddedMessage', className)} className={buildClassName('EmbeddedMessage', className)}
onClick={message ? onClick : undefined} onClick={message ? onClick : undefined}
> >
{mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl)} {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl, isRoundVideo)}
<div className="message-text"> <div className="message-text">
<div className="message-title">{renderText(senderTitle || title || NBSP)}</div> <div className="message-title">{renderText(senderTitle || title || NBSP)}</div>
<p> <p>
@ -80,11 +82,19 @@ function renderPictogram(
id: string | undefined, id: string | undefined,
thumbDataUri: string, thumbDataUri: string,
blobUrl?: string, blobUrl?: string,
isRoundVideo?: boolean,
) { ) {
const { width, height } = getPictogramDimensions(); const { width, height } = getPictogramDimensions();
return ( return (
<img id={id} src={blobUrl || thumbDataUri} width={width} height={height} alt="" /> <img
id={id}
src={blobUrl || thumbDataUri}
width={width}
height={height}
alt=""
className={isRoundVideo ? 'round' : ''}
/>
); );
} }

View File

@ -110,6 +110,10 @@
border-radius: .125rem; border-radius: .125rem;
vertical-align: -.25rem; vertical-align: -.25rem;
margin-right: .25rem; margin-right: .25rem;
&.round {
border-radius: .625rem;
}
} }
.emoji-small { .emoji-small {

View File

@ -26,6 +26,7 @@ import {
getMessageVideo, getMessageVideo,
getMessageSticker, getMessageSticker,
selectIsChatMuted, selectIsChatMuted,
getMessageRoundVideo,
} from '../../../modules/helpers'; } from '../../../modules/helpers';
import { import {
selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList, selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,
@ -119,6 +120,7 @@ const Chat: FC<OwnProps & StateProps & DispatchProps> = ({
? getMessageMediaThumbDataUri(lastMessage) ? getMessageMediaThumbDataUri(lastMessage)
: undefined; : undefined;
const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined); const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);
const isRoundVideo = Boolean(lastMessage && getMessageRoundVideo(lastMessage));
// Sets animation excess values when `orderDiff` changes and then resets excess values to animate. // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.
useLayoutEffect(() => { useLayoutEffect(() => {
@ -229,7 +231,7 @@ const Chat: FC<OwnProps & StateProps & DispatchProps> = ({
{senderName && ( {senderName && (
<span className="sender-name">{renderText(senderName)}</span> <span className="sender-name">{renderText(senderName)}</span>
)} )}
{renderMessageSummary(lang, lastMessage!, mediaBlobUrl || mediaThumbnail)} {renderMessageSummary(lang, lastMessage!, mediaBlobUrl || mediaThumbnail, isRoundVideo)}
</p> </p>
); );
} }
@ -284,14 +286,14 @@ const Chat: FC<OwnProps & StateProps & DispatchProps> = ({
); );
}; };
function renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string) { function renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string, isRoundVideo?: boolean) {
if (!blobUrl) { if (!blobUrl) {
return renderText(getMessageSummaryText(lang, message)); return renderText(getMessageSummaryText(lang, message));
} }
return ( return (
<span className="media-preview"> <span className="media-preview">
<img src={blobUrl} alt="" /> <img src={blobUrl} alt="" className={isRoundVideo ? 'round' : undefined} />
{getMessageVideo(message) && <i className="icon-play" />} {getMessageVideo(message) && <i className="icon-play" />}
{renderText(getMessageSummaryText(lang, message, true))} {renderText(getMessageSummaryText(lang, message, true))}
</span> </span>

View File

@ -16,6 +16,7 @@ import {
getMessageSummaryText, getMessageSummaryText,
getMessageMediaThumbDataUri, getMessageMediaThumbDataUri,
getMessageVideo, getMessageVideo,
getMessageRoundVideo,
} from '../../../modules/helpers'; } from '../../../modules/helpers';
import { selectChat, selectUser } from '../../../modules/selectors'; import { selectChat, selectUser } from '../../../modules/selectors';
import renderText from '../../common/helpers/renderText'; import renderText from '../../common/helpers/renderText';
@ -57,6 +58,7 @@ const ChatMessage: FC<OwnProps & StateProps & DispatchProps> = ({
}) => { }) => {
const mediaThumbnail = getMessageMediaThumbDataUri(message); const mediaThumbnail = getMessageMediaThumbDataUri(message);
const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro')); const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));
const isRoundVideo = Boolean(getMessageRoundVideo(message));
const handleClick = useCallback(() => { const handleClick = useCallback(() => {
focusMessage({ chatId, messageId: message.id }); focusMessage({ chatId, messageId: message.id });
@ -96,7 +98,7 @@ const ChatMessage: FC<OwnProps & StateProps & DispatchProps> = ({
</div> </div>
<div className="subtitle"> <div className="subtitle">
<div className="message"> <div className="message">
{renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery)} {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}
</div> </div>
</div> </div>
</div> </div>
@ -104,14 +106,16 @@ const ChatMessage: FC<OwnProps & StateProps & DispatchProps> = ({
); );
}; };
function renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string) { function renderMessageSummary(
lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,
) {
if (!blobUrl) { if (!blobUrl) {
return renderText(getMessageSummaryText(lang, message)); return renderText(getMessageSummaryText(lang, message));
} }
return ( return (
<span className="media-preview"> <span className="media-preview">
<img src={blobUrl} alt="" /> <img src={blobUrl} alt="" className={isRoundVideo ? 'round' : undefined} />
{getMessageVideo(message) && <i className="icon-play" />} {getMessageVideo(message) && <i className="icon-play" />}
{renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })} {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })}
</span> </span>