Peer Color Wrapper: Reuse in specific message type (#5640)
This commit is contained in:
parent
9c202d571c
commit
9f5319b770
@ -10,6 +10,8 @@
|
|||||||
background-color: var(--accent-background-color);
|
background-color: var(--accent-background-color);
|
||||||
color: var(--accent-color);
|
color: var(--accent-color);
|
||||||
|
|
||||||
|
--peer-color-wrapper-bar-color: var(--bar-gradient, var(--accent-color));
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: "";
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
@ -18,6 +20,6 @@
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
inset-inline-start: 0;
|
inset-inline-start: 0;
|
||||||
width: 0.1875rem;
|
width: 0.1875rem;
|
||||||
background: var(--bar-gradient, var(--accent-color));
|
background: var(--peer-color-wrapper-bar-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,25 +10,29 @@ import EmojiIconBackground from './embedded/EmojiIconBackground';
|
|||||||
import styles from './PeerColorWrapper.module.scss';
|
import styles from './PeerColorWrapper.module.scss';
|
||||||
|
|
||||||
interface OwnProps extends React.HTMLAttributes<HTMLDivElement> {
|
interface OwnProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||||
|
ref?: React.RefObject<HTMLDivElement>;
|
||||||
peer?: ApiPeer;
|
peer?: ApiPeer;
|
||||||
peerColor?: ApiPeerColor;
|
peerColor?: ApiPeerColor;
|
||||||
noUserColors?: boolean;
|
noUserColors?: boolean;
|
||||||
shoudReset?: boolean;
|
shouldReset?: boolean;
|
||||||
className?: string;
|
className?: string;
|
||||||
emojiIconClassName?: string;
|
emojiIconClassName?: string;
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
function PeerColorWrapper({
|
function PeerColorWrapper({
|
||||||
peer, peerColor, noUserColors, shoudReset, className, emojiIconClassName, children, ...otherProps
|
peer, ref, peerColor, noUserColors,
|
||||||
|
shouldReset, className, emojiIconClassName,
|
||||||
|
children, ...otherProps
|
||||||
}: OwnProps) {
|
}: OwnProps) {
|
||||||
const color = peerColor || peer?.color;
|
const color = peerColor || peer?.color;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
ref={ref}
|
||||||
className={buildClassName(
|
className={buildClassName(
|
||||||
styles.root,
|
styles.root,
|
||||||
peer && getPeerColorClass(peer, noUserColors, shoudReset),
|
peer && getPeerColorClass(peer, noUserColors, shouldReset),
|
||||||
peerColor && getApiPeerColorClass(peerColor),
|
peerColor && getApiPeerColorClass(peerColor),
|
||||||
className,
|
className,
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -1,23 +1,13 @@
|
|||||||
.CodeBlock {
|
.CodeBlock {
|
||||||
background-color: var(--color-code-bg);
|
background-color: var(--color-code-bg);
|
||||||
|
color: var(--color-text);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0.1875rem 0.375rem 0.1875rem 0.6875rem;
|
padding-block: 0.1875rem;
|
||||||
margin-block: 0.25rem;
|
margin-block: 0.25rem;
|
||||||
border-radius: 0.25rem;
|
border-radius: 0.25rem;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
&::before {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
inset-inline-start: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: 0.1875rem;
|
|
||||||
background: var(--bar-gradient, var(--accent-color));
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-title {
|
.code-title {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import { getPrettyCodeLanguageName } from '../../../util/prettyCodeLanguageNames
|
|||||||
|
|
||||||
import useAsync from '../../../hooks/useAsync';
|
import useAsync from '../../../hooks/useAsync';
|
||||||
|
|
||||||
|
import PeerColorWrapper from '../PeerColorWrapper';
|
||||||
import CodeOverlay from './CodeOverlay';
|
import CodeOverlay from './CodeOverlay';
|
||||||
|
|
||||||
import './CodeBlock.scss';
|
import './CodeBlock.scss';
|
||||||
@ -37,7 +38,9 @@ const CodeBlock: FC<OwnProps> = ({ text, language, noCopy }) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="CodeBlock">
|
<PeerColorWrapper
|
||||||
|
className="CodeBlock"
|
||||||
|
>
|
||||||
{language && (<p className="code-title">{getPrettyCodeLanguageName(language)}</p>)}
|
{language && (<p className="code-title">{getPrettyCodeLanguageName(language)}</p>)}
|
||||||
<pre className={blockClass} data-entity-type={ApiMessageEntityTypes.Pre} data-language={language}>
|
<pre className={blockClass} data-entity-type={ApiMessageEntityTypes.Pre} data-language={language}>
|
||||||
{highlighted ?? text}
|
{highlighted ?? text}
|
||||||
@ -48,7 +51,7 @@ const CodeBlock: FC<OwnProps> = ({ text, language, noCopy }) => {
|
|||||||
noCopy={noCopy}
|
noCopy={noCopy}
|
||||||
/>
|
/>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</PeerColorWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -5,13 +5,14 @@
|
|||||||
.EmbeddedMessage {
|
.EmbeddedMessage {
|
||||||
--hover-opacity: 0;
|
--hover-opacity: 0;
|
||||||
--hover-background-color: white;
|
--hover-background-color: white;
|
||||||
|
color: var(--color-text);
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: calc(var(--message-text-size, 1rem) - 0.125rem);
|
font-size: calc(var(--message-text-size, 1rem) - 0.125rem);
|
||||||
line-height: 1.125rem;
|
line-height: 1.125rem;
|
||||||
margin-bottom: 0.0625rem;
|
margin-bottom: 0.0625rem;
|
||||||
padding: 0.1875rem 0.375rem 0.1875rem 0.1875rem;
|
padding-block: 0.1875rem;
|
||||||
border-radius: var(--border-radius-messages-small);
|
border-radius: var(--border-radius-messages-small);
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@ -61,6 +62,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.custom-shape & {
|
.custom-shape & {
|
||||||
|
--peer-color-wrapper-bar-color: var(--accent-color);
|
||||||
--accent-color: white;
|
--accent-color: white;
|
||||||
max-width: 15rem;
|
max-width: 15rem;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -73,21 +75,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&::before {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
inset-inline-start: 0;
|
|
||||||
width: 3px;
|
|
||||||
background: var(--bar-gradient, var(--accent-color));
|
|
||||||
|
|
||||||
.custom-shape & {
|
|
||||||
background: var(--accent-color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.is-quote {
|
&.is-quote {
|
||||||
.message-title {
|
.message-title {
|
||||||
padding-inline-end: 0.75rem;
|
padding-inline-end: 0.75rem;
|
||||||
@ -111,12 +98,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.with-thumb {
|
&.with-thumb {
|
||||||
|
padding-inline-start: 0.5rem;
|
||||||
.message-title {
|
.message-title {
|
||||||
padding-inline-start: 2.25rem;
|
padding-inline-start: 2.375rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.embedded-text-wrapper {
|
.embedded-text-wrapper {
|
||||||
text-indent: 2.25rem;
|
text-indent: 2.375rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +125,6 @@
|
|||||||
|
|
||||||
.message-text {
|
.message-text {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin-inline-start: 0.5rem;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
|
|
||||||
@ -201,11 +188,9 @@
|
|||||||
.embedded-thumb {
|
.embedded-thumb {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0.375rem;
|
top: 0.375rem;
|
||||||
inset-inline-start: 0.375rem;
|
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
height: 2rem;
|
height: 2rem;
|
||||||
border-radius: 0.25rem;
|
border-radius: 0.25rem;
|
||||||
margin-left: 0.25rem;
|
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@ -226,12 +211,7 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
border-radius: 0.25rem;
|
border-radius: 0.25rem;
|
||||||
|
|
||||||
.embedded-thumb {
|
|
||||||
margin-left: 0.125rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message-text {
|
.message-text {
|
||||||
margin-inline-start: 0.375rem;
|
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,6 @@ import { getMediaContentTypeDescription } from '../../../global/helpers/messageS
|
|||||||
import buildClassName from '../../../util/buildClassName';
|
import buildClassName from '../../../util/buildClassName';
|
||||||
import freezeWhenClosed from '../../../util/hoc/freezeWhenClosed';
|
import freezeWhenClosed from '../../../util/hoc/freezeWhenClosed';
|
||||||
import { getPictogramDimensions } from '../helpers/mediaDimensions';
|
import { getPictogramDimensions } from '../helpers/mediaDimensions';
|
||||||
import { getPeerColorClass } from '../helpers/peerColor';
|
|
||||||
import renderText from '../helpers/renderText';
|
import renderText from '../helpers/renderText';
|
||||||
import { renderTextWithEntities } from '../helpers/renderTextWithEntities';
|
import { renderTextWithEntities } from '../helpers/renderTextWithEntities';
|
||||||
|
|
||||||
@ -41,7 +40,7 @@ import RippleEffect from '../../ui/RippleEffect';
|
|||||||
import Icon from '../icons/Icon';
|
import Icon from '../icons/Icon';
|
||||||
import MediaSpoiler from '../MediaSpoiler';
|
import MediaSpoiler from '../MediaSpoiler';
|
||||||
import MessageSummary from '../MessageSummary';
|
import MessageSummary from '../MessageSummary';
|
||||||
import EmojiIconBackground from './EmojiIconBackground';
|
import PeerColorWrapper from '../PeerColorWrapper';
|
||||||
|
|
||||||
import './EmbeddedMessage.scss';
|
import './EmbeddedMessage.scss';
|
||||||
|
|
||||||
@ -223,12 +222,15 @@ const EmbeddedMessage: FC<OwnProps> = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<PeerColorWrapper
|
||||||
|
peer={sender}
|
||||||
|
emojiIconClassName=' className="EmbeddedMessage--background-icons"'
|
||||||
ref={ref}
|
ref={ref}
|
||||||
|
shouldReset
|
||||||
|
noUserColors={noUserColors}
|
||||||
className={buildClassName(
|
className={buildClassName(
|
||||||
'EmbeddedMessage',
|
'EmbeddedMessage',
|
||||||
className,
|
className,
|
||||||
getPeerColorClass(sender, noUserColors, true),
|
|
||||||
isQuote && 'is-quote',
|
isQuote && 'is-quote',
|
||||||
mediaThumbnail && 'with-thumb',
|
mediaThumbnail && 'with-thumb',
|
||||||
)}
|
)}
|
||||||
@ -241,12 +243,6 @@ const EmbeddedMessage: FC<OwnProps> = ({
|
|||||||
{mediaThumbnail && renderPictogram(
|
{mediaThumbnail && renderPictogram(
|
||||||
mediaThumbnail, mediaBlobUrl, isVideoThumbnail, isRoundVideo, isProtected, isSpoiler,
|
mediaThumbnail, mediaBlobUrl, isVideoThumbnail, isRoundVideo, isProtected, isSpoiler,
|
||||||
)}
|
)}
|
||||||
{sender?.color?.backgroundEmojiId && (
|
|
||||||
<EmojiIconBackground
|
|
||||||
emojiDocumentId={sender.color.backgroundEmojiId}
|
|
||||||
className="EmbeddedMessage--background-icons"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<div className="message-text">
|
<div className="message-text">
|
||||||
<p className={buildClassName('embedded-text-wrapper', isQuote && 'multiline')}>
|
<p className={buildClassName('embedded-text-wrapper', isQuote && 'multiline')}>
|
||||||
{renderTextContent()}
|
{renderTextContent()}
|
||||||
@ -261,7 +257,7 @@ const EmbeddedMessage: FC<OwnProps> = ({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</PeerColorWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import {
|
|||||||
} from '../../../global/helpers';
|
} from '../../../global/helpers';
|
||||||
import buildClassName from '../../../util/buildClassName';
|
import buildClassName from '../../../util/buildClassName';
|
||||||
import { getPictogramDimensions } from '../helpers/mediaDimensions';
|
import { getPictogramDimensions } from '../helpers/mediaDimensions';
|
||||||
import { getPeerColorClass } from '../helpers/peerColor';
|
|
||||||
import renderText from '../helpers/renderText';
|
import renderText from '../helpers/renderText';
|
||||||
|
|
||||||
import { useFastClick } from '../../../hooks/useFastClick';
|
import { useFastClick } from '../../../hooks/useFastClick';
|
||||||
@ -21,6 +20,7 @@ import useMedia from '../../../hooks/useMedia';
|
|||||||
import useOldLang from '../../../hooks/useOldLang';
|
import useOldLang from '../../../hooks/useOldLang';
|
||||||
|
|
||||||
import Icon from '../icons/Icon';
|
import Icon from '../icons/Icon';
|
||||||
|
import PeerColorWrapper from '../PeerColorWrapper';
|
||||||
|
|
||||||
import './EmbeddedMessage.scss';
|
import './EmbeddedMessage.scss';
|
||||||
|
|
||||||
@ -73,11 +73,13 @@ const EmbeddedStory: FC<OwnProps> = ({
|
|||||||
const { handleClick, handleMouseDown } = useFastClick(handleFastClick);
|
const { handleClick, handleMouseDown } = useFastClick(handleFastClick);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<PeerColorWrapper
|
||||||
ref={ref}
|
ref={ref}
|
||||||
|
peerColor={sender?.color}
|
||||||
|
noUserColors={noUserColors}
|
||||||
|
shouldReset
|
||||||
className={buildClassName(
|
className={buildClassName(
|
||||||
'EmbeddedMessage',
|
'EmbeddedMessage',
|
||||||
getPeerColorClass(sender, noUserColors, true),
|
|
||||||
pictogramUrl && 'with-thumb',
|
pictogramUrl && 'with-thumb',
|
||||||
)}
|
)}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
@ -96,7 +98,7 @@ const EmbeddedStory: FC<OwnProps> = ({
|
|||||||
</p>
|
</p>
|
||||||
<div className="message-title">{renderText(senderTitle || NBSP)}</div>
|
<div className="message-title">{renderText(senderTitle || NBSP)}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</PeerColorWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import useLastCallback from '../../../hooks/useLastCallback';
|
|||||||
import useOldLang from '../../../hooks/useOldLang';
|
import useOldLang from '../../../hooks/useOldLang';
|
||||||
|
|
||||||
import Icon from '../icons/Icon';
|
import Icon from '../icons/Icon';
|
||||||
|
import PeerColorWrapper from '../PeerColorWrapper';
|
||||||
import EmojiIconBackground from './EmojiIconBackground';
|
import EmojiIconBackground from './EmojiIconBackground';
|
||||||
|
|
||||||
import './EmbeddedMessage.scss';
|
import './EmbeddedMessage.scss';
|
||||||
@ -108,7 +109,7 @@ const EmbeddedStoryForward: FC<OwnProps & StateProps> = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<PeerColorWrapper
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={buildClassName(
|
className={buildClassName(
|
||||||
'EmbeddedMessage',
|
'EmbeddedMessage',
|
||||||
@ -131,7 +132,7 @@ const EmbeddedStoryForward: FC<OwnProps & StateProps> = ({
|
|||||||
{renderSender()}
|
{renderSender()}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</PeerColorWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -699,8 +699,8 @@
|
|||||||
&.has-subheader .media-inner,
|
&.has-subheader .media-inner,
|
||||||
&.has-subheader .Album,
|
&.has-subheader .Album,
|
||||||
&.force-sender-name .Album,
|
&.force-sender-name .Album,
|
||||||
&.is-forwarded .media-inner,
|
&.is-forwarded:not(.is-inverted-media) .media-inner,
|
||||||
&.is-forwarded .Album,
|
&.is-forwarded:not(.is-inverted-media) .Album,
|
||||||
.message-title ~ .media-inner {
|
.message-title ~ .media-inner {
|
||||||
margin-top: 0.25rem;
|
margin-top: 0.25rem;
|
||||||
margin-bottom: -0.375rem;
|
margin-bottom: -0.375rem;
|
||||||
|
|||||||
@ -13,6 +13,11 @@
|
|||||||
margin-top: 0.25rem;
|
margin-top: 0.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.is-forwarded.is-inverted-media & {
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
margin-bottom: 0.125rem;
|
||||||
|
}
|
||||||
|
|
||||||
&.is-service {
|
&.is-service {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
max-width: 19rem;
|
max-width: 19rem;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user