Search: Fix offset avatars (#5362)
This commit is contained in:
parent
a46d03ad94
commit
a9649de412
@ -1,12 +1,10 @@
|
|||||||
.PickerSelectedItem {
|
.root {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: var(--color-chat-hover);
|
background: var(--color-chat-hover);
|
||||||
height: 2rem;
|
height: 2rem;
|
||||||
min-width: 2rem;
|
min-width: 2rem;
|
||||||
margin-bottom: 0.5rem;
|
margin-inline: 0.25rem;
|
||||||
margin-left: 0.25rem;
|
|
||||||
margin-right: 0.25rem;
|
|
||||||
padding-right: 1rem;
|
padding-right: 1rem;
|
||||||
border-radius: 1rem;
|
border-radius: 1rem;
|
||||||
cursor: var(--custom-cursor, pointer);
|
cursor: var(--custom-cursor, pointer);
|
||||||
@ -28,48 +26,35 @@
|
|||||||
&.closeable:hover {
|
&.closeable:hover {
|
||||||
background-color: rgba(var(--color-error-rgb), 0.16);
|
background-color: rgba(var(--color-error-rgb), 0.16);
|
||||||
|
|
||||||
.item-remove {
|
.remove {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Avatar,
|
|
||||||
.item-icon {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.search-date {
|
&.nonDestructive {
|
||||||
.item-remove {
|
.remove {
|
||||||
background: var(--color-primary);
|
background: var(--color-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: var(--color-chat-hover);
|
background: var(--color-chat-hover);
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-name {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.fluid {
|
&.fluid {
|
||||||
max-width: unset;
|
max-width: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Avatar,
|
.avatar,
|
||||||
.item-icon {
|
.iconWrapper {
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
height: 2rem;
|
height: 2rem;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
transition: opacity 0.15s ease;
|
transition: opacity 0.15s ease;
|
||||||
|
|
||||||
.icon {
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-icon {
|
.iconWrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@ -85,13 +70,13 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-name {
|
.name {
|
||||||
margin-left: 0.5rem;
|
margin-left: 0.5rem;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
.emoji.emoji-small {
|
:global(.emoji.emoji-small) {
|
||||||
width: 1.125rem;
|
width: 1.125rem;
|
||||||
height: 1.125rem;
|
height: 1.125rem;
|
||||||
background-size: 1.125rem;
|
background-size: 1.125rem;
|
||||||
@ -99,7 +84,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-remove {
|
.remove {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
@ -114,14 +99,15 @@
|
|||||||
color: white;
|
color: white;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.15s ease;
|
transition: opacity 0.15s ease;
|
||||||
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.square-avatar {
|
&.squareAvatar {
|
||||||
border-start-start-radius: 0.625rem;
|
border-start-start-radius: 0.625rem;
|
||||||
border-end-start-radius: 0.625rem;
|
border-end-start-radius: 0.625rem;
|
||||||
--border-radius-forum-avatar: 0.625rem;
|
--border-radius-forum-avatar: 0.625rem;
|
||||||
|
|
||||||
&.minimized, .item-remove {
|
&.minimized, .remove {
|
||||||
border-radius: 0.625rem;
|
border-radius: 0.625rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -135,17 +121,12 @@
|
|||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.SearchInput & {
|
.name {
|
||||||
left: auto;
|
|
||||||
right: -0.125rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item-name {
|
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-remove {
|
.remove {
|
||||||
left: auto;
|
left: auto;
|
||||||
right: 0;
|
right: 0;
|
||||||
}
|
}
|
||||||
@ -1,23 +1,24 @@
|
|||||||
import type { TeactNode } from '../../../lib/teact/teact';
|
import type { TeactNode } from '../../lib/teact/teact';
|
||||||
import React, { memo } from '../../../lib/teact/teact';
|
import React, { memo } from '../../lib/teact/teact';
|
||||||
import { withGlobal } from '../../../global';
|
import { withGlobal } from '../../global';
|
||||||
|
|
||||||
import type { ApiPeer } from '../../../api/types';
|
import type { ApiPeer } from '../../api/types';
|
||||||
import type { CustomPeer } from '../../../types';
|
import type { CustomPeer } from '../../types';
|
||||||
import type { IconName } from '../../../types/icons';
|
import type { IconName } from '../../types/icons';
|
||||||
|
|
||||||
import { isApiPeerChat } from '../../../global/helpers/peers';
|
import { getPeerTitle } from '../../global/helpers';
|
||||||
import { selectPeer, selectUser } from '../../../global/selectors';
|
import { isApiPeerChat } from '../../global/helpers/peers';
|
||||||
import buildClassName from '../../../util/buildClassName';
|
import { selectPeer, selectUser } from '../../global/selectors';
|
||||||
import { getPeerColorClass } from '../helpers/peerColor';
|
import buildClassName from '../../util/buildClassName';
|
||||||
|
import { getPeerColorClass } from './helpers/peerColor';
|
||||||
|
|
||||||
import useOldLang from '../../../hooks/useOldLang';
|
import useOldLang from '../../hooks/useOldLang';
|
||||||
|
|
||||||
import Avatar from '../Avatar';
|
import Avatar from './Avatar';
|
||||||
import FullNameTitle from '../FullNameTitle';
|
import FullNameTitle from './FullNameTitle';
|
||||||
import Icon from '../icons/Icon';
|
import Icon from './icons/Icon';
|
||||||
|
|
||||||
import './PickerSelectedItem.scss';
|
import styles from './PeerChip.module.scss';
|
||||||
|
|
||||||
type OwnProps<T = undefined> = {
|
type OwnProps<T = undefined> = {
|
||||||
// eslint-disable-next-line react/no-unused-prop-types
|
// eslint-disable-next-line react/no-unused-prop-types
|
||||||
@ -30,6 +31,7 @@ type OwnProps<T = undefined> = {
|
|||||||
title?: string;
|
title?: string;
|
||||||
isMinimized?: boolean;
|
isMinimized?: boolean;
|
||||||
canClose?: boolean;
|
canClose?: boolean;
|
||||||
|
isCloseNonDestructive?: boolean;
|
||||||
className?: string;
|
className?: string;
|
||||||
fluid?: boolean;
|
fluid?: boolean;
|
||||||
withPeerColors?: boolean;
|
withPeerColors?: boolean;
|
||||||
@ -43,11 +45,12 @@ type StateProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/comma-dangle
|
// eslint-disable-next-line @typescript-eslint/comma-dangle
|
||||||
const PickerSelectedItem = <T,>({
|
const PeerChip = <T,>({
|
||||||
icon,
|
icon,
|
||||||
title,
|
title,
|
||||||
isMinimized,
|
isMinimized,
|
||||||
canClose,
|
canClose,
|
||||||
|
isCloseNonDestructive,
|
||||||
clickArg,
|
clickArg,
|
||||||
peer,
|
peer,
|
||||||
mockPeer,
|
mockPeer,
|
||||||
@ -66,36 +69,40 @@ const PickerSelectedItem = <T,>({
|
|||||||
const chat = apiPeer && isApiPeerChat(apiPeer) ? apiPeer : undefined;
|
const chat = apiPeer && isApiPeerChat(apiPeer) ? apiPeer : undefined;
|
||||||
|
|
||||||
let iconElement: TeactNode | undefined;
|
let iconElement: TeactNode | undefined;
|
||||||
let titleText: any;
|
let titleElement: TeactNode | undefined;
|
||||||
|
let titleText: string | undefined;
|
||||||
|
|
||||||
if (icon && title) {
|
if (icon && title) {
|
||||||
iconElement = (
|
iconElement = (
|
||||||
<div className="item-icon">
|
<div className={styles.iconWrapper}>
|
||||||
<Icon name={icon} />
|
<Icon name={icon} style={styles.icon} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
titleText = title;
|
titleElement = title;
|
||||||
} else if (anyPeer) {
|
} else if (anyPeer) {
|
||||||
iconElement = (
|
iconElement = (
|
||||||
<Avatar
|
<Avatar
|
||||||
|
className={styles.avatar}
|
||||||
peer={anyPeer}
|
peer={anyPeer}
|
||||||
size="small"
|
size="small"
|
||||||
isSavedMessages={isSavedMessages}
|
isSavedMessages={isSavedMessages}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
titleText = title || <FullNameTitle peer={anyPeer} isSavedMessages={isSavedMessages} withEmojiStatus />;
|
titleText = getPeerTitle(lang, anyPeer) || title;
|
||||||
|
titleElement = title || <FullNameTitle peer={anyPeer} isSavedMessages={isSavedMessages} withEmojiStatus />;
|
||||||
}
|
}
|
||||||
|
|
||||||
const fullClassName = buildClassName(
|
const fullClassName = buildClassName(
|
||||||
'PickerSelectedItem',
|
styles.root,
|
||||||
className,
|
(chat?.isForum || customPeer?.isAvatarSquare) && styles.squareAvatar,
|
||||||
(chat?.isForum || customPeer?.isAvatarSquare) && 'square-avatar',
|
isMinimized && styles.minimized,
|
||||||
isMinimized && 'minimized',
|
canClose && styles.closeable,
|
||||||
canClose && 'closeable',
|
isCloseNonDestructive && styles.nonDestructive,
|
||||||
fluid && 'fluid',
|
fluid && styles.fluid,
|
||||||
withPeerColors && getPeerColorClass(customPeer || peer),
|
withPeerColors && getPeerColorClass(customPeer || peer),
|
||||||
|
className,
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -107,12 +114,12 @@ const PickerSelectedItem = <T,>({
|
|||||||
>
|
>
|
||||||
{iconElement}
|
{iconElement}
|
||||||
{!isMinimized && (
|
{!isMinimized && (
|
||||||
<div className="item-name" dir="auto">
|
<div className={styles.name} dir="auto">
|
||||||
{titleText}
|
{titleElement}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{canClose && (
|
{canClose && (
|
||||||
<div className="item-remove">
|
<div className={styles.remove}>
|
||||||
<Icon name="close" />
|
<Icon name="close" />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@ -135,4 +142,4 @@ export default memo(withGlobal<OwnProps>(
|
|||||||
isSavedMessages,
|
isSavedMessages,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
)(PickerSelectedItem)) as typeof PickerSelectedItem;
|
)(PeerChip)) as typeof PeerChip;
|
||||||
@ -14,7 +14,7 @@ import {
|
|||||||
getMessageIsSpoiler,
|
getMessageIsSpoiler,
|
||||||
getMessageMediaHash,
|
getMessageMediaHash,
|
||||||
getMessageRoundVideo,
|
getMessageRoundVideo,
|
||||||
getSenderTitle,
|
getPeerTitle,
|
||||||
isActionMessage,
|
isActionMessage,
|
||||||
isChatChannel,
|
isChatChannel,
|
||||||
isChatGroup,
|
isChatGroup,
|
||||||
@ -120,10 +120,10 @@ const EmbeddedMessage: FC<OwnProps> = ({
|
|||||||
|
|
||||||
const lang = useOldLang();
|
const lang = useOldLang();
|
||||||
|
|
||||||
const senderTitle = sender ? getSenderTitle(lang, sender)
|
const senderTitle = sender ? getPeerTitle(lang, sender)
|
||||||
: (replyForwardInfo?.hiddenUserName || message?.forwardInfo?.hiddenUserName);
|
: (replyForwardInfo?.hiddenUserName || message?.forwardInfo?.hiddenUserName);
|
||||||
const senderChatTitle = senderChat ? getSenderTitle(lang, senderChat) : undefined;
|
const senderChatTitle = senderChat ? getPeerTitle(lang, senderChat) : undefined;
|
||||||
const forwardSenderTitle = forwardSender ? getSenderTitle(lang, forwardSender)
|
const forwardSenderTitle = forwardSender ? getPeerTitle(lang, forwardSender)
|
||||||
: message?.forwardInfo?.hiddenUserName;
|
: message?.forwardInfo?.hiddenUserName;
|
||||||
const areSendersSame = sender && sender.id === forwardSender?.id;
|
const areSendersSame = sender && sender.id === forwardSender?.id;
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import type { ApiPeer, ApiTypeStory } from '../../../api/types';
|
|||||||
import type { ObserveFn } from '../../../hooks/useIntersectionObserver';
|
import type { ObserveFn } from '../../../hooks/useIntersectionObserver';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getSenderTitle,
|
getPeerTitle,
|
||||||
getStoryMediaHash,
|
getStoryMediaHash,
|
||||||
} from '../../../global/helpers';
|
} from '../../../global/helpers';
|
||||||
import buildClassName from '../../../util/buildClassName';
|
import buildClassName from '../../../util/buildClassName';
|
||||||
@ -59,7 +59,7 @@ const EmbeddedStory: FC<OwnProps> = ({
|
|||||||
const mediaThumbnail = isVideoStory ? story.content.video!.thumbnail?.dataUri : undefined;
|
const mediaThumbnail = isVideoStory ? story.content.video!.thumbnail?.dataUri : undefined;
|
||||||
const pictogramUrl = mediaBlobUrl || mediaThumbnail;
|
const pictogramUrl = mediaBlobUrl || mediaThumbnail;
|
||||||
|
|
||||||
const senderTitle = sender ? getSenderTitle(lang, sender) : undefined;
|
const senderTitle = sender ? getPeerTitle(lang, sender) : undefined;
|
||||||
const handleFastClick = useLastCallback(() => {
|
const handleFastClick = useLastCallback(() => {
|
||||||
if (story && !isExpiredStory) {
|
if (story && !isExpiredStory) {
|
||||||
onClick();
|
onClick();
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import type {
|
|||||||
import type { IconName } from '../../../types/icons';
|
import type { IconName } from '../../../types/icons';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getSenderTitle,
|
getPeerTitle,
|
||||||
isUserId,
|
isUserId,
|
||||||
} from '../../../global/helpers';
|
} from '../../../global/helpers';
|
||||||
import { selectPeer, selectPeerStory } from '../../../global/selectors';
|
import { selectPeer, selectPeerStory } from '../../../global/selectors';
|
||||||
@ -59,7 +59,7 @@ const EmbeddedStoryForward: FC<OwnProps & StateProps> = ({
|
|||||||
}
|
}
|
||||||
}, [forwardInfo, story]);
|
}, [forwardInfo, story]);
|
||||||
|
|
||||||
const senderTitle = sender ? getSenderTitle(lang, sender) : forwardInfo.fromName;
|
const senderTitle = sender ? getPeerTitle(lang, sender) : forwardInfo.fromName;
|
||||||
|
|
||||||
const openOriginalStory = useLastCallback(() => {
|
const openOriginalStory = useLastCallback(() => {
|
||||||
const { fromPeerId, storyId } = forwardInfo;
|
const { fromPeerId, storyId } = forwardInfo;
|
||||||
|
|||||||
@ -26,8 +26,8 @@ import Radio from '../../ui/Radio';
|
|||||||
import Avatar from '../Avatar';
|
import Avatar from '../Avatar';
|
||||||
import FullNameTitle from '../FullNameTitle';
|
import FullNameTitle from '../FullNameTitle';
|
||||||
import Icon from '../icons/Icon';
|
import Icon from '../icons/Icon';
|
||||||
|
import PeerChip from '../PeerChip';
|
||||||
import PickerItem from './PickerItem';
|
import PickerItem from './PickerItem';
|
||||||
import PickerSelectedItem from './PickerSelectedItem';
|
|
||||||
|
|
||||||
import styles from './PickerStyles.module.scss';
|
import styles from './PickerStyles.module.scss';
|
||||||
|
|
||||||
@ -335,7 +335,8 @@ const PeerPicker = ({
|
|||||||
{isSearchable && (
|
{isSearchable && (
|
||||||
<div className={buildClassName(styles.header, 'custom-scroll')} dir={lang.isRtl ? 'rtl' : undefined}>
|
<div className={buildClassName(styles.header, 'custom-scroll')} dir={lang.isRtl ? 'rtl' : undefined}>
|
||||||
{selectedCategories?.map((category) => (
|
{selectedCategories?.map((category) => (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
|
className={styles.peerChip}
|
||||||
customPeer={categoriesByType[category]}
|
customPeer={categoriesByType[category]}
|
||||||
onClick={handleItemClick}
|
onClick={handleItemClick}
|
||||||
clickArg={category}
|
clickArg={category}
|
||||||
@ -343,7 +344,8 @@ const PeerPicker = ({
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
{lockedSelectedIds?.map((id, i) => (
|
{lockedSelectedIds?.map((id, i) => (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
|
className={styles.peerChip}
|
||||||
peerId={id}
|
peerId={id}
|
||||||
isMinimized={shouldMinimize && i < selectedIds.length - ALWAYS_FULL_ITEMS_COUNT}
|
isMinimized={shouldMinimize && i < selectedIds.length - ALWAYS_FULL_ITEMS_COUNT}
|
||||||
forceShowSelf={forceShowSelf}
|
forceShowSelf={forceShowSelf}
|
||||||
@ -352,7 +354,8 @@ const PeerPicker = ({
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
{unlockedSelectedIds.map((id, i) => (
|
{unlockedSelectedIds.map((id, i) => (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
|
className={styles.peerChip}
|
||||||
peerId={id}
|
peerId={id}
|
||||||
isMinimized={
|
isMinimized={
|
||||||
shouldMinimize && i + (lockedSelectedIds?.length || 0) < selectedIds.length - ALWAYS_FULL_ITEMS_COUNT
|
shouldMinimize && i + (lockedSelectedIds?.length || 0) < selectedIds.length - ALWAYS_FULL_ITEMS_COUNT
|
||||||
|
|||||||
@ -43,6 +43,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.peerChip {
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
.pickerList {
|
.pickerList {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|||||||
@ -146,5 +146,10 @@
|
|||||||
color: var(--color-text-secondary);
|
color: var(--color-text-secondary);
|
||||||
font-weight: var(--font-weight-medium);
|
font-weight: var(--font-weight-medium);
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
|
|
||||||
|
&[dir="rtl"] {
|
||||||
|
left: auto;
|
||||||
|
right: -0.125rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ import useOldLang from '../../../hooks/useOldLang';
|
|||||||
import { useFullscreenStatus } from '../../../hooks/window/useFullscreen';
|
import { useFullscreenStatus } from '../../../hooks/window/useFullscreen';
|
||||||
import useLeftHeaderButtonRtlForumTransition from './hooks/useLeftHeaderButtonRtlForumTransition';
|
import useLeftHeaderButtonRtlForumTransition from './hooks/useLeftHeaderButtonRtlForumTransition';
|
||||||
|
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import StoryToggler from '../../story/StoryToggler';
|
import StoryToggler from '../../story/StoryToggler';
|
||||||
import Button from '../../ui/Button';
|
import Button from '../../ui/Button';
|
||||||
import DropdownMenu from '../../ui/DropdownMenu';
|
import DropdownMenu from '../../ui/DropdownMenu';
|
||||||
@ -219,19 +219,20 @@ const LeftMainHeader: FC<OwnProps & StateProps> = ({
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{selectedSearchDate && (
|
{selectedSearchDate && (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
icon="calendar"
|
icon="calendar"
|
||||||
title={selectedSearchDate}
|
title={selectedSearchDate}
|
||||||
fluid
|
fluid
|
||||||
canClose
|
canClose
|
||||||
isMinimized={Boolean(globalSearchChatId)}
|
isMinimized={Boolean(globalSearchChatId)}
|
||||||
className="left-search-picker-item search-date"
|
className="left-search-picker-item"
|
||||||
onClick={setGlobalSearchDate}
|
onClick={setGlobalSearchDate}
|
||||||
|
isCloseNonDestructive
|
||||||
clickArg={CLEAR_DATE_SEARCH_PARAM}
|
clickArg={CLEAR_DATE_SEARCH_PARAM}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{globalSearchChatId && (
|
{globalSearchChatId && (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
className="left-search-picker-item"
|
className="left-search-picker-item"
|
||||||
peerId={globalSearchChatId}
|
peerId={globalSearchChatId}
|
||||||
onClick={setGlobalSearchChatId}
|
onClick={setGlobalSearchChatId}
|
||||||
|
|||||||
@ -28,7 +28,7 @@ import useHorizontalScroll from '../../../hooks/useHorizontalScroll';
|
|||||||
import useOldLang from '../../../hooks/useOldLang';
|
import useOldLang from '../../../hooks/useOldLang';
|
||||||
|
|
||||||
import NothingFound from '../../common/NothingFound';
|
import NothingFound from '../../common/NothingFound';
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import InfiniteScroll from '../../ui/InfiniteScroll';
|
import InfiniteScroll from '../../ui/InfiniteScroll';
|
||||||
import Link from '../../ui/Link';
|
import Link from '../../ui/Link';
|
||||||
import ChatMessage from './ChatMessage';
|
import ChatMessage from './ChatMessage';
|
||||||
@ -266,8 +266,9 @@ const ChatResults: FC<OwnProps & StateProps> = ({
|
|||||||
ref={chatSelectionRef}
|
ref={chatSelectionRef}
|
||||||
>
|
>
|
||||||
{localResults.map((id) => (
|
{localResults.map((id) => (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
peerId={id}
|
peerId={id}
|
||||||
|
className="left-search-local-suggestion"
|
||||||
onClick={handlePickerItemClick}
|
onClick={handlePickerItemClick}
|
||||||
clickArg={id}
|
clickArg={id}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -230,7 +230,8 @@
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
|
|
||||||
margin-bottom: 0.5rem;
|
padding-bottom: 0.5rem;
|
||||||
|
padding-inline: 0.25rem;
|
||||||
|
|
||||||
box-shadow: inset 0 -1px 0 0 var(--color-borders);
|
box-shadow: inset 0 -1px 0 0 var(--color-borders);
|
||||||
background-color: var(--color-background);
|
background-color: var(--color-background);
|
||||||
@ -238,7 +239,7 @@
|
|||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
|
|
||||||
> .PickerSelectedItem {
|
.left-search-local-suggestion {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import type { OldLangFn } from '../../../../hooks/useOldLang';
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
getChatTitle,
|
getChatTitle,
|
||||||
getSenderTitle,
|
getPeerTitle,
|
||||||
isChatGroup,
|
isChatGroup,
|
||||||
isUserId,
|
isUserId,
|
||||||
} from '../../../../global/helpers';
|
} from '../../../../global/helpers';
|
||||||
@ -18,7 +18,7 @@ export function getSenderName(
|
|||||||
|
|
||||||
const sender = isUserId(senderId) ? usersById[senderId] : chatsById[senderId];
|
const sender = isUserId(senderId) ? usersById[senderId] : chatsById[senderId];
|
||||||
|
|
||||||
let senderName = getSenderTitle(lang, sender);
|
let senderName = getPeerTitle(lang, sender);
|
||||||
|
|
||||||
const chat = chatsById[message.chatId];
|
const chat = chatsById[message.chatId];
|
||||||
if (chat) {
|
if (chat) {
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import type { ApiChat, ApiPeer } from '../../api/types';
|
|||||||
import type { MediaViewerItem } from './helpers/getViewableMedia';
|
import type { MediaViewerItem } from './helpers/getViewableMedia';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getSenderTitle, isChatChannel, isChatGroup, isUserId,
|
getPeerTitle, isChatChannel, isChatGroup, isUserId,
|
||||||
} from '../../global/helpers';
|
} from '../../global/helpers';
|
||||||
import {
|
import {
|
||||||
selectSender,
|
selectSender,
|
||||||
@ -107,7 +107,7 @@ const SenderInfo: FC<OwnProps & StateProps> = ({
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const senderTitle = getSenderTitle(lang, owner);
|
const senderTitle = getPeerTitle(lang, owner);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="SenderInfo" onClick={handleFocusMessage}>
|
<div className="SenderInfo" onClick={handleFocusMessage}>
|
||||||
|
|||||||
@ -61,7 +61,6 @@
|
|||||||
.peer {
|
.peer {
|
||||||
background-color: var(--accent-background-color);
|
background-color: var(--accent-background-color);
|
||||||
color: var(--accent-color);
|
color: var(--accent-color);
|
||||||
margin: unset;
|
|
||||||
|
|
||||||
&:hover, &:active, &:focus {
|
&:hover, &:active, &:focus {
|
||||||
background-color: var(--accent-background-active-color);
|
background-color: var(--accent-background-active-color);
|
||||||
|
|||||||
@ -30,7 +30,7 @@ import useOldLang from '../../../hooks/useOldLang';
|
|||||||
|
|
||||||
import AnimatedIconFromSticker from '../../common/AnimatedIconFromSticker';
|
import AnimatedIconFromSticker from '../../common/AnimatedIconFromSticker';
|
||||||
import AnimatedIconWithPreview from '../../common/AnimatedIconWithPreview';
|
import AnimatedIconWithPreview from '../../common/AnimatedIconWithPreview';
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import Button from '../../ui/Button';
|
import Button from '../../ui/Button';
|
||||||
import ConfirmDialog from '../../ui/ConfirmDialog';
|
import ConfirmDialog from '../../ui/ConfirmDialog';
|
||||||
import Separator from '../../ui/Separator';
|
import Separator from '../../ui/Separator';
|
||||||
@ -160,7 +160,7 @@ const Giveaway = ({
|
|||||||
</p>
|
</p>
|
||||||
<div className={styles.peers}>
|
<div className={styles.peers}>
|
||||||
{channelIds.map((peerId) => (
|
{channelIds.map((peerId) => (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
peerId={peerId}
|
peerId={peerId}
|
||||||
forceShowSelf
|
forceShowSelf
|
||||||
fluid
|
fluid
|
||||||
@ -203,7 +203,7 @@ const Giveaway = ({
|
|||||||
</strong>
|
</strong>
|
||||||
<div className={styles.peers}>
|
<div className={styles.peers}>
|
||||||
{winnerIds.map((peerId) => (
|
{winnerIds.map((peerId) => (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
peerId={peerId}
|
peerId={peerId}
|
||||||
forceShowSelf
|
forceShowSelf
|
||||||
fluid
|
fluid
|
||||||
|
|||||||
@ -54,7 +54,7 @@ import {
|
|||||||
getMessageHtmlId,
|
getMessageHtmlId,
|
||||||
getMessageSingleCustomEmoji,
|
getMessageSingleCustomEmoji,
|
||||||
getMessageSingleRegularEmoji,
|
getMessageSingleRegularEmoji,
|
||||||
getSenderTitle,
|
getPeerTitle,
|
||||||
hasMessageText,
|
hasMessageText,
|
||||||
hasMessageTtl,
|
hasMessageTtl,
|
||||||
isAnonymousForwardsChat,
|
isAnonymousForwardsChat,
|
||||||
@ -844,7 +844,7 @@ const Message: FC<OwnProps & StateProps> = ({
|
|||||||
scrollTargetPosition,
|
scrollTargetPosition,
|
||||||
);
|
);
|
||||||
|
|
||||||
const viaBusinessBotTitle = viaBusinessBot ? getSenderTitle(lang, viaBusinessBot) : undefined;
|
const viaBusinessBotTitle = viaBusinessBot ? getPeerTitle(lang, viaBusinessBot) : undefined;
|
||||||
|
|
||||||
const canShowPostAuthor = !message.senderId;
|
const canShowPostAuthor = !message.senderId;
|
||||||
const signature = viaBusinessBotTitle || (canShowPostAuthor && message.postAuthorTitle)
|
const signature = viaBusinessBotTitle || (canShowPostAuthor && message.postAuthorTitle)
|
||||||
@ -1500,11 +1500,11 @@ const Message: FC<OwnProps & StateProps> = ({
|
|||||||
let senderTitle;
|
let senderTitle;
|
||||||
let senderColor;
|
let senderColor;
|
||||||
if (senderPeer && !(isCustomShape && viaBotId)) {
|
if (senderPeer && !(isCustomShape && viaBotId)) {
|
||||||
senderTitle = getSenderTitle(lang, senderPeer);
|
senderTitle = getPeerTitle(lang, senderPeer);
|
||||||
} else if (forwardInfo?.hiddenUserName) {
|
} else if (forwardInfo?.hiddenUserName) {
|
||||||
senderTitle = forwardInfo.hiddenUserName;
|
senderTitle = forwardInfo.hiddenUserName;
|
||||||
} else if (storyData && originSender) {
|
} else if (storyData && originSender) {
|
||||||
senderTitle = getSenderTitle(lang, originSender!);
|
senderTitle = getPeerTitle(lang, originSender!);
|
||||||
}
|
}
|
||||||
const senderEmojiStatus = senderPeer && 'emojiStatus' in senderPeer && senderPeer.emojiStatus;
|
const senderEmojiStatus = senderPeer && 'emojiStatus' in senderPeer && senderPeer.emojiStatus;
|
||||||
const senderIsPremium = senderPeer && 'isPremium' in senderPeer && senderPeer.isPremium;
|
const senderIsPremium = senderPeer && 'isPremium' in senderPeer && senderPeer.isPremium;
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import type {
|
|||||||
ApiMessage, ApiPeer, ApiTypeStory, ApiUser,
|
ApiMessage, ApiPeer, ApiTypeStory, ApiUser,
|
||||||
} from '../../../api/types';
|
} from '../../../api/types';
|
||||||
|
|
||||||
import { getSenderTitle, getStoryMediaHash, getUserFirstOrLastName } from '../../../global/helpers';
|
import { getPeerTitle, getStoryMediaHash, getUserFirstOrLastName } from '../../../global/helpers';
|
||||||
import {
|
import {
|
||||||
selectPeer,
|
selectPeer,
|
||||||
selectPeerStories,
|
selectPeerStories,
|
||||||
@ -69,7 +69,7 @@ function StoryMention({
|
|||||||
|
|
||||||
return isDeleted
|
return isDeleted
|
||||||
? lang('ExpiredStoryMention')
|
? lang('ExpiredStoryMention')
|
||||||
: lang('StoryMentionedTitle', getSenderTitle(lang, peer!));
|
: lang('StoryMentionedTitle', getPeerTitle(lang, peer!));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import type {
|
|||||||
|
|
||||||
import { PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION } from '../../../config';
|
import { PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION } from '../../../config';
|
||||||
import {
|
import {
|
||||||
getMediaDuration, getMessageContent, getMessageMediaHash, getSenderTitle, isMessageLocal,
|
getMediaDuration, getMessageContent, getMessageMediaHash, getPeerTitle, isMessageLocal,
|
||||||
} from '../../../global/helpers';
|
} from '../../../global/helpers';
|
||||||
import {
|
import {
|
||||||
selectChat, selectChatMessage, selectSender, selectTabState,
|
selectChat, selectChatMessage, selectSender, selectTabState,
|
||||||
@ -98,7 +98,7 @@ const AudioPlayer: FC<OwnProps & StateProps> = ({
|
|||||||
const { audio, voice, video } = renderingMessage ? getMessageContent(renderingMessage) : {} satisfies MediaContent;
|
const { audio, voice, video } = renderingMessage ? getMessageContent(renderingMessage) : {} satisfies MediaContent;
|
||||||
const isVoice = Boolean(voice || video);
|
const isVoice = Boolean(voice || video);
|
||||||
const shouldRenderPlaybackButton = isVoice || (audio?.duration || 0) > PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION;
|
const shouldRenderPlaybackButton = isVoice || (audio?.duration || 0) > PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION;
|
||||||
const senderName = sender ? getSenderTitle(lang, sender) : undefined;
|
const senderName = sender ? getPeerTitle(lang, sender) : undefined;
|
||||||
|
|
||||||
const mediaHash = renderingMessage && getMessageMediaHash(renderingMessage, 'inline');
|
const mediaHash = renderingMessage && getMessageMediaHash(renderingMessage, 'inline');
|
||||||
const mediaData = mediaHash && mediaLoader.getFromMemory(mediaHash);
|
const mediaData = mediaHash && mediaLoader.getFromMemory(mediaHash);
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import {
|
|||||||
getMessageMediaHash,
|
getMessageMediaHash,
|
||||||
getMessageSingleInlineButton,
|
getMessageSingleInlineButton,
|
||||||
getMessageVideo,
|
getMessageVideo,
|
||||||
getSenderTitle,
|
getPeerTitle,
|
||||||
} from '../../../global/helpers';
|
} from '../../../global/helpers';
|
||||||
import {
|
import {
|
||||||
selectAllowedMessageActionsSlow,
|
selectAllowedMessageActionsSlow,
|
||||||
@ -110,7 +110,7 @@ const HeaderPinnedMessage = ({
|
|||||||
? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);
|
? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);
|
||||||
const pinnedMessageNumber = Math.max(pinnedMessagesCount - currentPinnedIndex, 1);
|
const pinnedMessageNumber = Math.max(pinnedMessagesCount - currentPinnedIndex, 1);
|
||||||
|
|
||||||
const topMessageTitle = topMessageSender ? getSenderTitle(lang, topMessageSender) : undefined;
|
const topMessageTitle = topMessageSender ? getPeerTitle(lang, topMessageSender) : undefined;
|
||||||
|
|
||||||
const video = pinnedMessage && getMessageVideo(pinnedMessage);
|
const video = pinnedMessage && getMessageVideo(pinnedMessage);
|
||||||
const gif = video?.isGif ? video : undefined;
|
const gif = video?.isGif ? video : undefined;
|
||||||
|
|||||||
@ -51,7 +51,7 @@ import useOldLang from '../../../hooks/useOldLang';
|
|||||||
|
|
||||||
import Avatar from '../../common/Avatar';
|
import Avatar from '../../common/Avatar';
|
||||||
import Icon from '../../common/icons/Icon';
|
import Icon from '../../common/icons/Icon';
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import Button from '../../ui/Button';
|
import Button from '../../ui/Button';
|
||||||
import InfiniteScroll from '../../ui/InfiniteScroll';
|
import InfiniteScroll from '../../ui/InfiniteScroll';
|
||||||
import SearchInput from '../../ui/SearchInput';
|
import SearchInput from '../../ui/SearchInput';
|
||||||
@ -519,7 +519,7 @@ const MiddleSearch: FC<StateProps> = ({
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case 'chat':
|
case 'chat':
|
||||||
return (
|
return (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
className={buildClassName(styles.searchType, isSelected && styles.selectedType)}
|
className={buildClassName(styles.searchType, isSelected && styles.selectedType)}
|
||||||
fluid
|
fluid
|
||||||
peerId={chat?.id}
|
peerId={chat?.id}
|
||||||
@ -530,7 +530,7 @@ const MiddleSearch: FC<StateProps> = ({
|
|||||||
);
|
);
|
||||||
case 'myChats':
|
case 'myChats':
|
||||||
return (
|
return (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
className={buildClassName(styles.searchType, isSelected && styles.selectedType)}
|
className={buildClassName(styles.searchType, isSelected && styles.selectedType)}
|
||||||
fluid
|
fluid
|
||||||
peerId={currentUserId}
|
peerId={currentUserId}
|
||||||
@ -542,7 +542,7 @@ const MiddleSearch: FC<StateProps> = ({
|
|||||||
);
|
);
|
||||||
case 'channels':
|
case 'channels':
|
||||||
return (
|
return (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
className={buildClassName(styles.searchType, isSelected && styles.selectedType)}
|
className={buildClassName(styles.searchType, isSelected && styles.selectedType)}
|
||||||
fluid
|
fluid
|
||||||
customPeer={CHANNELS_PEER}
|
customPeer={CHANNELS_PEER}
|
||||||
|
|||||||
@ -21,7 +21,7 @@ import useOldLang from '../../../hooks/useOldLang';
|
|||||||
|
|
||||||
import AnimatedIconWithPreview from '../../common/AnimatedIconWithPreview';
|
import AnimatedIconWithPreview from '../../common/AnimatedIconWithPreview';
|
||||||
import Icon from '../../common/icons/Icon';
|
import Icon from '../../common/icons/Icon';
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import Button from '../../ui/Button';
|
import Button from '../../ui/Button';
|
||||||
import Modal from '../../ui/Modal';
|
import Modal from '../../ui/Modal';
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ const CollectibleInfoModal: FC<OwnProps & StateProps> = ({
|
|||||||
<h3 className={styles.title}>
|
<h3 className={styles.title}>
|
||||||
{title && renderText(title, ['simple_markdown'])}
|
{title && renderText(title, ['simple_markdown'])}
|
||||||
</h3>
|
</h3>
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
fluid
|
fluid
|
||||||
className={styles.chip}
|
className={styles.chip}
|
||||||
peerId={modal?.peerId}
|
peerId={modal?.peerId}
|
||||||
|
|||||||
@ -52,7 +52,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.chatItem {
|
.chatItem {
|
||||||
margin: 0;
|
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
background-color: var(--color-background);
|
background-color: var(--color-background);
|
||||||
color: var(--color-primary);
|
color: var(--color-primary);
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import buildClassName from '../../../util/buildClassName';
|
|||||||
import useLastCallback from '../../../hooks/useLastCallback';
|
import useLastCallback from '../../../hooks/useLastCallback';
|
||||||
|
|
||||||
import Avatar from '../../common/Avatar';
|
import Avatar from '../../common/Avatar';
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import Button from '../../ui/Button';
|
import Button from '../../ui/Button';
|
||||||
import Modal from '../../ui/Modal';
|
import Modal from '../../ui/Modal';
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ const TableInfoModal = ({
|
|||||||
{label && <div className={buildClassName(styles.cell, styles.title)}>{label}</div>}
|
{label && <div className={buildClassName(styles.cell, styles.title)}>{label}</div>}
|
||||||
<div className={buildClassName(styles.cell, styles.value, !label && styles.fullWidth)}>
|
<div className={buildClassName(styles.cell, styles.value, !label && styles.fullWidth)}>
|
||||||
{typeof value === 'object' && 'chatId' in value ? (
|
{typeof value === 'object' && 'chatId' in value ? (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
peerId={value.chatId}
|
peerId={value.chatId}
|
||||||
className={styles.chatItem}
|
className={styles.chatItem}
|
||||||
forceShowSelf
|
forceShowSelf
|
||||||
|
|||||||
@ -24,7 +24,7 @@ import usePrevious from '../../../hooks/usePrevious';
|
|||||||
import Avatar from '../../common/Avatar';
|
import Avatar from '../../common/Avatar';
|
||||||
import StarIcon from '../../common/icons/StarIcon';
|
import StarIcon from '../../common/icons/StarIcon';
|
||||||
import PeerBadge from '../../common/PeerBadge';
|
import PeerBadge from '../../common/PeerBadge';
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import SafeLink from '../../common/SafeLink';
|
import SafeLink from '../../common/SafeLink';
|
||||||
import Button from '../../ui/Button';
|
import Button from '../../ui/Button';
|
||||||
import Modal from '../../ui/Modal';
|
import Modal from '../../ui/Modal';
|
||||||
@ -194,7 +194,7 @@ const StarPaymentModal = ({
|
|||||||
<h2 className={styles.headerText}>
|
<h2 className={styles.headerText}>
|
||||||
{inviteCustomPeer ? oldLang('StarsSubscribeTitle') : oldLang('StarsConfirmPurchaseTitle')}
|
{inviteCustomPeer ? oldLang('StarsSubscribeTitle') : oldLang('StarsConfirmPurchaseTitle')}
|
||||||
</h2>
|
</h2>
|
||||||
{canShowPeerItem && <PickerSelectedItem className={styles.botItem} peerId={form?.botId} />}
|
{canShowPeerItem && <PeerChip className={styles.botItem} peerId={form?.botId} />}
|
||||||
<div className={styles.description}>
|
<div className={styles.description}>
|
||||||
{renderText(descriptionText, ['simple_markdown', 'emoji'])}
|
{renderText(descriptionText, ['simple_markdown', 'emoji'])}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import type {
|
|||||||
} from '../../../../api/types';
|
} from '../../../../api/types';
|
||||||
import type { TabState } from '../../../../global/types';
|
import type { TabState } from '../../../../global/types';
|
||||||
|
|
||||||
import { getSenderTitle } from '../../../../global/helpers';
|
import { getPeerTitle } from '../../../../global/helpers';
|
||||||
import {
|
import {
|
||||||
selectUser,
|
selectUser,
|
||||||
} from '../../../../global/selectors';
|
} from '../../../../global/selectors';
|
||||||
@ -194,7 +194,7 @@ const StarsGiftModal: FC<OwnProps & StateProps> = ({
|
|||||||
</h2>
|
</h2>
|
||||||
<p className={styles.description}>
|
<p className={styles.description}>
|
||||||
{user ? renderText(
|
{user ? renderText(
|
||||||
oldLang('ActionGiftStarsSubtitle', getSenderTitle(oldLang, user)), ['simple_markdown'],
|
oldLang('ActionGiftStarsSubtitle', getPeerTitle(oldLang, user)), ['simple_markdown'],
|
||||||
) : oldLang('Stars.Purchase.GetStarsInfo')}
|
) : oldLang('Stars.Purchase.GetStarsInfo')}
|
||||||
</p>
|
</p>
|
||||||
<div className={styles.section}>
|
<div className={styles.section}>
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import type {
|
|||||||
} from '../../../../api/types';
|
} from '../../../../api/types';
|
||||||
import type { GlobalState } from '../../../../global/types';
|
import type { GlobalState } from '../../../../global/types';
|
||||||
|
|
||||||
import { getSenderTitle } from '../../../../global/helpers';
|
import { getPeerTitle } from '../../../../global/helpers';
|
||||||
import { selectPeer } from '../../../../global/selectors';
|
import { selectPeer } from '../../../../global/selectors';
|
||||||
import { formatDateToString } from '../../../../util/dates/dateFormat';
|
import { formatDateToString } from '../../../../util/dates/dateFormat';
|
||||||
import { formatInteger } from '../../../../util/textFormat';
|
import { formatInteger } from '../../../../util/textFormat';
|
||||||
@ -56,7 +56,7 @@ const StarsSubscriptionItem = ({ subscription }: OwnProps) => {
|
|||||||
<StarIcon className={styles.subscriptionStar} type="gold" size="small" />
|
<StarIcon className={styles.subscriptionStar} type="gold" size="small" />
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.info}>
|
<div className={styles.info}>
|
||||||
<h3 className={styles.title}>{getSenderTitle(lang, peer)}</h3>
|
<h3 className={styles.title}>{getPeerTitle(lang, peer)}</h3>
|
||||||
{title && (
|
{title && (
|
||||||
<p className={styles.subtitle}>
|
<p className={styles.subtitle}>
|
||||||
{photo && <Avatar webPhoto={photo} size="micro" />}
|
{photo && <Avatar webPhoto={photo} size="micro" />}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import type {
|
|||||||
import type { GlobalState } from '../../../../global/types';
|
import type { GlobalState } from '../../../../global/types';
|
||||||
import type { CustomPeer } from '../../../../types';
|
import type { CustomPeer } from '../../../../types';
|
||||||
|
|
||||||
import { getSenderTitle } from '../../../../global/helpers';
|
import { getPeerTitle } from '../../../../global/helpers';
|
||||||
import { buildStarsTransactionCustomPeer, formatStarsTransactionAmount } from '../../../../global/helpers/payments';
|
import { buildStarsTransactionCustomPeer, formatStarsTransactionAmount } from '../../../../global/helpers/payments';
|
||||||
import { selectPeer } from '../../../../global/selectors';
|
import { selectPeer } from '../../../../global/selectors';
|
||||||
import buildClassName from '../../../../util/buildClassName';
|
import buildClassName from '../../../../util/buildClassName';
|
||||||
@ -62,7 +62,7 @@ const StarsTransactionItem = ({ transaction, className }: OwnProps) => {
|
|||||||
let avatarPeer: ApiPeer | CustomPeer | undefined;
|
let avatarPeer: ApiPeer | CustomPeer | undefined;
|
||||||
|
|
||||||
if (transaction.peer.type === 'peer') {
|
if (transaction.peer.type === 'peer') {
|
||||||
description = peer && getSenderTitle(oldLang, peer);
|
description = peer && getPeerTitle(oldLang, peer);
|
||||||
avatarPeer = peer || CUSTOM_PEER_PREMIUM;
|
avatarPeer = peer || CUSTOM_PEER_PREMIUM;
|
||||||
} else {
|
} else {
|
||||||
const customPeer = buildStarsTransactionCustomPeer(transaction.peer);
|
const customPeer = buildStarsTransactionCustomPeer(transaction.peer);
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import useLang from '../../../hooks/useLang';
|
|||||||
import useLastCallback from '../../../hooks/useLastCallback';
|
import useLastCallback from '../../../hooks/useLastCallback';
|
||||||
|
|
||||||
import CustomEmoji from '../../common/CustomEmoji';
|
import CustomEmoji from '../../common/CustomEmoji';
|
||||||
import PickerSelectedItem from '../../common/pickers/PickerSelectedItem';
|
import PeerChip from '../../common/PeerChip';
|
||||||
import Button from '../../ui/Button';
|
import Button from '../../ui/Button';
|
||||||
import Modal from '../../ui/Modal';
|
import Modal from '../../ui/Modal';
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ const SuggestedStatusModal = ({ modal, currentUser, bot }: OwnProps & StateProps
|
|||||||
<p className={styles.description}>{description}</p>
|
<p className={styles.description}>{description}</p>
|
||||||
</div>
|
</div>
|
||||||
{mockPeerWithStatus && (
|
{mockPeerWithStatus && (
|
||||||
<PickerSelectedItem
|
<PeerChip
|
||||||
mockPeer={mockPeerWithStatus}
|
mockPeer={mockPeerWithStatus}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import type { Signal } from '../../util/signals';
|
|||||||
import { MAIN_THREAD_ID } from '../../api/types';
|
import { MAIN_THREAD_ID } from '../../api/types';
|
||||||
|
|
||||||
import { EDITABLE_STORY_INPUT_CSS_SELECTOR, EDITABLE_STORY_INPUT_ID } from '../../config';
|
import { EDITABLE_STORY_INPUT_CSS_SELECTOR, EDITABLE_STORY_INPUT_ID } from '../../config';
|
||||||
import { getSenderTitle, isChatChannel, isUserId } from '../../global/helpers';
|
import { getPeerTitle, isChatChannel, isUserId } from '../../global/helpers';
|
||||||
import {
|
import {
|
||||||
selectChat,
|
selectChat,
|
||||||
selectIsCurrentUserPremium,
|
selectIsCurrentUserPremium,
|
||||||
@ -199,7 +199,7 @@ function Story({
|
|||||||
isOut && (story!.date + viewersExpirePeriod) < getServerTime(),
|
isOut && (story!.date + viewersExpirePeriod) < getServerTime(),
|
||||||
);
|
);
|
||||||
|
|
||||||
const forwardSenderTitle = forwardSender ? getSenderTitle(lang, forwardSender)
|
const forwardSenderTitle = forwardSender ? getPeerTitle(lang, forwardSender)
|
||||||
: (isLoadedStory && story.forwardInfo?.fromName);
|
: (isLoadedStory && story.forwardInfo?.fromName);
|
||||||
|
|
||||||
const canCopyLink = Boolean(
|
const canCopyLink = Boolean(
|
||||||
@ -492,7 +492,7 @@ function Story({
|
|||||||
: story.isForContacts ? 'contacts' : (story.isForCloseFriends ? 'closeFriends' : 'nobody');
|
: story.isForContacts ? 'contacts' : (story.isForCloseFriends ? 'closeFriends' : 'nobody');
|
||||||
|
|
||||||
let message;
|
let message;
|
||||||
const myName = getSenderTitle(lang, peer);
|
const myName = getPeerTitle(lang, peer);
|
||||||
switch (visibility) {
|
switch (visibility) {
|
||||||
case 'nobody':
|
case 'nobody':
|
||||||
message = lang('StorySelectedContactsHint', myName);
|
message = lang('StorySelectedContactsHint', myName);
|
||||||
@ -643,7 +643,7 @@ function Story({
|
|||||||
/>
|
/>
|
||||||
<div className={styles.senderMeta}>
|
<div className={styles.senderMeta}>
|
||||||
<span onClick={handleOpenChat} className={styles.senderName}>
|
<span onClick={handleOpenChat} className={styles.senderName}>
|
||||||
{renderText(getSenderTitle(lang, peer) || '')}
|
{renderText(getPeerTitle(lang, peer) || '')}
|
||||||
</span>
|
</span>
|
||||||
<div className={styles.storyMetaRow}>
|
<div className={styles.storyMetaRow}>
|
||||||
{forwardSenderTitle && (
|
{forwardSenderTitle && (
|
||||||
@ -668,7 +668,7 @@ function Story({
|
|||||||
>
|
>
|
||||||
<Avatar peer={fromPeer} size="micro" />
|
<Avatar peer={fromPeer} size="micro" />
|
||||||
<span className={styles.headerTitle}>
|
<span className={styles.headerTitle}>
|
||||||
{renderText(getSenderTitle(lang, fromPeer) || '')}
|
{renderText(getPeerTitle(lang, fromPeer) || '')}
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
@ -853,7 +853,7 @@ function Story({
|
|||||||
withStory
|
withStory
|
||||||
storyViewerMode="disabled"
|
storyViewerMode="disabled"
|
||||||
/>
|
/>
|
||||||
<div className={styles.name}>{renderText(getSenderTitle(lang, peer) || '')}</div>
|
<div className={styles.name}>{renderText(getPeerTitle(lang, peer) || '')}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import type {
|
|||||||
} from '../../api/types';
|
} from '../../api/types';
|
||||||
import type { StoryViewerOrigin } from '../../types';
|
import type { StoryViewerOrigin } from '../../types';
|
||||||
|
|
||||||
import { getSenderTitle, getStoryMediaHash } from '../../global/helpers';
|
import { getPeerTitle, getStoryMediaHash } from '../../global/helpers';
|
||||||
import { selectTabState } from '../../global/selectors';
|
import { selectTabState } from '../../global/selectors';
|
||||||
import renderText from '../common/helpers/renderText';
|
import renderText from '../common/helpers/renderText';
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ function StoryPreview({
|
|||||||
withStory
|
withStory
|
||||||
storyViewerMode="disabled"
|
storyViewerMode="disabled"
|
||||||
/>
|
/>
|
||||||
<div className={styles.name}>{renderText(getSenderTitle(lang, peer) || '')}</div>
|
<div className={styles.name}>{renderText(getPeerTitle(lang, peer) || '')}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { getActions } from '../../global';
|
|||||||
import type { ApiPeer } from '../../api/types';
|
import type { ApiPeer } from '../../api/types';
|
||||||
import { StoryViewerOrigin } from '../../types';
|
import { StoryViewerOrigin } from '../../types';
|
||||||
|
|
||||||
import { getSenderTitle, isUserId } from '../../global/helpers';
|
import { getPeerTitle, isUserId } from '../../global/helpers';
|
||||||
import buildClassName from '../../util/buildClassName';
|
import buildClassName from '../../util/buildClassName';
|
||||||
import { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';
|
import { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ function StoryRibbonButton({ peer, isArchived }: OwnProps) {
|
|||||||
storyViewerMode="full"
|
storyViewerMode="full"
|
||||||
/>
|
/>
|
||||||
<div className={buildClassName(styles.name, peer.hasUnreadStories && styles.name_hasUnreadStory)}>
|
<div className={buildClassName(styles.name, peer.hasUnreadStories && styles.name_hasUnreadStory)}>
|
||||||
{isSelf ? lang('MyStory') : getSenderTitle(lang, peer)}
|
{isSelf ? lang('MyStory') : getPeerTitle(lang, peer)}
|
||||||
</div>
|
</div>
|
||||||
{contextMenuAnchor !== undefined && (
|
{contextMenuAnchor !== undefined && (
|
||||||
<Menu
|
<Menu
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import type {
|
|||||||
} from '../../api/types';
|
} from '../../api/types';
|
||||||
import type { IconName } from '../../types/icons';
|
import type { IconName } from '../../types/icons';
|
||||||
|
|
||||||
import { getSenderTitle, getUserFullName } from '../../global/helpers';
|
import { getPeerTitle, getUserFullName } from '../../global/helpers';
|
||||||
import { selectPeerStory, selectTabState } from '../../global/selectors';
|
import { selectPeerStory, selectTabState } from '../../global/selectors';
|
||||||
import buildClassName from '../../util/buildClassName';
|
import buildClassName from '../../util/buildClassName';
|
||||||
import stopEvent from '../../util/stopEvent';
|
import stopEvent from '../../util/stopEvent';
|
||||||
@ -209,7 +209,7 @@ function StorySettings({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (closeFriendIds.length === 1) {
|
if (closeFriendIds.length === 1) {
|
||||||
return getSenderTitle(lang, usersById[closeFriendIds[0]]);
|
return getPeerTitle(lang, usersById[closeFriendIds[0]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return lang('StoryPrivacyOptionPeople', closeFriendIds.length, 'i');
|
return lang('StoryPrivacyOptionPeople', closeFriendIds.length, 'i');
|
||||||
|
|||||||
@ -29,7 +29,7 @@ import {
|
|||||||
getMediaHash,
|
getMediaHash,
|
||||||
getMessageDownloadableMedia,
|
getMessageDownloadableMedia,
|
||||||
getMessageStatefulContent,
|
getMessageStatefulContent,
|
||||||
getSenderTitle,
|
getPeerTitle,
|
||||||
isChatChannel,
|
isChatChannel,
|
||||||
isJoinedChannelMessage,
|
isJoinedChannelMessage,
|
||||||
} from '../../helpers';
|
} from '../../helpers';
|
||||||
@ -1022,7 +1022,7 @@ function copyTextForMessages(global: GlobalState, chatId: string, messageIds: nu
|
|||||||
|
|
||||||
messages.forEach((message) => {
|
messages.forEach((message) => {
|
||||||
const sender = isChatChannel(chat) ? chat : selectSender(global, message);
|
const sender = isChatChannel(chat) ? chat : selectSender(global, message);
|
||||||
const senderTitle = `> ${sender ? getSenderTitle(lang, sender) : message.forwardInfo?.hiddenUserName || ''}:`;
|
const senderTitle = `> ${sender ? getPeerTitle(lang, sender) : message.forwardInfo?.hiddenUserName || ''}:`;
|
||||||
const statefulContent = getMessageStatefulContent(global, message);
|
const statefulContent = getMessageStatefulContent(global, message);
|
||||||
|
|
||||||
resultHtml.push(senderTitle);
|
resultHtml.push(senderTitle);
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import type {
|
|||||||
ApiPoll, MediaContainer, MediaContent, StatefulMediaContent,
|
ApiPoll, MediaContainer, MediaContent, StatefulMediaContent,
|
||||||
} from '../../api/types/messages';
|
} from '../../api/types/messages';
|
||||||
import type { OldLangFn } from '../../hooks/useOldLang';
|
import type { OldLangFn } from '../../hooks/useOldLang';
|
||||||
import type { ThreadId } from '../../types';
|
import type { CustomPeer, ThreadId } from '../../types';
|
||||||
import type { LangFn } from '../../util/localization';
|
import type { LangFn } from '../../util/localization';
|
||||||
import type { GlobalState } from '../types';
|
import type { GlobalState } from '../types';
|
||||||
import { ApiMessageEntityTypes, MAIN_THREAD_ID } from '../../api/types';
|
import { ApiMessageEntityTypes, MAIN_THREAD_ID } from '../../api/types';
|
||||||
@ -209,8 +209,12 @@ export function isAnonymousOwnMessage(message: ApiMessage) {
|
|||||||
return Boolean(message.senderId) && !isUserId(message.senderId) && isOwnMessage(message);
|
return Boolean(message.senderId) && !isUserId(message.senderId) && isOwnMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getSenderTitle(lang: OldLangFn | LangFn, sender: ApiPeer) {
|
export function getPeerTitle(lang: OldLangFn | LangFn, peer: ApiPeer | CustomPeer) {
|
||||||
return isPeerUser(sender) ? getUserFullName(sender) : getChatTitle(lang, sender);
|
if ('isCustomPeer' in peer) {
|
||||||
|
// TODO: Remove any after full migration to new lang
|
||||||
|
return peer.titleKey ? lang(peer.titleKey as any) : peer.title;
|
||||||
|
}
|
||||||
|
return isPeerUser(peer) ? getUserFullName(peer) : getChatTitle(lang, peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getSendingState(message: ApiMessage) {
|
export function getSendingState(message: ApiMessage) {
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import type {
|
|||||||
} from '../api/types';
|
} from '../api/types';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getAudioHasCover, getChatAvatarHash, getChatTitle, getMediaHash, getMessageContent, getSenderTitle,
|
getAudioHasCover, getChatAvatarHash, getChatTitle, getMediaHash, getMessageContent, getPeerTitle,
|
||||||
} from '../global/helpers';
|
} from '../global/helpers';
|
||||||
import { resizeImage, scaleImage } from '../util/imageResize';
|
import { resizeImage, scaleImage } from '../util/imageResize';
|
||||||
import { buildMediaMetadata } from '../util/mediaSession';
|
import { buildMediaMetadata } from '../util/mediaSession';
|
||||||
@ -28,7 +28,7 @@ const useMessageMediaMetadata = (
|
|||||||
|
|
||||||
const { audio, voice } = message ? getMessageContent(message) : {} satisfies MediaContent;
|
const { audio, voice } = message ? getMessageContent(message) : {} satisfies MediaContent;
|
||||||
const title = audio ? (audio.title || audio.fileName) : voice ? 'Voice message' : '';
|
const title = audio ? (audio.title || audio.fileName) : voice ? 'Voice message' : '';
|
||||||
const artist = audio?.performer || (sender && getSenderTitle(lang, sender));
|
const artist = audio?.performer || (sender && getPeerTitle(lang, sender));
|
||||||
const album = (chat && getChatTitle(lang, chat)) || 'Telegram';
|
const album = (chat && getChatTitle(lang, chat)) || 'Telegram';
|
||||||
|
|
||||||
const audioCoverHash = (audio && getAudioHasCover(audio) && getMediaHash(audio, 'pictogram'));
|
const audioCoverHash = (audio && getAudioHasCover(audio) && getMediaHash(audio, 'pictogram'));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user