feat: fix other types of messages now that there is no box around

pull/2459/head
Audric Ackermann 3 years ago
parent 7c80f9e233
commit 30e3cb8755

@ -27,7 +27,7 @@
margin: 4px 16px; margin: 4px 16px;
padding: 4px; padding: 4px;
border-radius: $border-radius-message-box; border-radius: var(--border-radius-message-box);
align-self: flex-start; align-self: flex-start;

@ -62,6 +62,17 @@
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
padding: 10px; padding: 10px;
border-radius: var(--border-radius-message-box);
.module-message__container--outgoing & {
color: var(--color-sent-message-text);
background: var(--color-sent-message-background);
}
.module-message__container--incoming & {
color: var(--color-received-message-text);
background: var(--color-received-message-background);
}
} }
.module-message__generic-attachment__icon-container { .module-message__generic-attachment__icon-container {
@ -88,7 +99,7 @@
} }
.module-message__generic-attachment__icon__extension { .module-message__generic-attachment__icon__extension {
font-size: 10px; font-size: 9px;
line-height: 13px; line-height: 13px;
letter-spacing: 0.1px; letter-spacing: 0.1px;
text-transform: uppercase; text-transform: uppercase;
@ -115,7 +126,6 @@
} }
.module-message__generic-attachment__file-name { .module-message__generic-attachment__file-name {
color: $color-gray-90;
font-size: 14px; font-size: 14px;
line-height: 18px; line-height: 18px;
font-weight: 300; font-weight: 300;
@ -127,14 +137,6 @@
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.module-message__generic-attachment__file-size,
.module-message__generic-attachment__file-name--outgoing,
.module-message__generic-attachment__file-size--incoming,
.module-message__generic-attachment__file-size--outgoing,
.module-message__generic-attachment__file-name--incoming {
color: var(--color-text);
}
.module-message__generic-attachment__file-size { .module-message__generic-attachment__file-size {
font-size: 11px; font-size: 11px;
line-height: 16px; line-height: 16px;
@ -148,7 +150,7 @@
} }
.module-message__link-preview__content { .module-message__link-preview__content {
padding: 8px; padding: 0 0 5px 0;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: flex-start; align-items: flex-start;
@ -781,20 +783,7 @@
} }
.module-image--soft-corners { .module-image--soft-corners {
border-radius: $border-radius-message-box; border-radius: var(--border-radius-message-box);
}
.module-image__border-overlay {
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
left: 0;
right: 0;
}
.module-image__border-overlay--dark {
background-color: $color-black-02;
} }
.module-image__loading-placeholder { .module-image__loading-placeholder {
@ -858,8 +847,8 @@
position: absolute; position: absolute;
top: 5px; top: 5px;
right: 5px; right: 5px;
width: 16px; width: 20px;
height: 16px; height: 20px;
z-index: 2; z-index: 2;
background-image: url('../images/x-shadow-16.svg'); background-image: url('../images/x-shadow-16.svg');
} }

@ -89,8 +89,8 @@
.module-quote-container { .module-quote-container {
margin-bottom: 5px; margin-bottom: 5px;
margin-top: 10px; margin-top: var(--margins-xs);
padding-left: 10px; min-width: 300px; // just because even with the quoted content is small it doesn't look very good
} }
.module-quote--no-click { .module-quote--no-click {

@ -323,29 +323,18 @@ textarea {
margin-inline-start: auto; margin-inline-start: auto;
} }
pre {
backdrop-filter: brightness(0.8);
padding: $session-margin-xs;
}
.module-message__container { .module-message__container {
position: relative; position: relative;
display: inline-block; display: inline-block;
overflow: hidden; overflow: hidden;
min-width: 30px; min-width: 30px;
// To limit messages with things forcing them wider, like long attachment names // To limit messages with things forcing them wider, like long attachment names
max-width: calc(100vw - 380px - 100px); max-width: calc(100vw - 380px - 50px);
align-items: center; align-items: center;
} }
label { label {
user-select: none; user-select: none;
} }
.module-message__attachment-container {
// Entirely to ensure that images are centered if they aren't full width of bubble
text-align: center;
position: relative;
overflow: hidden;
}
.conversation-header { .conversation-header {
.module-avatar img { .module-avatar img {

@ -239,6 +239,3 @@ $session-transition-duration: 0.25s;
// ////////////////////////////////////////////// // //////////////////////////////////////////////
$composition-container-height: 60px; $composition-container-height: 60px;
$padding-message-content: 7px 13px; // FIXME to move to SessionTheme
$border-radius-message-box: 16px; // FIXME to move to SessionTheme

@ -349,8 +349,8 @@ $rhap_font-family: inherit !default;
background-color: transparent; background-color: transparent;
box-shadow: none; box-shadow: none;
background: var(--color-accent); background: var(--color-accent);
padding: $padding-message-content; padding: var(--padding-message-content);
border-radius: $border-radius-message-box; border-radius: var(--border-radius-message-box);
svg { svg {
transition: fill $session-transition-duration; transition: fill $session-transition-duration;

@ -27,7 +27,11 @@
display: inline-flex; display: inline-flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
max-width: 95%;
@media (min-width: 1200px) {
max-width: 65%; max-width: 65%;
}
&__text-error { &__text-error {
font-style: italic; font-style: italic;
@ -42,8 +46,8 @@
word-break: break-word; word-break: break-word;
white-space: pre-wrap; white-space: pre-wrap;
padding: $padding-message-content; padding: var(--padding-message-content);
border-radius: $border-radius-message-box; border-radius: var(--border-radius-message-box);
a { a {
text-decoration: underline; text-decoration: underline;

@ -5,6 +5,7 @@ import { Spinner } from '../basic/Spinner';
import { AttachmentType, AttachmentTypeWithPath } from '../../types/Attachment'; import { AttachmentType, AttachmentTypeWithPath } from '../../types/Attachment';
import { useEncryptedFileFetch } from '../../hooks/useEncryptedFileFetch'; import { useEncryptedFileFetch } from '../../hooks/useEncryptedFileFetch';
import { useDisableDrag } from '../../hooks/useDisableDrag'; import { useDisableDrag } from '../../hooks/useDisableDrag';
import styled from 'styled-components';
type Props = { type Props = {
alt: string; alt: string;
@ -20,7 +21,7 @@ type Props = {
darkOverlay?: boolean; darkOverlay?: boolean;
playIconOverlay?: boolean; playIconOverlay?: boolean;
softCorners?: boolean; softCorners: boolean;
forceSquare?: boolean; forceSquare?: boolean;
attachmentIndex?: number; attachmentIndex?: number;
@ -29,6 +30,16 @@ type Props = {
onError?: () => void; onError?: () => void;
}; };
const StyledOverlay = styled.div<Pick<Props, 'darkOverlay' | 'softCorners'>>`
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
left: 0;
right: 0;
background-color: ${props => (props.darkOverlay ? '#0008' : 'unset')};
`;
export const Image = (props: Props) => { export const Image = (props: Props) => {
// tslint:disable-next-line max-func-body-length cyclomatic-complexity // tslint:disable-next-line max-func-body-length cyclomatic-complexity
const { const {
@ -133,12 +144,10 @@ export const Image = (props: Props) => {
onDragStart={disableDrag} onDragStart={disableDrag}
/> />
) : null} ) : null}
<div <StyledOverlay
className={classNames( className={classNames(softCorners ? 'module-image--soft-corners' : null)}
'module-image__border-overlay', darkOverlay={darkOverlay}
softCorners ? 'module-image--soft-corners' : null, softCorners={softCorners}
darkOverlay ? 'module-image__border-overlay--dark' : null
)}
/> />
{closeButton ? ( {closeButton ? (
<div <div

@ -92,6 +92,7 @@ export const SessionQuotedMessageComposition = () => {
height={100} height={100}
width={100} width={100}
url={firstImageAttachment.thumbnail.objectUrl} url={firstImageAttachment.thumbnail.objectUrl}
softCorners={false}
/> />
)} )}

@ -11,6 +11,10 @@ const StyledTrustSenderUI = styled.div`
padding-inline: var(--margins-sm); padding-inline: var(--margins-sm);
display: flex; display: flex;
align-items: center; align-items: center;
width: fit-content;
border-radius: var(--border-radius-message-box);
background: var(--color-received-message-background);
`; `;
const ClickToDownload = styled.div` const ClickToDownload = styled.div`

@ -1,9 +1,8 @@
import classNames from 'classnames';
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { clone } from 'lodash'; import { clone } from 'lodash';
import { Data } from '../../../../data/data'; import { Data } from '../../../../data/data';
import { MessageRenderingProps } from '../../../../models/messageType'; import { MessageModelType, MessageRenderingProps } from '../../../../models/messageType';
import { import {
PropsForAttachment, PropsForAttachment,
showLightBox, showLightBox,
@ -30,6 +29,7 @@ import { AudioPlayerWithEncryptedFile } from '../../H5AudioPlayer';
import { ImageGrid } from '../../ImageGrid'; import { ImageGrid } from '../../ImageGrid';
import { LightBoxOptions } from '../../SessionConversation'; import { LightBoxOptions } from '../../SessionConversation';
import { ClickToTrustSender } from './ClickToTrustSender'; import { ClickToTrustSender } from './ClickToTrustSender';
import styled from 'styled-components';
export type MessageAttachmentSelectorProps = Pick< export type MessageAttachmentSelectorProps = Pick<
MessageRenderingProps, MessageRenderingProps,
@ -50,6 +50,14 @@ type Props = {
}; };
// tslint:disable: use-simple-attributes // tslint:disable: use-simple-attributes
const StyledAttachmentContainer = styled.div<{ messageDirection: MessageModelType }>`
text-align: center;
position: relative;
overflow: hidden;
display: flex;
justify-content: ${props => (props.messageDirection === 'incoming' ? 'flex-start' : 'flex-end')};
`;
// tslint:disable-next-line max-func-body-length cyclomatic-complexity // tslint:disable-next-line max-func-body-length cyclomatic-complexity
export const MessageAttachment = (props: Props) => { export const MessageAttachment = (props: Props) => {
const { messageId, imageBroken, handleImageError } = props; const { messageId, imageBroken, handleImageError } = props;
@ -121,15 +129,16 @@ export const MessageAttachment = (props: Props) => {
(isVideo(attachments) && hasVideoScreenshot(attachments))) (isVideo(attachments) && hasVideoScreenshot(attachments)))
) { ) {
return ( return (
<div className={classNames('module-message__attachment-container')}> <StyledAttachmentContainer messageDirection={direction}>
<ImageGrid <ImageGrid
attachments={attachments} attachments={attachments}
onError={handleImageError} onError={handleImageError}
onClickAttachment={onClickOnImageGrid} onClickAttachment={onClickOnImageGrid}
/> />
</div> </StyledAttachmentContainer>
); );
} else if (!firstAttachment.pending && !firstAttachment.error && isAudio(attachments)) { }
if (!firstAttachment.pending && !firstAttachment.error && isAudio(attachments)) {
return ( return (
<div <div
role="main" role="main"
@ -149,12 +158,12 @@ export const MessageAttachment = (props: Props) => {
/> />
</div> </div>
); );
} else { }
const { pending, fileName, fileSize, contentType } = firstAttachment; const { pending, fileName, fileSize, contentType } = firstAttachment;
const extension = getExtensionForDisplay({ contentType, fileName }); const extension = getExtensionForDisplay({ contentType, fileName });
return ( return (
<div className={classNames('module-message__generic-attachment')}> <div className="module-message__generic-attachment">
{pending ? ( {pending ? (
<div className="module-message__generic-attachment__spinner-container"> <div className="module-message__generic-attachment__spinner-container">
<Spinner size="small" /> <Spinner size="small" />
@ -167,34 +176,17 @@ export const MessageAttachment = (props: Props) => {
onClick={onClickOnGenericAttachment} onClick={onClickOnGenericAttachment}
> >
{extension ? ( {extension ? (
<div className="module-message__generic-attachment__icon__extension"> <div className="module-message__generic-attachment__icon__extension">{extension}</div>
{extension}
</div>
) : null} ) : null}
</div> </div>
</div> </div>
)} )}
<div className="module-message__generic-attachment__text"> <div className="module-message__generic-attachment__text">
<div <div className="module-message__generic-attachment__file-name">{fileName}</div>
className={classNames( <div className="module-message__generic-attachment__file-size">{fileSize}</div>
'module-message__generic-attachment__file-name',
`module-message__generic-attachment__file-name--${direction}`
)}
>
{fileName}
</div>
<div
className={classNames(
'module-message__generic-attachment__file-size',
`module-message__generic-attachment__file-size--${direction}`
)}
>
{fileSize}
</div>
</div> </div>
</div> </div>
); );
}
}; };
function attachmentIsAttachmentTypeWithPath(attac: any): attac is AttachmentTypeWithPath { function attachmentIsAttachmentTypeWithPath(attac: any): attac is AttachmentTypeWithPath {

@ -9,6 +9,7 @@ import { AddNewLines } from '../../AddNewLines';
import { Emojify } from '../../Emojify'; import { Emojify } from '../../Emojify';
import { LinkPreviews } from '../../../../util/linkPreviews'; import { LinkPreviews } from '../../../../util/linkPreviews';
import { showLinkVisitWarningDialog } from '../../../dialog/SessionConfirm'; import { showLinkVisitWarningDialog } from '../../../dialog/SessionConfirm';
import styled from 'styled-components';
const linkify = LinkifyIt(); const linkify = LinkifyIt();
@ -88,6 +89,12 @@ const JsxSelectable = (jsx: JSX.Element): JSX.Element => {
); );
}; };
const StyledPre = styled.pre`
backdrop-filter: brightness(0.8);
padding: var(--margins-xs);
user-select: text;
`;
export const MessageBody = (props: Props) => { export const MessageBody = (props: Props) => {
const { text, disableJumbomoji, disableLinks, isGroup } = props; const { text, disableJumbomoji, disableLinks, isGroup } = props;
const sizeClass: SizeClassType = disableJumbomoji ? 'default' : getEmojiSizeClass(text); const sizeClass: SizeClassType = disableJumbomoji ? 'default' : getEmojiSizeClass(text);
@ -105,7 +112,7 @@ export const MessageBody = (props: Props) => {
} }
if (text && text.startsWith('```') && text.endsWith('```') && text.length > 6) { if (text && text.startsWith('```') && text.endsWith('```') && text.length > 6) {
return <pre className="text-selectable">{text.substring(4, text.length - 3)}</pre>; return <StyledPre>{text.substring(4, text.length - 3)}</StyledPre>;
} }
return JsxSelectable( return JsxSelectable(

@ -48,6 +48,8 @@ const StyledMessageOpaqueContent = styled.div<{ messageDirection: MessageModelTy
props.messageDirection === 'incoming' props.messageDirection === 'incoming'
? 'var(--color-received-message-background)' ? 'var(--color-received-message-background)'
: 'var(--color-sent-message-background)'}; : 'var(--color-sent-message-background)'};
align-self: ${props => (props.messageDirection === 'incoming' ? 'flex-start' : 'flex-end')};
padding: 7px 13px; // FIXME padding: 7px 13px; // FIXME
border-radius: 16px; //FIXME border-radius: 16px; //FIXME
`; `;
@ -142,6 +144,11 @@ export const MessageContent = (props: Props) => {
threshold={0} threshold={0}
rootMargin="500px 0px 500px 0px" rootMargin="500px 0px 500px 0px"
triggerOnce={false} triggerOnce={false}
style={{
display: 'flex',
flexDirection: 'column',
gap: 'var(--margins-xs)',
}}
> >
<IsMessageVisibleContext.Provider value={isMessageVisible}> <IsMessageVisibleContext.Provider value={isMessageVisible}>
{hasContentAfterAttachmentAndQuote ? ( {hasContentAfterAttachmentAndQuote ? (

@ -20,8 +20,8 @@ import { MessageStatus } from './MessageStatus';
export type MessageContentWithStatusSelectorProps = Pick< export type MessageContentWithStatusSelectorProps = Pick<
MessageRenderingProps, MessageRenderingProps,
'direction' | 'isDeleted' | 'isTrustedForAttachmentDownload' 'direction' | 'isDeleted'
> & { hasAttachments: boolean }; >;
type Props = { type Props = {
messageId: string; messageId: string;
@ -87,7 +87,7 @@ export const MessageContentWithStatuses = (props: Props) => {
if (!contentProps) { if (!contentProps) {
return null; return null;
} }
const { direction, isDeleted, hasAttachments, isTrustedForAttachmentDownload } = contentProps; const { direction, isDeleted } = contentProps;
const isIncoming = direction === 'incoming'; const isIncoming = direction === 'incoming';
const [popupReaction, setPopupReaction] = useState(''); const [popupReaction, setPopupReaction] = useState('');
@ -112,9 +112,6 @@ export const MessageContentWithStatuses = (props: Props) => {
role="button" role="button"
onClick={onClickOnMessageOuterContainer} onClick={onClickOnMessageOuterContainer}
onDoubleClickCapture={onDoubleClickReplyToMessage} onDoubleClickCapture={onDoubleClickReplyToMessage}
style={{
width: hasAttachments && isTrustedForAttachmentDownload ? 'min-content' : 'auto',
}}
data-testid={dataTestId} data-testid={dataTestId}
> >
<MessageStatus <MessageStatus

@ -334,10 +334,16 @@ export const SessionGlobalStyles = createGlobalStyle`
--margins-md: 15px; --margins-md: 15px;
--margins-lg: 20px; --margins-lg: 20px;
/* PADDING */
--padding-message-content: 7px 13px;
--border-radius-message-box: 16px;
/* ANIMATIONS */ /* ANIMATIONS */
--default-duration: '0.25s'; --default-duration: '0.25s';
/* FILTERS */ /* FILTERS */
--filter-session-text: ${lightFilterSessionText}; --filter-session-text: ${lightFilterSessionText};
/* BORDERS */ /* BORDERS */
--border-unread: ${lightUnreadBorder}; --border-unread: ${lightUnreadBorder};
--border-session: ${lightColorSessionBorder}; --border-session: ${lightColorSessionBorder};
@ -348,6 +354,7 @@ export const SessionGlobalStyles = createGlobalStyle`
/* COLORS NOT CHANGING BETWEEN THEMES */ /* COLORS NOT CHANGING BETWEEN THEMES */
--color-warning: ${warning}; --color-warning: ${warning};
--color-destructive: ${destructive}; --color-destructive: ${destructive};
/* COLORS */ /* COLORS */
--color-accent: ${lightColorAccent}; --color-accent: ${lightColorAccent};
--color-accent-button: ${lightColorAccentButton}; --color-accent-button: ${lightColorAccentButton};
@ -360,7 +367,6 @@ export const SessionGlobalStyles = createGlobalStyle`
--color-session-shadow: ${lightColorSessionShadow}; --color-session-shadow: ${lightColorSessionShadow};
--color-compose-view-button-background: ${lightColorComposeViewBg}; --color-compose-view-button-background: ${lightColorComposeViewBg};
--color-sent-message-background: ${lightColorSentMessageBg}; --color-sent-message-background: ${lightColorSentMessageBg};
// TODO: this might be wrong text colour. Something happened during merge.
--color-sent-message-text: ${black}; --color-sent-message-text: ${black};
--color-clickable-hovered: ${lightColorClickableHovered}; --color-clickable-hovered: ${lightColorClickableHovered};
--color-session-border: ${lightColorSessionBorderColor}; --color-session-border: ${lightColorSessionBorderColor};

@ -1111,8 +1111,7 @@ export const getMessageContentWithStatusesSelectorProps = createSelector(
} }
const msgProps: MessageContentWithStatusSelectorProps = { const msgProps: MessageContentWithStatusSelectorProps = {
hasAttachments: Boolean(props.propsForMessage.attachments?.length) || false, ...pick(props.propsForMessage, ['direction', 'isDeleted']),
...pick(props.propsForMessage, ['direction', 'isDeleted', 'isTrustedForAttachmentDownload']),
}; };
return msgProps; return msgProps;

Loading…
Cancel
Save