From 70dfa2e160f8081c0b03ae39d3307e557fd4cf08 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 8 Mar 2024 12:48:50 +0100 Subject: [PATCH] UserStatus: Add button to change privacy or buy premium to see user status (#4346) --- src/assets/tgs/LastSeen.tgs | Bin 0 -> 4926 bytes src/bundles/extra.ts | 2 +- .../PrivacySettingsNoticeModal.async.tsx | 18 ++++ ...=> PrivacySettingsNoticeModal.module.scss} | 0 ...dal.tsx => PrivacySettingsNoticeModal.tsx} | 77 +++++++++++++----- src/components/common/ProfileInfo.scss | 10 +++ src/components/common/ProfileInfo.tsx | 22 ++++- src/components/common/ReadTimeModal.async.tsx | 18 ---- .../common/helpers/animatedAssets.ts | 2 + src/components/middle/MiddleColumn.tsx | 12 +-- .../middle/message/ReadTimeMenuItem.tsx | 4 +- src/global/actions/api/settings.ts | 25 +++++- src/global/actions/ui/messages.ts | 10 +-- src/global/types.ts | 11 +-- 14 files changed, 152 insertions(+), 59 deletions(-) create mode 100644 src/assets/tgs/LastSeen.tgs create mode 100644 src/components/common/PrivacySettingsNoticeModal.async.tsx rename src/components/common/{ReadDateModal.module.scss => PrivacySettingsNoticeModal.module.scss} (100%) rename src/components/common/{ReadDateModal.tsx => PrivacySettingsNoticeModal.tsx} (54%) delete mode 100644 src/components/common/ReadTimeModal.async.tsx diff --git a/src/assets/tgs/LastSeen.tgs b/src/assets/tgs/LastSeen.tgs new file mode 100644 index 0000000000000000000000000000000000000000..dcefc4de26a55f5f9dd481f3413613784c591259 GIT binary patch literal 4926 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 literal 0 HcmV?d00001 diff --git a/src/bundles/extra.ts b/src/bundles/extra.ts index 3b717b834..2fd6b9156 100644 --- a/src/bundles/extra.ts +++ b/src/bundles/extra.ts @@ -30,7 +30,7 @@ export { default as PinMessageModal } from '../components/common/PinMessageModal export { default as UnpinAllMessagesModal } from '../components/common/UnpinAllMessagesModal'; export { default as MessageSelectToolbar } from '../components/middle/MessageSelectToolbar'; export { default as SeenByModal } from '../components/common/SeenByModal'; -export { default as ReadTimeModal } from '../components/common/ReadDateModal'; +export { default as PrivacySettingsNoticeModal } from '../components/common/PrivacySettingsNoticeModal'; export { default as ReactorListModal } from '../components/middle/ReactorListModal'; export { default as EmojiInteractionAnimation } from '../components/middle/EmojiInteractionAnimation'; export { default as ChatLanguageModal } from '../components/middle/ChatLanguageModal'; diff --git a/src/components/common/PrivacySettingsNoticeModal.async.tsx b/src/components/common/PrivacySettingsNoticeModal.async.tsx new file mode 100644 index 000000000..42b845310 --- /dev/null +++ b/src/components/common/PrivacySettingsNoticeModal.async.tsx @@ -0,0 +1,18 @@ +import type { FC } from '../../lib/teact/teact'; +import React from '../../lib/teact/teact'; + +import type { OwnProps } from './PrivacySettingsNoticeModal'; + +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const PrivacySettingsNoticeModalAsync: FC = (props) => { + const { isOpen } = props; + const PrivacySettingsNoticeModal = useModuleLoader(Bundles.Extra, 'PrivacySettingsNoticeModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return PrivacySettingsNoticeModal ? : undefined; +}; + +export default PrivacySettingsNoticeModalAsync; diff --git a/src/components/common/ReadDateModal.module.scss b/src/components/common/PrivacySettingsNoticeModal.module.scss similarity index 100% rename from src/components/common/ReadDateModal.module.scss rename to src/components/common/PrivacySettingsNoticeModal.module.scss diff --git a/src/components/common/ReadDateModal.tsx b/src/components/common/PrivacySettingsNoticeModal.tsx similarity index 54% rename from src/components/common/ReadDateModal.tsx rename to src/components/common/PrivacySettingsNoticeModal.tsx index ce24d683f..2e4311dfc 100644 --- a/src/components/common/ReadDateModal.tsx +++ b/src/components/common/PrivacySettingsNoticeModal.tsx @@ -18,7 +18,7 @@ import Separator from '../ui/Separator'; import AnimatedIconWithPreview from './AnimatedIconWithPreview'; import Icon from './Icon'; -import styles from './ReadDateModal.module.scss'; +import styles from './PrivacySettingsNoticeModal.module.scss'; export type OwnProps = { isOpen: boolean; @@ -26,28 +26,47 @@ export type OwnProps = { type StateProps = { user?: ApiUser; + isReadDate?: boolean; }; const CLOSE_ANIMATION_DURATION = ANIMATION_DURATION + ANIMATION_END_DELAY; -const ReadDateModal = ({ isOpen, user }: OwnProps & StateProps) => { +const PrivacySettingsNoticeModal = ({ isOpen, isReadDate, user }: OwnProps & StateProps) => { const lang = useLang(); const { - updateGlobalPrivacySettings, openPremiumModal, closeGetReadDateModal, showNotification, + updateGlobalPrivacySettings, + openPremiumModal, + closePrivacySettingsNoticeModal, + showNotification, + setPrivacyVisibility, + loadUser, } = getActions(); const userName = getUserFirstOrLastName(user); const handleShowReadTime = useLastCallback(() => { updateGlobalPrivacySettings({ shouldHideReadMarks: false }); - closeGetReadDateModal(); + closePrivacySettingsNoticeModal(); setTimeout(() => { showNotification({ message: lang('PremiumReadSet') }); }, CLOSE_ANIMATION_DURATION); }); + const handleShowLastSeen = useLastCallback(() => { + setPrivacyVisibility({ + privacyKey: 'lastSeen', + visibility: 'everybody', + onSuccess: () => loadUser({ userId: user!.id }), + }); + closePrivacySettingsNoticeModal(); + + setTimeout(() => { + showNotification({ message: lang('PremiumLastSeenSet') }); + }, CLOSE_ANIMATION_DURATION); + }); + const handleOpenPremium = useLastCallback(() => { - closeGetReadDateModal(); + closePrivacySettingsNoticeModal(); setTimeout(() => { openPremiumModal(); @@ -55,7 +74,7 @@ const ReadDateModal = ({ isOpen, user }: OwnProps & StateProps) => { }); const handleClose = useLastCallback(() => { - closeGetReadDateModal(); + closePrivacySettingsNoticeModal(); }); return ( @@ -72,25 +91,45 @@ const ReadDateModal = ({ isOpen, user }: OwnProps & StateProps) => { -

{lang('PremiumReadHeader1')}

-

{renderText(lang('PremiumReadText1', userName), ['simple_markdown'])}

+

+ {lang(isReadDate ? 'PremiumReadHeader1' : 'PremiumLastSeenHeader1')} +

+

+ {renderText( + lang( + isReadDate ? 'PremiumReadText1' : 'PremiumLastSeenText1Locked', + userName, + ), + ['simple_markdown'], + )} +

{lang('PremiumOr')}

{lang('PremiumReadHeader2')}

-

{renderText(lang('PremiumReadText2', userName), ['simple_markdown'])}

- @@ -98,11 +137,11 @@ const ReadDateModal = ({ isOpen, user }: OwnProps & StateProps) => { ); }; -export default memo(withGlobal( - (global): StateProps => { - const { chatId } = selectTabState(global).readDateModal || {}; +export default memo( + withGlobal((global): StateProps => { + const { chatId, isReadDate } = selectTabState(global).privacySettingsNoticeModal || {}; const user = chatId ? selectUser(global, chatId) : undefined; - return { user }; - }, -)(ReadDateModal)); + return { user, isReadDate }; + })(PrivacySettingsNoticeModal), +); diff --git a/src/components/common/ProfileInfo.scss b/src/components/common/ProfileInfo.scss index 33139e38f..c514bfb3f 100644 --- a/src/components/common/ProfileInfo.scss +++ b/src/components/common/ProfileInfo.scss @@ -48,4 +48,14 @@ pointer-events: auto; cursor: var(--custom-cursor, pointer); } + + .get-status { + cursor: var(--custom-cursor, pointer); + margin-left: 0.375rem; + border-radius: 0.5rem; + padding: 0.125rem 0.375rem; + background: var(--color-background-menu-separator); + pointer-events: all; + font-weight: 500; + } } diff --git a/src/components/common/ProfileInfo.tsx b/src/components/common/ProfileInfo.tsx index d7cffb4b9..0198083b9 100644 --- a/src/components/common/ProfileInfo.tsx +++ b/src/components/common/ProfileInfo.tsx @@ -90,6 +90,7 @@ const ProfileInfo: FC = ({ openMediaViewer, openPremiumModal, openStickerSet, + openPrivacySettingsNoticeModal, } = getActions(); const lang = useLang(); @@ -173,6 +174,10 @@ const ProfileInfo: FC = ({ setCurrentPhotoIndex(currentPhotoIndex + 1); }); + const handleOpenGetReadDateModal = useLastCallback(() => { + openPrivacySettingsNoticeModal({ chatId: chat!.id, isReadDate: false }); + }); + function handleSelectFallbackPhoto() { if (!isFirst) return; setHasSlideAnimation(true); @@ -264,8 +269,21 @@ const ProfileInfo: FC = ({ if (user) { return ( -
- {getUserStatus(lang, user, userStatus)} +
+ + {getUserStatus(lang, user, userStatus)} + + {userStatus?.isReadDateRestrictedByMe && ( + + {lang('StatusHiddenShow')} + + )}
); } diff --git a/src/components/common/ReadTimeModal.async.tsx b/src/components/common/ReadTimeModal.async.tsx deleted file mode 100644 index a1410967d..000000000 --- a/src/components/common/ReadTimeModal.async.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { FC } from '../../lib/teact/teact'; -import React from '../../lib/teact/teact'; - -import type { OwnProps } from './ReadDateModal'; - -import { Bundles } from '../../util/moduleLoader'; - -import useModuleLoader from '../../hooks/useModuleLoader'; - -const ReadTimeModalAsync: FC = (props) => { - const { isOpen } = props; - const ReadTimeModal = useModuleLoader(Bundles.Extra, 'ReadTimeModal', !isOpen); - - // eslint-disable-next-line react/jsx-props-no-spreading - return ReadTimeModal ? : undefined; -}; - -export default ReadTimeModalAsync; diff --git a/src/components/common/helpers/animatedAssets.ts b/src/components/common/helpers/animatedAssets.ts index 316469fed..b87170fc0 100644 --- a/src/components/common/helpers/animatedAssets.ts +++ b/src/components/common/helpers/animatedAssets.ts @@ -11,6 +11,7 @@ import Flame from '../../../assets/tgs/general/Flame.tgs'; import PartyPopper from '../../../assets/tgs/general/PartyPopper.tgs'; import Invite from '../../../assets/tgs/invites/Invite.tgs'; import JoinRequest from '../../../assets/tgs/invites/Requests.tgs'; +import LastSeen from '../../../assets/tgs/LastSeen.tgs'; import MonkeyClose from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyClose.tgs'; import MonkeyIdle from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyIdle.tgs'; import MonkeyPeek from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyPeek.tgs'; @@ -52,4 +53,5 @@ export const LOCAL_TGS_URLS = { Flame, ReadTime, Unlock, + LastSeen, }; diff --git a/src/components/middle/MiddleColumn.tsx b/src/components/middle/MiddleColumn.tsx index 80d9370cd..e4389bf39 100644 --- a/src/components/middle/MiddleColumn.tsx +++ b/src/components/middle/MiddleColumn.tsx @@ -79,7 +79,7 @@ import useWindowSize from '../../hooks/window/useWindowSize'; import usePinnedMessage from './hooks/usePinnedMessage'; import Composer from '../common/Composer'; -import ReadTimeModal from '../common/ReadTimeModal.async'; +import PrivacySettingsNoticeModal from '../common/PrivacySettingsNoticeModal.async'; import SeenByModal from '../common/SeenByModal.async'; import UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async'; import GiftPremiumModal from '../main/premium/GiftPremiumModal.async'; @@ -131,7 +131,7 @@ type StateProps = { hasCurrentTextSearch?: boolean; isSelectModeActive?: boolean; isSeenByModalOpen: boolean; - isReadDateModalOpen: boolean; + isPrivacySettingsNoticeModalOpen: boolean; isReactorListModalOpen: boolean; isGiftPremiumModalOpen?: boolean; isChatLanguageModalOpen?: boolean; @@ -191,7 +191,7 @@ function MiddleColumn({ hasCurrentTextSearch, isSelectModeActive, isSeenByModalOpen, - isReadDateModalOpen, + isPrivacySettingsNoticeModalOpen, isReactorListModalOpen, isGiftPremiumModalOpen, isChatLanguageModalOpen, @@ -686,7 +686,7 @@ function MiddleColumn({ canPost={renderingCanPost} /> - + {IS_TRANSLATION_SUPPORTED && }
@@ -734,7 +734,7 @@ export default memo(withGlobal( const { messageLists, isLeftColumnShown, activeEmojiInteractions, seenByModal, giftPremiumModal, reactorModal, audioPlayer, shouldSkipHistoryAnimations, - chatLanguageModal, readDateModal, + chatLanguageModal, privacySettingsNoticeModal, } = selectTabState(global); const currentMessageList = selectCurrentMessageList(global); const { leftColumnWidth } = global; @@ -750,7 +750,7 @@ export default memo(withGlobal( hasCurrentTextSearch: Boolean(selectCurrentTextSearch(global)), isSelectModeActive: selectIsInSelectMode(global), isSeenByModalOpen: Boolean(seenByModal), - isReadDateModalOpen: Boolean(readDateModal), + isPrivacySettingsNoticeModalOpen: Boolean(privacySettingsNoticeModal), isReactorListModalOpen: Boolean(reactorModal), isGiftPremiumModalOpen: giftPremiumModal?.isOpen, isChatLanguageModalOpen: Boolean(chatLanguageModal), diff --git a/src/components/middle/message/ReadTimeMenuItem.tsx b/src/components/middle/message/ReadTimeMenuItem.tsx index 4aa962fa4..b5984efbb 100644 --- a/src/components/middle/message/ReadTimeMenuItem.tsx +++ b/src/components/middle/message/ReadTimeMenuItem.tsx @@ -25,14 +25,14 @@ type OwnProps = { function ReadTimeMenuItem({ message, shouldRenderShowWhen, canLoadReadDate, closeContextMenu, menuSeparatorSize, }: OwnProps) { - const { openGetReadDateModal } = getActions(); + const { openPrivacySettingsNoticeModal } = getActions(); const lang = useLang(); const { readDate } = message; const shouldRenderSkeleton = canLoadReadDate && !readDate && !shouldRenderShowWhen; const handleOpenModal = () => { closeContextMenu(); - openGetReadDateModal({ chatId: message.chatId, messageId: message.id }); + openPrivacySettingsNoticeModal({ chatId: message.chatId, isReadDate: true }); }; return ( diff --git a/src/global/actions/api/settings.ts b/src/global/actions/api/settings.ts index 6b71c3c7f..918cfa863 100644 --- a/src/global/actions/api/settings.ts +++ b/src/global/actions/api/settings.ts @@ -470,7 +470,28 @@ addActionHandler('loadPrivacySettings', async (global): Promise => { }); addActionHandler('setPrivacyVisibility', async (global, actions, payload): Promise => { - const { privacyKey, visibility } = payload!; + const { privacyKey, visibility, onSuccess } = payload!; + + if (!global.settings.privacy[privacyKey]) { + const result = await callApi('fetchPrivacySettings', privacyKey); + if (!result) { + return; + } + + global = getGlobal(); + global = addUsers(global, buildCollectionByKey(result.users, 'id')); + global = { + ...global, + settings: { + ...global.settings, + privacy: { + ...global.settings.privacy, + [privacyKey]: result.rules, + }, + }, + }; + setGlobal(global); + } const { privacy: { [privacyKey]: settings }, @@ -491,6 +512,8 @@ addActionHandler('setPrivacyVisibility', async (global, actions, payload): Promi return; } + onSuccess?.(); + global = getGlobal(); global = addUsers(global, buildCollectionByKey(result.users, 'id')); global = { diff --git a/src/global/actions/ui/messages.ts b/src/global/actions/ui/messages.ts index 3144d7f0d..fa4658acd 100644 --- a/src/global/actions/ui/messages.ts +++ b/src/global/actions/ui/messages.ts @@ -781,19 +781,19 @@ addActionHandler('closeSeenByModal', (global, actions, payload): ActionReturnTyp }, tabId); }); -addActionHandler('openGetReadDateModal', (global, actions, payload): ActionReturnType => { - const { chatId, messageId, tabId = getCurrentTabId() } = payload; +addActionHandler('openPrivacySettingsNoticeModal', (global, actions, payload): ActionReturnType => { + const { chatId, isReadDate, tabId = getCurrentTabId() } = payload; return updateTabState(global, { - readDateModal: { chatId, messageId }, + privacySettingsNoticeModal: { chatId, isReadDate }, }, tabId); }); -addActionHandler('closeGetReadDateModal', (global, actions, payload): ActionReturnType => { +addActionHandler('closePrivacySettingsNoticeModal', (global, actions, payload): ActionReturnType => { const { tabId = getCurrentTabId() } = payload || {}; return updateTabState(global, { - readDateModal: undefined, + privacySettingsNoticeModal: undefined, }, tabId); }); diff --git a/src/global/types.ts b/src/global/types.ts index 7b2734262..a88de4726 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -292,9 +292,9 @@ export type TabState = { messageId: number; }; - readDateModal?: { + privacySettingsNoticeModal?: { chatId: string; - messageId: number; + isReadDate: boolean; }; reactorModal?: { @@ -1170,6 +1170,7 @@ export interface ActionPayloads { setPrivacyVisibility: { privacyKey: ApiPrivacyKey; visibility: PrivacyVisibility; + onSuccess?: VoidFunction; }; setPrivacySettings: { @@ -1632,11 +1633,11 @@ export interface ActionPayloads { messageId: number; } & WithTabId; closeSeenByModal: WithTabId | undefined; - openGetReadDateModal: { + openPrivacySettingsNoticeModal: { chatId: string; - messageId: number; + isReadDate: boolean; } & WithTabId; - closeGetReadDateModal: WithTabId | undefined; + closePrivacySettingsNoticeModal: WithTabId | undefined; closeReactorListModal: WithTabId | undefined; openReactorListModal: { chatId: string;