diff --git a/src/components/common/FullNameTitle.module.scss b/src/components/common/FullNameTitle.module.scss index 904000823..267944ab9 100644 --- a/src/components/common/FullNameTitle.module.scss +++ b/src/components/common/FullNameTitle.module.scss @@ -3,8 +3,12 @@ align-items: center; gap: 0.25rem; - > h3 { + .fullName { margin-bottom: 0; + + &.canCopy { + pointer-events: all; + } } :global(.custom-emoji) { diff --git a/src/components/common/FullNameTitle.tsx b/src/components/common/FullNameTitle.tsx index a37364606..135501345 100644 --- a/src/components/common/FullNameTitle.tsx +++ b/src/components/common/FullNameTitle.tsx @@ -4,12 +4,16 @@ import type { ApiChat, ApiUser } from '../../api/types'; import type { FC } from '../../lib/teact/teact'; import type { ObserveFn } from '../../hooks/useIntersectionObserver'; +import { getActions } from '../../global'; import { EMOJI_STATUS_LOOP_LIMIT } from '../../config'; import renderText from './helpers/renderText'; import { getChatTitle, getUserFullName, isUserId } from '../../global/helpers'; import buildClassName from '../../util/buildClassName'; +import { copyTextToClipboard } from '../../util/clipboard'; +import stopEvent from '../../util/stopEvent'; import useLang from '../../hooks/useLang'; +import useLastCallback from '../../hooks/useLastCallback'; import VerifiedIcon from './VerifiedIcon'; import FakeIcon from './FakeIcon'; @@ -27,6 +31,7 @@ type OwnProps = { emojiStatusSize?: number; isSavedMessages?: boolean; noLoopLimit?: boolean; + canCopyTitle?: boolean; onEmojiStatusClick?: NoneToVoidFunction; observeIntersection?: ObserveFn; }; @@ -40,15 +45,27 @@ const FullNameTitle: FC = ({ emojiStatusSize, isSavedMessages, noLoopLimit, + canCopyTitle, onEmojiStatusClick, observeIntersection, }) => { const lang = useLang(); + const { showNotification } = getActions(); const isUser = isUserId(peer.id); const title = isUser ? getUserFullName(peer as ApiUser) : getChatTitle(lang, peer as ApiChat); const emojiStatus = isUser && (peer as ApiUser).emojiStatus; const isPremium = isUser && (peer as ApiUser).isPremium; + const handleTitleClick = useLastCallback((e) => { + if (!title || !canCopyTitle) { + return; + } + + stopEvent(e); + copyTextToClipboard(title); + showNotification({ message: `${isUser ? 'User' : 'Chat'} name was copied` }); + }); + if (isSavedMessages) { return (
@@ -59,7 +76,14 @@ const FullNameTitle: FC = ({ return (
-

{renderText(title || '')}

+

+ {renderText(title || '')} +

{!noVerified && peer.isVerified && } {!noFake && peer.fakeType && } {withEmojiStatus && emojiStatus && ( diff --git a/src/components/common/ProfileInfo.tsx b/src/components/common/ProfileInfo.tsx index e8d121477..9623443ac 100644 --- a/src/components/common/ProfileInfo.tsx +++ b/src/components/common/ProfileInfo.tsx @@ -336,6 +336,7 @@ const ProfileInfo: FC = ({ isSavedMessages={isSavedMessages} onEmojiStatusClick={handleClickPremium} noLoopLimit + canCopyTitle /> )} {!isSavedMessages && renderStatus()}