diff --git a/src/api/gramjs/apiBuilders/appConfig.ts b/src/api/gramjs/apiBuilders/appConfig.ts index b8f164043..f0aca9047 100644 --- a/src/api/gramjs/apiBuilders/appConfig.ts +++ b/src/api/gramjs/apiBuilders/appConfig.ts @@ -110,6 +110,7 @@ export interface GramJsAppConfig extends LimitsConfig { stars_suggested_post_age_min?: number; stars_suggested_post_future_max?: number; stars_suggested_post_future_min?: number; + no_forwards_request_expire_period?: number; ton_suggested_post_commission_permille?: number; ton_suggested_post_amount_max?: number; ton_suggested_post_amount_min?: number; @@ -250,6 +251,7 @@ export function buildAppConfig(json: GramJs.TypeJSONValue, hash: number): ApiApp starsSuggestedPostAgeMin: appConfig.stars_suggested_post_age_min, starsSuggestedPostFutureMax: appConfig.stars_suggested_post_future_max, starsSuggestedPostFutureMin: appConfig.stars_suggested_post_future_min, + noForwardsRequestExpirePeriod: appConfig.no_forwards_request_expire_period, tonSuggestedPostCommissionPermille: appConfig.ton_suggested_post_commission_permille, tonSuggestedPostAmountMax: appConfig.ton_suggested_post_amount_max, tonSuggestedPostAmountMin: appConfig.ton_suggested_post_amount_min, diff --git a/src/api/gramjs/apiBuilders/messageActions.ts b/src/api/gramjs/apiBuilders/messageActions.ts index 35cf2a1fe..6743dad4b 100644 --- a/src/api/gramjs/apiBuilders/messageActions.ts +++ b/src/api/gramjs/apiBuilders/messageActions.ts @@ -573,6 +573,25 @@ export function buildApiMessageAction(action: GramJs.TypeMessageAction): ApiMess newCreatorId: buildApiPeerId(newCreatorId, 'user'), }; } + if (action instanceof GramJs.MessageActionNoForwardsToggle) { + const { prevValue, newValue } = action; + return { + mediaType: 'action', + type: 'noForwardsToggle', + prevValue: Boolean(prevValue), + newValue: Boolean(newValue), + }; + } + if (action instanceof GramJs.MessageActionNoForwardsRequest) { + const { expired, prevValue, newValue } = action; + return { + mediaType: 'action', + type: 'noForwardsRequest', + isExpired: expired, + prevValue: Boolean(prevValue), + newValue: Boolean(newValue), + }; + } return UNSUPPORTED_ACTION; } diff --git a/src/api/gramjs/apiBuilders/users.ts b/src/api/gramjs/apiBuilders/users.ts index f058b946c..3314f46b4 100644 --- a/src/api/gramjs/apiBuilders/users.ts +++ b/src/api/gramjs/apiBuilders/users.ts @@ -37,6 +37,7 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse birthday, personalChannelId, personalChannelMessage, sponsoredEnabled, stargiftsCount, botVerification, botCanManageEmojiStatus, settings, sendPaidMessagesStars, displayGiftsButton, disallowedGifts, starsRating, starsMyPendingRating, starsMyPendingRatingDate, mainTab, note, + noforwardsMyEnabled, noforwardsPeerEnabled, }, users, } = mtpUserFull; @@ -77,6 +78,8 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse settings: buildApiPeerSettings(settings), mainTab: mainTab && buildApiProfileTab(mainTab), note: note && buildApiFormattedText(note), + noForwardsMyEnabled: noforwardsMyEnabled, + noForwardsPeerEnabled: noforwardsPeerEnabled, }; } diff --git a/src/api/gramjs/methods/users.ts b/src/api/gramjs/methods/users.ts index d660990d2..1b5f3094c 100644 --- a/src/api/gramjs/methods/users.ts +++ b/src/api/gramjs/methods/users.ts @@ -380,3 +380,21 @@ export function updateContactNote(user: ApiUser, note: ApiFormattedText) { shouldReturnTrue: true, }); } + +export function toggleNoForwards({ + user, + isEnabled, + requestMsgId, +}: { + user: ApiUser; + isEnabled: boolean; + requestMsgId?: number; +}) { + return invokeRequest(new GramJs.messages.ToggleNoForwards({ + peer: buildInputPeer(user.id, user.accessHash), + enabled: isEnabled, + requestMsgId, + }), { + shouldReturnTrue: true, + }); +} diff --git a/src/api/types/messageActions.ts b/src/api/types/messageActions.ts index 3c39d194c..8f0d9de7e 100644 --- a/src/api/types/messageActions.ts +++ b/src/api/types/messageActions.ts @@ -357,6 +357,19 @@ export interface ApiMessageActionChangeCreator extends ActionMediaType { newCreatorId: string; } +export interface ApiMessageActionNoForwardsToggle extends ActionMediaType { + type: 'noForwardsToggle'; + prevValue: boolean; + newValue: boolean; +} + +export interface ApiMessageActionNoForwardsRequest extends ActionMediaType { + type: 'noForwardsRequest'; + isExpired?: boolean; + prevValue: boolean; + newValue: boolean; +} + export interface ApiMessageActionUnsupported extends ActionMediaType { type: 'unsupported'; } @@ -378,4 +391,4 @@ export type ApiMessageAction = ApiMessageActionUnsupported | ApiMessageActionCha | ApiMessageActionSuggestedPostSuccess | ApiMessageActionSuggestedPostRefund | ApiMessageActionTodoCompletions | ApiMessageActionTodoAppendTasks | ApiMessageActionStarGiftPurchaseOffer | ApiMessageActionStarGiftPurchaseOfferDeclined | ApiMessageActionNewCreatorPending - | ApiMessageActionChangeCreator; + | ApiMessageActionChangeCreator | ApiMessageActionNoForwardsToggle | ApiMessageActionNoForwardsRequest; diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts index dc5e30e76..11cbe2fca 100644 --- a/src/api/types/messages.ts +++ b/src/api/types/messages.ts @@ -968,6 +968,12 @@ export interface KeyboardButtonGiftOffer extends ApiKeyboardButtonBase { buttonType: 'accept' | 'reject'; } +export interface KeyboardButtonNoForwardsRequest extends ApiKeyboardButtonBase { + type: 'noForwardsRequest'; + text: string; + buttonType: 'accept' | 'reject'; +} + export type ApiKeyboardButton = ( ApiKeyboardButtonSimple | ApiKeyboardButtonReceipt @@ -983,6 +989,7 @@ export type ApiKeyboardButton = ( | KeyboardButtonSuggestedMessage | KeyboardButtonOpenThread | KeyboardButtonGiftOffer + | KeyboardButtonNoForwardsRequest ); export type ApiKeyboardButtons = ApiKeyboardButton[][]; diff --git a/src/api/types/misc.ts b/src/api/types/misc.ts index 7c9a752f6..8942a153b 100644 --- a/src/api/types/misc.ts +++ b/src/api/types/misc.ts @@ -274,6 +274,7 @@ export interface ApiAppConfig { starsSuggestedPostAgeMin: number; starsSuggestedPostFutureMax: number; starsSuggestedPostFutureMin: number; + noForwardsRequestExpirePeriod: number; tonSuggestedPostCommissionPermille: number; tonSuggestedPostAmountMax: number; tonSuggestedPostAmountMin: number; diff --git a/src/api/types/users.ts b/src/api/types/users.ts index 380eff4fb..2d834f307 100644 --- a/src/api/types/users.ts +++ b/src/api/types/users.ts @@ -85,6 +85,8 @@ export interface ApiUserFullInfo { settings?: ApiPeerSettings; mainTab?: ApiProfileTab; note?: ApiFormattedText; + noForwardsMyEnabled?: boolean; + noForwardsPeerEnabled?: boolean; } export type ApiUserType = 'userTypeBot' | 'userTypeRegular' | 'userTypeDeleted' | 'userTypeUnknown'; diff --git a/src/assets/font-icons/allow-share.svg b/src/assets/font-icons/allow-share.svg new file mode 100644 index 000000000..d78237313 --- /dev/null +++ b/src/assets/font-icons/allow-share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/hand-stop-filled.svg b/src/assets/font-icons/hand-stop-filled.svg new file mode 100644 index 000000000..4e74e0da1 --- /dev/null +++ b/src/assets/font-icons/hand-stop-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/no-download.svg b/src/assets/font-icons/no-download.svg new file mode 100644 index 000000000..8784bf697 --- /dev/null +++ b/src/assets/font-icons/no-download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/no-share.svg b/src/assets/font-icons/no-share.svg new file mode 100644 index 000000000..b52f1d75f --- /dev/null +++ b/src/assets/font-icons/no-share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/reorder-tabs.svg b/src/assets/font-icons/reorder-tabs.svg index 56b1d9941..56186ba24 100644 --- a/src/assets/font-icons/reorder-tabs.svg +++ b/src/assets/font-icons/reorder-tabs.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/font-icons/select-filled.svg b/src/assets/font-icons/select-filled.svg new file mode 100644 index 000000000..622c5fe35 --- /dev/null +++ b/src/assets/font-icons/select-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/localization/fallback.strings b/src/assets/localization/fallback.strings index 6a57949bb..11a54d73d 100644 --- a/src/assets/localization/fallback.strings +++ b/src/assets/localization/fallback.strings @@ -72,6 +72,8 @@ "PremiumPreviewUploadsDescription" = "4 GB per each document, unlimited storage for your chats and media overall."; "PremiumPreviewAdvancedChatManagementDescription" = "Tools to set the default folder, auto-archive and hide new chats from non-contacts."; "PremiumPreviewAnimatedProfilesDescription" = "Video avatars animated in chat lists and chats to allow for additional self-expression."; +"PremiumPreviewNoForwards" = "Disable Sharing"; +"PremiumPreviewNoForwardsDescription" = "Prevent forwarding, saving and copying content in private chats."; "PremiumLimitAccountsTitle" = "Limit Reached"; "PremiumLimitAccountsNoPremium" = "You have reached your current limit of connected accounts. You can free one more place by subscribing to Telegram Premium."; "PremiumLimitAccounts" = "You have reached your current limit of connected accounts. You can free one more place by subscribing to Telegram Premium with one of these connected accounts."; @@ -1931,6 +1933,26 @@ "ActionPaymentUsedRecurring" = "You were charged {amount} via recurring payment"; "ActionScreenshotTaken" = "{from} took a screenshot!"; "ActionScreenshotTakenYou" = "You took a screenshot!"; +"ActionSharingDisabled" = "{from} disabled sharing in this chat"; +"ActionSharingDisabledYou" = "You disabled sharing in this chat"; +"ActionSharingEnabled" = "{from} enabled sharing in this chat"; +"ActionSharingEnabledYou" = "You enabled sharing in this chat"; +"ActionSharingStillDisabled" = "Sharing in this chat is still disabled"; +"ContextMenuNoForwardsPeer" = "{name} disabled copying and forwarding in this chat."; +"ContextMenuNoForwardsYou" = "You disabled copying and forwarding in this chat."; +"DisableSharing" = "Disable Sharing"; +"EnableSharing" = "Enable Sharing"; +"NotificationSharingEnabled" = "Sharing enabled for this chat."; +"NotificationSharingDisabled" = "Sharing disabled for this chat."; +"NoForwardingTitle" = "No Forwarding"; +"NoForwardingDescription" = "Disable message forwarding to other chats."; +"NoSavingTitle" = "No Saving"; +"NoSavingDescription" = "Disable copying text and saving photos and videos."; +"NoForwardsRequestTitle" = "{user} would like to enable sharing in this chat, which includes:"; +"NoForwardsRequestYouTitle" = "You suggested to enable sharing in this chat, which includes:"; +"NoForwardsRequestForwarding" = "forwarding messages"; +"NoForwardsRequestSaving" = "saving photos and videos"; +"NoForwardsRequestCopying" = "copying messages"; "ActionBotAllowedFromDomain" = "You allowed this bot to message you when you logged in on {domain}."; "ActionBotAllowedFromApp" = "You allowed this bot to message you when you opened {app}."; "ActionBotAppPlaceholder" = "App"; @@ -2750,3 +2772,5 @@ "RankEditTextOwn" = "Share your role, title or how you're known in this group. Your tag is visible to all members."; "RankEditText" = "Add a short tag next to {user}'s name."; "MenuAddCaption" = "Add Caption"; +"NoForwardsRequestReject" = "Reject"; +"NoForwardsRequestAccept" = "Accept"; diff --git a/src/assets/premium/PremiumNoForwardsPrivacy.svg b/src/assets/premium/PremiumNoForwardsPrivacy.svg new file mode 100644 index 000000000..47ea5f238 --- /dev/null +++ b/src/assets/premium/PremiumNoForwardsPrivacy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/tgs-previews/settings/HandStopPreview.png b/src/assets/tgs-previews/settings/HandStopPreview.png new file mode 100644 index 000000000..64927ba83 Binary files /dev/null and b/src/assets/tgs-previews/settings/HandStopPreview.png differ diff --git a/src/assets/tgs/settings/HandStop.tgs b/src/assets/tgs/settings/HandStop.tgs new file mode 100644 index 000000000..70ace9639 Binary files /dev/null and b/src/assets/tgs/settings/HandStop.tgs differ diff --git a/src/bundles/extra.ts b/src/bundles/extra.ts index 37a501d03..72b99ed87 100644 --- a/src/bundles/extra.ts +++ b/src/bundles/extra.ts @@ -105,6 +105,7 @@ export { default as OneTimeMediaModal } from '../components/modals/oneTimeMedia/ export { default as WebAppsCloseConfirmationModal } from '../components/main/WebAppsCloseConfirmationModal'; export { default as FrozenAccountModal } from '../components/modals/frozenAccount/FrozenAccountModal'; export { default as ProfileRatingModal } from '../components/modals/profileRating/ProfileRatingModal'; +export { default as DisableSharingAboutModal } from '../components/modals/disableSharing/DisableSharingAboutModal'; export { default as EditRankModal } from '../components/modals/rank/EditRankModal'; export { default as RankModal } from '../components/modals/rank/RankModal'; export { default as QuickPreviewModal } from '../components/modals/quickPreview/QuickPreviewModal'; diff --git a/src/components/common/helpers/animatedAssets.ts b/src/components/common/helpers/animatedAssets.ts index ff3f5f406..cdd277be0 100644 --- a/src/components/common/helpers/animatedAssets.ts +++ b/src/components/common/helpers/animatedAssets.ts @@ -35,6 +35,7 @@ import Experimental from '../../../assets/tgs/settings/Experimental.tgs'; import FoldersAll from '../../../assets/tgs/settings/FoldersAll.tgs'; import FoldersNew from '../../../assets/tgs/settings/FoldersNew.tgs'; import FoldersShare from '../../../assets/tgs/settings/FoldersShare.tgs'; +import HandStop from '../../../assets/tgs/settings/HandStop.tgs'; import Lock from '../../../assets/tgs/settings/Lock.tgs'; import Passkeys from '../../../assets/tgs/settings/Passkeys.tgs'; import StarReaction from '../../../assets/tgs/stars/StarReaction.tgs'; @@ -42,9 +43,11 @@ import StarReactionEffect from '../../../assets/tgs/stars/StarReactionEffect.tgs import Unlock from '../../../assets/tgs/Unlock.tgs'; import DuckNothingFoundPreview from '../../../assets/tgs-previews/DuckNothingFound.svg'; import SearchPreview from '../../../assets/tgs-previews/Search.svg'; +import HandStopPreview from '../../../assets/tgs-previews/settings/HandStopPreview.png'; import PasskeysPreview from '../../../assets/tgs-previews/settings/Passkeys.svg'; export const LOCAL_TGS_PREVIEW_URLS = { + HandStop: HandStopPreview, BrokenGift: BrokenGiftPreview, DuckNothingFound: DuckNothingFoundPreview, Search: SearchPreview, @@ -93,4 +96,5 @@ export const LOCAL_TGS_URLS = { DuckNothingFound, Passkeys, DuckCake, + HandStop, }; diff --git a/src/components/main/premium/PremiumFeatureModal.module.scss b/src/components/main/premium/PremiumFeatureModal.module.scss index 959496533..73f3d3f86 100644 --- a/src/components/main/premium/PremiumFeatureModal.module.scss +++ b/src/components/main/premium/PremiumFeatureModal.module.scss @@ -53,7 +53,7 @@ margin-bottom: 7.5rem; } -.limits, .stories { +.limits, .stories, .noForward { background: var(--color-background); } @@ -68,6 +68,13 @@ height: calc(var(--vh) * 55 + 100px); } +.noForwardFooter { + position: absolute; + bottom: 0; + left: 0; + width: 100%; +} + .header { position: absolute; @@ -112,7 +119,7 @@ } .description { - padding: 0 5%; + padding: 0 max(5%, 2rem); font-size: 1rem; font-weight: var(--font-weight-normal); diff --git a/src/components/main/premium/PremiumFeatureModal.tsx b/src/components/main/premium/PremiumFeatureModal.tsx index 72b9cd50b..96d21f8e4 100644 --- a/src/components/main/premium/PremiumFeatureModal.tsx +++ b/src/components/main/premium/PremiumFeatureModal.tsx @@ -30,6 +30,7 @@ import usePreviousDeprecated from '../../../hooks/usePreviousDeprecated'; import SliderDots from '../../common/SliderDots'; import Button from '../../ui/Button'; import PremiumLimitPreview from './common/PremiumLimitPreview'; +import PremiumFeaturePreviewNoForwards from './previews/PremiumFeaturePreviewNoForwards'; import PremiumFeaturePreviewStickers from './previews/PremiumFeaturePreviewStickers'; import PremiumFeaturePreviewStories from './previews/PremiumFeaturePreviewStories'; import PremiumFeaturePreviewVideo from './previews/PremiumFeaturePreviewVideo'; @@ -56,6 +57,7 @@ export const PREMIUM_FEATURE_TITLES: Record = { message_privacy: 'PremiumPreviewMessagePrivacy', effects: 'Premium.MessageEffects', todo: 'PremiumPreviewTodo', + pm_noforwards: 'PremiumPreviewNoForwards', }; export const PREMIUM_FEATURE_DESCRIPTIONS: Record = { @@ -78,6 +80,7 @@ export const PREMIUM_FEATURE_DESCRIPTIONS: Record = { message_privacy: 'PremiumPreviewMessagePrivacyDescription', effects: 'Premium.MessageEffectsInfo', todo: 'PremiumPreviewTodoDescription', + pm_noforwards: 'PremiumPreviewNoForwardsDescription', }; const LIMITS_TITLES: Record = { @@ -221,7 +224,8 @@ const PremiumFeatureModal: FC = ({ }); const currentSection = filteredSections[currentSlideIndex]; - const hasHeaderBackdrop = currentSection !== 'double_limits' && currentSection !== 'stories'; + const hasHeaderBackdrop = currentSection !== 'double_limits' && + currentSection !== 'stories' && currentSection !== 'pm_noforwards'; return (
@@ -289,16 +293,31 @@ const PremiumFeatureModal: FC = ({ ); } + if (section === 'pm_noforwards') { + return ( +
+ +
+

+ {lang(PREMIUM_FEATURE_TITLES.pm_noforwards as keyof LangPair)} +

+
+ {lang(PREMIUM_FEATURE_DESCRIPTIONS.pm_noforwards as keyof LangPair)} +
+
+
+ ); + } + const i = promo.videoSections.indexOf(section); - if (i === -1) return undefined; const shouldUseNewLang = section === 'todo'; return (
= ({ )} > diff --git a/src/components/main/premium/PremiumMainModal.tsx b/src/components/main/premium/PremiumMainModal.tsx index 094aeaa97..7d080a778 100644 --- a/src/components/main/premium/PremiumMainModal.tsx +++ b/src/components/main/premium/PremiumMainModal.tsx @@ -57,6 +57,7 @@ import PremiumFile from '../../../assets/premium/PremiumFile.svg'; import PremiumLastSeen from '../../../assets/premium/PremiumLastSeen.svg'; import PremiumLimits from '../../../assets/premium/PremiumLimits.svg'; import PremiumMessagePrivacy from '../../../assets/premium/PremiumMessagePrivacy.svg'; +import PremiumNoforwards from '../../../assets/premium/PremiumNoForwardsPrivacy.svg'; import PremiumReactions from '../../../assets/premium/PremiumReactions.svg'; import PremiumSpeed from '../../../assets/premium/PremiumSpeed.svg'; import PremiumStatus from '../../../assets/premium/PremiumStatus.svg'; @@ -89,6 +90,7 @@ const PREMIUM_FEATURE_COLOR_ICONS: Record = { message_privacy: PremiumMessagePrivacy, effects: PremiumEffects, todo: PremiumBadge, + pm_noforwards: PremiumNoforwards, }; export type OwnProps = { @@ -442,7 +444,7 @@ const PremiumMainModal: FC = ({
{filteredSections.map((section, index) => { - const shouldUseNewLang = section === 'todo'; + const shouldUseNewLang = section === 'todo' || section === 'pm_noforwards'; return ( { + const lang = useLang(); + + const listItemData = useMemo(() => { + return [ + ['no-share', lang('NoForwardingTitle'), lang('NoForwardingDescription')], + ['no-download', lang('NoSavingTitle'), lang('NoSavingDescription')], + ] satisfies TableAboutData; + }, [lang]); + + return ( +
+
+ +
+
+ {listItemData.map(([icon, title, subtitle]) => ( + + {title} + {subtitle} + + ))} +
+
+ ); +}; + +export default memo(PremiumFeaturePreviewNoForwards); diff --git a/src/components/middle/HeaderMenuContainer.tsx b/src/components/middle/HeaderMenuContainer.tsx index 5ab2827f7..1c3664e33 100644 --- a/src/components/middle/HeaderMenuContainer.tsx +++ b/src/components/middle/HeaderMenuContainer.tsx @@ -133,6 +133,8 @@ type StateProps = { savedDialog?: ApiChat; disallowedGifts?: ApiDisallowedGifts; isAccountFrozen?: boolean; + noForwardsMyEnabled?: boolean; + noForwardsPeerEnabled?: boolean; }; const CLOSE_MENU_ANIMATION_DURATION = 200; @@ -184,6 +186,8 @@ const HeaderMenuContainer: FC = ({ canShowBoostModal, disallowedGifts, isAccountFrozen, + noForwardsMyEnabled, + noForwardsPeerEnabled, channelMonoforumId, onJoinRequestsClick, onSubscribeChannel, @@ -220,6 +224,8 @@ const HeaderMenuContainer: FC = ({ openBoostModal, reportMessages, showNotification, + toggleNoForwards, + openDisableSharingAboutModal, } = getActions(); const oldLang = useOldLang(); @@ -495,6 +501,21 @@ const HeaderMenuContainer: FC = ({ closeMenu(); }); + const handleToggleNoForwards = useLastCallback(() => { + closeMenu(); + if (isAccountFrozen) { + openFrozenAccountModal(); + return; + } + + if (noForwardsMyEnabled || noForwardsPeerEnabled) { + toggleNoForwards({ userId: chatId, isEnabled: false }); + return; + } + + openDisableSharingAboutModal({ userId: chatId }); + }); + const handleSendChannelMessage = useLastCallback(() => { openChat({ id: channelMonoforumId }); closeMenu(); @@ -801,6 +822,14 @@ const HeaderMenuContainer: FC = ({ {isBlocked ? oldLang('BotRestart') : oldLang('Bot.Stop')} )} + {isPrivate && !isChatWithSelf && !isBot && ( + + {noForwardsMyEnabled || noForwardsPeerEnabled ? lang('EnableSharing') : lang('DisableSharing')} + + )} {isPrivate && !isChatWithSelf && !isBot && ( ( savedDialog, disallowedGifts: userFullInfo?.disallowedGifts, isAccountFrozen, + noForwardsMyEnabled: userFullInfo?.noForwardsMyEnabled, + noForwardsPeerEnabled: userFullInfo?.noForwardsPeerEnabled, }; }, )(HeaderMenuContainer)); diff --git a/src/components/middle/message/ActionMessage.tsx b/src/components/middle/message/ActionMessage.tsx index a9e894a83..f2091e2d7 100644 --- a/src/components/middle/message/ActionMessage.tsx +++ b/src/components/middle/message/ActionMessage.tsx @@ -16,6 +16,7 @@ import { type ApiMessage, type ApiPeer, type KeyboardButtonGiftOffer, + type KeyboardButtonNoForwardsRequest, MAIN_THREAD_ID, } from '../../../api/types'; import { MediaViewerOrigin } from '../../../types'; @@ -60,6 +61,7 @@ import ActionMessageText from './ActionMessageText'; import ChannelPhoto from './actions/ChannelPhoto'; import Gift from './actions/Gift'; import GiveawayPrize from './actions/GiveawayPrize'; +import NoForwardsRequest from './actions/NoForwardsRequest'; import StarGift from './actions/StarGift'; import StarGiftPurchaseOffer from './actions/StarGiftPurchaseOffer'; import StarGiftUnique from './actions/StarGiftUnique'; @@ -103,6 +105,7 @@ type StateProps = { isResizingContainer?: boolean; scrollTargetPosition?: ScrollTargetPosition; isAccountFrozen?: boolean; + noForwardsRequestExpirePeriod: number; }; const SINGLE_LINE_ACTIONS = new Set([ @@ -114,7 +117,7 @@ const SINGLE_LINE_ACTIONS = new Set([ 'unsupported', ]); const HIDDEN_TEXT_ACTIONS = new Set(['giftCode', 'prizeStars', - 'suggestProfilePhoto', 'suggestedPostApproval', 'starGiftPurchaseOffer']); + 'suggestProfilePhoto', 'suggestedPostApproval', 'starGiftPurchaseOffer', 'noForwardsRequest']); const ActionMessage = ({ message, @@ -138,6 +141,7 @@ const ActionMessage = ({ isResizingContainer, scrollTargetPosition, isAccountFrozen, + noForwardsRequestExpirePeriod, observeIntersectionForBottom, observeIntersectionForLoading, observeIntersectionForPlaying, @@ -159,6 +163,7 @@ const ActionMessage = ({ openGiftOfferAcceptModal, declineStarGiftOffer, showNotification, + toggleNoForwards, } = getActions(); const ref = useRef(); @@ -182,7 +187,12 @@ const ActionMessage = ({ const shouldRenderGiftOfferButtons = action.type === 'starGiftPurchaseOffer' && !message.isOutgoing && !action.isAccepted && !action.isDeclined && !hasGiftOfferExpired; - const shouldRenderInlineButtons = shouldRenderGiftOfferButtons; + const hasNoForwardsRequestExpired = action.type === 'noForwardsRequest' + && (message.date + noForwardsRequestExpirePeriod) <= getServerTime(); + const shouldRenderNoForwardsButtons = action.type === 'noForwardsRequest' + && !message.isOutgoing && !action.isExpired && !hasNoForwardsRequestExpired; + + const shouldRenderInlineButtons = shouldRenderGiftOfferButtons || shouldRenderNoForwardsButtons; const shouldSkipRender = isInsideTopic && action.type === 'topicCreate'; @@ -204,6 +214,21 @@ const ActionMessage = ({ ], ], [lang]); + const noForwardsInlineButtons: KeyboardButtonNoForwardsRequest[][] = useMemo(() => [ + [ + { + type: 'noForwardsRequest', + buttonType: 'reject', + text: lang('NoForwardsRequestReject'), + }, + { + type: 'noForwardsRequest', + buttonType: 'accept', + text: lang('NoForwardsRequestAccept'), + }, + ], + ], [lang]); + const [isRejectOfferDialogOpen, openRejectOfferDialog, closeRejectOfferDialog] = useFlag(false); const handleInlineButtonClick = useLastCallback((button: ApiKeyboardButton) => { @@ -220,6 +245,15 @@ const ActionMessage = ({ } else if (button.buttonType === 'reject') { openRejectOfferDialog(); } + } else if (button.type === 'noForwardsRequest') { + if (action.type === 'noForwardsRequest') { + const isAccept = button.buttonType === 'accept'; + toggleNoForwards({ + userId: chatId, + isEnabled: isAccept ? action.newValue : action.prevValue, + requestMsgId: id, + }); + } } }); @@ -522,6 +556,13 @@ const ActionMessage = ({ /> ); + case 'noForwardsRequest': + return ( + + ); + case 'suggestedPostApproval': if (action.isBalanceTooLow) { return ( @@ -614,13 +655,20 @@ const ActionMessage = ({ {(fullContent || shouldRenderInlineButtons) && (
{fullContent} - {shouldRenderInlineButtons && ( + {shouldRenderGiftOfferButtons && ( )} + {shouldRenderNoForwardsButtons && ( + + )}
)} {contextMenuAnchor && ( @@ -703,6 +751,7 @@ export default memo(withGlobal( isResizingContainer, scrollTargetPosition, isAccountFrozen, + noForwardsRequestExpirePeriod: global.appConfig.noForwardsRequestExpirePeriod, }; }, )(ActionMessage)); diff --git a/src/components/middle/message/ActionMessageText.tsx b/src/components/middle/message/ActionMessageText.tsx index b2ea1cfd5..eaa19895b 100644 --- a/src/components/middle/message/ActionMessageText.tsx +++ b/src/components/middle/message/ActionMessageText.tsx @@ -1059,6 +1059,25 @@ const ActionMessageText = ({ case 'phoneCall': // Rendered as a regular message, but considered an action for the summary return lang(getCallMessageKey(action, isOutgoing)); + case 'noForwardsToggle': { + const { prevValue, newValue } = action; + if (newValue && newValue === prevValue) { + return lang('ActionSharingStillDisabled'); + } + return translateWithYou( + lang, + newValue ? 'ActionSharingDisabled' : 'ActionSharingEnabled', + isOutgoing, + { from: senderLink }, + ); + } + + case 'noForwardsRequest': { + return isOutgoing + ? lang('NoForwardsRequestYouTitle') + : lang('NoForwardsRequestTitle', { user: senderLink }, { withNodes: true }); + } + case 'newCreatorPending': { const { newCreatorId } = action; const newCreator = selectPeer(global, newCreatorId); diff --git a/src/components/middle/message/ContextMenuContainer.tsx b/src/components/middle/message/ContextMenuContainer.tsx index 0c2d0962f..073e6f335 100644 --- a/src/components/middle/message/ContextMenuContainer.tsx +++ b/src/components/middle/message/ContextMenuContainer.tsx @@ -68,6 +68,7 @@ import { selectStickerSet, selectTopic, selectUser, + selectUserFullInfo, selectUserStatus, selectWebPageFromMessage, } from '../../../global/selectors'; @@ -162,6 +163,8 @@ type StateProps = { userFullName?: string; canGift?: boolean; savedDialogId?: string; + noForwardsMyEnabled?: boolean; + noForwardsPeerEnabled?: boolean; }; const selection = window.getSelection(); @@ -232,6 +235,8 @@ const ContextMenuContainer: FC = ({ canGift, className, savedDialogId, + noForwardsMyEnabled, + noForwardsPeerEnabled, onClose, onCloseAnimationEnd, }) => { @@ -277,6 +282,11 @@ const ContextMenuContainer: FC = ({ const oldLang = useOldLang(); const lang = useLang(); + + const noForwardsNotice = noForwardsPeerEnabled + ? lang('ContextMenuNoForwardsPeer', { name: userFullName }) + : (noForwardsMyEnabled ? lang('ContextMenuNoForwardsYou') : undefined); + const { ref: containerRef } = useShowTransition({ isOpen, onCloseAnimationEnd, @@ -774,6 +784,7 @@ const ContextMenuContainer: FC = ({ onSelectLanguage={handleSelectLanguage} userFullName={userFullName} canGift={canGift} + noForwardsNotice={noForwardsNotice} /> ( const chatFullInfo = !isPrivate ? selectChatFullInfo(global, message.chatId) : undefined; const user = selectUser(global, message.chatId); const userFullName = user && getUserFullName(user); + const userFullInfo = isPrivate ? selectUserFullInfo(global, message.chatId) : undefined; const { seenByExpiresAt, seenByMaxChatMembers, maxUniqueReactions, readDateExpiresAt, @@ -970,6 +982,8 @@ export default memo(withGlobal( canGift, savedDialogId, webPage, + noForwardsMyEnabled: userFullInfo?.noForwardsMyEnabled, + noForwardsPeerEnabled: userFullInfo?.noForwardsPeerEnabled, }; }, )(ContextMenuContainer)); diff --git a/src/components/middle/message/MessageContextMenu.scss b/src/components/middle/message/MessageContextMenu.scss index af0d7d512..a4d70d4cd 100644 --- a/src/components/middle/message/MessageContextMenu.scss +++ b/src/components/middle/message/MessageContextMenu.scss @@ -75,4 +75,8 @@ top: 0; transform: translateY(calc(-100% - 0.5rem)); } + + .no-forwards-notice { + min-width: 12rem; + } } diff --git a/src/components/middle/message/MessageContextMenu.tsx b/src/components/middle/message/MessageContextMenu.tsx index 888e6a4ec..d281662ef 100644 --- a/src/components/middle/message/MessageContextMenu.tsx +++ b/src/components/middle/message/MessageContextMenu.tsx @@ -136,6 +136,7 @@ type OwnProps = { onReactionPickerOpen?: (position: IAnchorPosition) => void; userFullName?: string; canGift?: boolean; + noForwardsNotice?: string; }; const SCROLLBAR_WIDTH = 10; @@ -230,6 +231,7 @@ const MessageContextMenu: FC = ({ onSelectLanguage, userFullName, canGift, + noForwardsNotice, }) => { const { showNotification, openStickerSet, openCustomEmojiSets, loadStickers, openGiftModal, @@ -515,7 +517,7 @@ const MessageContextMenu: FC = ({
)} - {(canLoadReadDate || shouldRenderShowWhen || isEdited) && ( + {(canLoadReadDate || shouldRenderShowWhen || isEdited || noForwardsNotice) && ( )} {(canLoadReadDate || shouldRenderShowWhen) && ( @@ -531,6 +533,11 @@ const MessageContextMenu: FC = ({ message={message} /> )} + {noForwardsNotice && ( + + {noForwardsNotice} + + )}
); diff --git a/src/components/middle/message/actions/NoForwardsRequest.module.scss b/src/components/middle/message/actions/NoForwardsRequest.module.scss new file mode 100644 index 000000000..3d03a2b33 --- /dev/null +++ b/src/components/middle/message/actions/NoForwardsRequest.module.scss @@ -0,0 +1,27 @@ +.root { + padding: 0.75rem 1rem; + text-align: center; +} + +.title { + line-height: 1.125rem; +} + +.list { + display: flex; + flex-direction: column; + gap: 0.5rem; + align-items: flex-start; + + width: 100%; +} + +.item { + display: flex; + gap: 0.375rem; + align-items: center; +} + +.checkIcon { + font-size: 1rem; +} diff --git a/src/components/middle/message/actions/NoForwardsRequest.tsx b/src/components/middle/message/actions/NoForwardsRequest.tsx new file mode 100644 index 000000000..df63c136c --- /dev/null +++ b/src/components/middle/message/actions/NoForwardsRequest.tsx @@ -0,0 +1,72 @@ +import { memo } from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../global'; + +import type { ApiMessage, ApiPeer } from '../../../../api/types'; + +import { getPeerTitle } from '../../../../global/helpers/peers'; +import { selectSender } from '../../../../global/selectors'; +import buildClassName from '../../../../util/buildClassName'; +import { renderPeerLink } from '../helpers/messageActions'; + +import useLang from '../../../../hooks/useLang'; + +import Icon from '../../../common/icons/Icon'; + +import actionStyles from '../ActionMessage.module.scss'; +import styles from './NoForwardsRequest.module.scss'; + +type OwnProps = { + message: ApiMessage; +}; + +type StateProps = { + sender?: ApiPeer; +}; + +const SHARING_FEATURES = [ + 'NoForwardsRequestForwarding', + 'NoForwardsRequestSaving', + 'NoForwardsRequestCopying', +] as const; + +const NoForwardsRequest = ({ + message, + sender, +}: OwnProps & StateProps) => { + const lang = useLang(); + + const { isOutgoing } = message; + + const peerTitle = sender && getPeerTitle(lang, sender); + const peerLink = renderPeerLink(sender?.id, peerTitle || lang('ActionFallbackUser')); + + const title = isOutgoing + ? lang('NoForwardsRequestYouTitle') + : lang('NoForwardsRequestTitle', { user: peerLink }, { withNodes: true, withMarkdown: false }); + + return ( +
+
+ {title} +
+
+ {SHARING_FEATURES.map((featureKey) => ( +
+ + {lang(featureKey)} +
+ ))} +
+
+ ); +}; + +export default memo(withGlobal( + (global, { message }): Complete => { + const sender = selectSender(global, message); + + return { + sender, + }; + }, +)(NoForwardsRequest)); diff --git a/src/components/modals/ModalContainer.tsx b/src/components/modals/ModalContainer.tsx index 1bafb0665..0f6409b2c 100644 --- a/src/components/modals/ModalContainer.tsx +++ b/src/components/modals/ModalContainer.tsx @@ -18,6 +18,7 @@ import ChatlistModal from './chatlist/ChatlistModal.async'; import CocoonModal from './cocoon/CocoonModal.async'; import CollectibleInfoModal from './collectible/CollectibleInfoModal.async'; import DeleteAccountModal from './deleteAccount/DeleteAccountModal.async'; +import DisableSharingAboutModal from './disableSharing/DisableSharingAboutModal.async'; import EmojiStatusAccessModal from './emojiStatusAccess/EmojiStatusAccessModal.async'; import FrozenAccountModal from './frozenAccount/FrozenAccountModal.async'; import AboutStarGiftModal from './gift/AboutStarGiftModal.async'; @@ -134,6 +135,7 @@ type ModalKey = keyof Pick { + const { modal } = props; + const DisableSharingAboutModal = useModuleLoader(Bundles.Extra, 'DisableSharingAboutModal', !modal); + + return DisableSharingAboutModal ? : undefined; +}; + +export default DisableSharingAboutModalAsync; diff --git a/src/components/modals/disableSharing/DisableSharingAboutModal.module.scss b/src/components/modals/disableSharing/DisableSharingAboutModal.module.scss new file mode 100644 index 000000000..c5b1e8c0f --- /dev/null +++ b/src/components/modals/disableSharing/DisableSharingAboutModal.module.scss @@ -0,0 +1,23 @@ +.header { + display: flex; + flex-direction: column; + gap: 0.75rem; + align-items: center; +} + +.title { + margin: 0; + margin-bottom: 0.5rem; + font-size: 1.25rem; + font-weight: var(--font-weight-semibold); +} + +.footer { + display: flex; + align-self: stretch; + margin-top: 1rem; +} + +.unlockIcon { + font-size: 1.25rem; +} diff --git a/src/components/modals/disableSharing/DisableSharingAboutModal.tsx b/src/components/modals/disableSharing/DisableSharingAboutModal.tsx new file mode 100644 index 000000000..653e0ff04 --- /dev/null +++ b/src/components/modals/disableSharing/DisableSharingAboutModal.tsx @@ -0,0 +1,127 @@ +import { memo, useMemo } from '../../../lib/teact/teact'; +import { getActions, withGlobal } from '../../../global'; + +import type { TabState } from '../../../global/types'; + +import { selectIsCurrentUserPremium } from '../../../global/selectors'; +import { LOCAL_TGS_PREVIEW_URLS, LOCAL_TGS_URLS } from '../../common/helpers/animatedAssets'; + +import useCurrentOrPrev from '../../../hooks/useCurrentOrPrev'; +import useLang from '../../../hooks/useLang'; +import useLastCallback from '../../../hooks/useLastCallback'; + +import AnimatedIconWithPreview from '../../common/AnimatedIconWithPreview'; +import Button from '../../ui/Button'; +import TableAboutModal, { type TableAboutData } from '../common/TableAboutModal'; + +import styles from './DisableSharingAboutModal.module.scss'; + +const ICON_SIZE = 100; + +export type OwnProps = { + modal: TabState['disableSharingAboutModal']; +}; + +type StateProps = { + isCurrentUserPremium?: boolean; +}; + +const DisableSharingAboutModal = ({ + modal, + isCurrentUserPremium, +}: OwnProps & StateProps) => { + const { + closeDisableSharingAboutModal, + toggleNoForwards, + openPremiumModal, + } = getActions(); + const lang = useLang(); + + const isOpen = Boolean(modal); + const renderingModal = useCurrentOrPrev(modal); + + const userId = renderingModal?.userId; + + const handleClose = useLastCallback(() => { + closeDisableSharingAboutModal(); + }); + + const handleDisableSharing = useLastCallback(() => { + if (userId) { + toggleNoForwards({ userId, isEnabled: true }); + } + closeDisableSharingAboutModal(); + }); + + const handleOpenPremium = useLastCallback(() => { + closeDisableSharingAboutModal(); + openPremiumModal({ initialSection: 'pm_noforwards' }); + }); + + const header = useMemo(() => { + return ( +
+ +

{lang('DisableSharing')}

+
+ ); + }, [lang]); + + const listItemData = useMemo(() => { + return [ + ['no-share', lang('NoForwardingTitle'), lang('NoForwardingDescription')], + ['no-download', lang('NoSavingTitle'), lang('NoSavingDescription')], + ] satisfies TableAboutData; + }, [lang]); + + const footer = useMemo(() => { + if (isCurrentUserPremium) { + return ( +
+ +
+ ); + } + + return ( +
+ +
+ ); + }, [isCurrentUserPremium, lang, handleDisableSharing, handleOpenPremium]); + + return ( + + ); +}; + +export default memo(withGlobal( + (global): Complete => { + return { + isCurrentUserPremium: selectIsCurrentUserPremium(global), + }; + }, +)(DisableSharingAboutModal)); diff --git a/src/components/ui/MenuItem.scss b/src/components/ui/MenuItem.scss index f09b01d4d..78a27a8f9 100644 --- a/src/components/ui/MenuItem.scss +++ b/src/components/ui/MenuItem.scss @@ -68,6 +68,13 @@ &.disabled { cursor: var(--custom-cursor, default) !important; opacity: 0.5 !important; + + &:hover, + &:focus, + &:active { + transform: none !important; + background-color: transparent !important; + } } &.destructive { diff --git a/src/components/ui/MenuItem.tsx b/src/components/ui/MenuItem.tsx index eee9a59d0..22558128e 100644 --- a/src/components/ui/MenuItem.tsx +++ b/src/components/ui/MenuItem.tsx @@ -127,7 +127,7 @@ const MenuItem = (props: MenuItemProps) => { return (
=> { + const { userId, isEnabled, requestMsgId } = payload; + + const user = selectUser(global, userId); + if (!user) { + return; + } + + await callApi('toggleNoForwards', { user, isEnabled, requestMsgId }); +}); diff --git a/src/global/actions/apiUpdaters/messages.ts b/src/global/actions/apiUpdaters/messages.ts index cac992d0b..0edb42dd1 100644 --- a/src/global/actions/apiUpdaters/messages.ts +++ b/src/global/actions/apiUpdaters/messages.ts @@ -73,6 +73,7 @@ import { updateThreadInfoMessagesCount, updateThreadReadState, } from '../../reducers/threads'; +import { updateUserFullInfo } from '../../reducers/users'; import { selectCanAnimateSnapEffect, selectChat, @@ -179,6 +180,19 @@ addActionHandler('apiUpdate', (global, actions, update): ActionReturnType => { } else { global = updateChatLastMessage(global, chatId, newMessage); } + + if (!isLocal && message.isOutgoing && message.content?.action?.type === 'noForwardsRequest') { + const currentMessageList = selectCurrentMessageList(global, tabId); + if (currentMessageList?.chatId === chatId && currentMessageList.type === 'thread') { + actions.focusMessage({ + chatId, + threadId: MAIN_THREAD_ID, + messageId: message.id, + noHighlight: true, + tabId, + }); + } + } }); if (poll) { @@ -201,6 +215,37 @@ addActionHandler('apiUpdate', (global, actions, update): ActionReturnType => { global = replaceThreadLocalStateParam(global, chatId, threadId, 'typingDraftIdByRandomId', undefined); } + if (!isLocal && message.content?.action?.type === 'noForwardsToggle') { + const { newValue } = message.content.action; + if (message.isOutgoing) { + global = updateUserFullInfo(global, chatId, { + noForwardsMyEnabled: newValue, + }); + const tabId = getCurrentTabId(); + if (selectCurrentMessageList(global, tabId)?.chatId === chatId) { + actions.showNotification({ + icon: newValue ? 'hand-stop-filled' : 'select-filled', + message: { key: newValue ? 'NotificationSharingDisabled' : 'NotificationSharingEnabled' }, + tabId, + }); + } + } else { + const originalMessage = replyInfo?.replyToMsgId ? + selectChatMessage(global, chatId, replyInfo.replyToMsgId) : undefined; + + // When peer accepted user request to enable sharing + if (originalMessage?.isOutgoing && !newValue) { + global = updateUserFullInfo(global, chatId, { + noForwardsMyEnabled: false, + }); + } else { + global = updateUserFullInfo(global, chatId, { + noForwardsPeerEnabled: newValue, + }); + } + } + } + setGlobal(global); // Reload dialogs if chat is not present in the list diff --git a/src/global/actions/ui/users.ts b/src/global/actions/ui/users.ts index e89aec7ac..cd12c51ab 100644 --- a/src/global/actions/ui/users.ts +++ b/src/global/actions/ui/users.ts @@ -65,6 +65,16 @@ addActionHandler('closeSuggestedStatusModal', (global, actions, payload): Action addTabStateResetterAction('closeChatRefundModal', 'chatRefundModal'); +addActionHandler('openDisableSharingAboutModal', (global, actions, payload): ActionReturnType => { + const { userId, tabId = getCurrentTabId() } = payload; + + return updateTabState(global, { + disableSharingAboutModal: { userId }, + }, tabId); +}); + +addTabStateResetterAction('closeDisableSharingAboutModal', 'disableSharingAboutModal'); + addActionHandler('openProfileRatingModal', (global, actions, payload): ActionReturnType => { const { userId, level, tabId = getCurrentTabId() } = payload; diff --git a/src/global/selectors/messages.ts b/src/global/selectors/messages.ts index dfe9897b2..3d235c88b 100644 --- a/src/global/selectors/messages.ts +++ b/src/global/selectors/messages.ts @@ -97,7 +97,7 @@ import { } from './threads'; import { selectTopic, selectTopicFromMessage } from './topics'; import { - selectBot, selectUser, selectUserStatus, + selectBot, selectIsUserChatProtected, selectUser, selectUserStatus, } from './users'; export function selectCurrentMessageList( @@ -1141,11 +1141,19 @@ export function selectIsMessageProtected(global: T, messa } export function selectIsChatProtected(global: T, chatId: string) { - return selectChat(global, chatId)?.isProtected || false; + const chat = selectChat(global, chatId); + + if (!chat) return false; + + if (chat.isProtected || (isUserId(chatId) && selectIsUserChatProtected(global, chatId))) { + return true; + } + + return false; } export function selectHasProtectedMessage(global: T, chatId: string, messageIds?: number[]) { - if (selectChat(global, chatId)?.isProtected) { + if (selectIsChatProtected(global, chatId)) { return true; } @@ -1159,7 +1167,7 @@ export function selectHasProtectedMessage(global: T, chat } export function selectCanForwardMessages(global: T, chatId: string, messageIds?: number[]) { - if (selectChat(global, chatId)?.isProtected) { + if (selectIsChatProtected(global, chatId)) { return false; } diff --git a/src/global/selectors/users.ts b/src/global/selectors/users.ts index 1d1f252f6..ca09536e0 100644 --- a/src/global/selectors/users.ts +++ b/src/global/selectors/users.ts @@ -29,6 +29,13 @@ export function selectIsUserBlocked(global: T, userId: st return selectUserFullInfo(global, userId)?.isBlocked; } +export function selectIsUserChatProtected(global: T, userId: string) { + const fullInfo = selectUserFullInfo(global, userId); + if (!fullInfo) return undefined; + + return Boolean(fullInfo.noForwardsMyEnabled || fullInfo.noForwardsPeerEnabled); +} + export function selectIsCurrentUserPremium(global: T) { if (!global.currentUserId) return false; diff --git a/src/global/types/actions.ts b/src/global/types/actions.ts index bca442251..2f3753ea5 100644 --- a/src/global/types/actions.ts +++ b/src/global/types/actions.ts @@ -315,6 +315,11 @@ export interface ActionPayloads { markBotVerificationInfoShown: { peerId: string; }; + toggleNoForwards: { + userId: string; + isEnabled: boolean; + requestMsgId?: number; + }; // Message search openMiddleSearch: { @@ -1938,6 +1943,10 @@ export interface ActionPayloads { userId: string; } & WithTabId; closeChatRefundModal: WithTabId | undefined; + openDisableSharingAboutModal: { + userId: string; + } & WithTabId; + closeDisableSharingAboutModal: WithTabId | undefined; openProfileRatingModal: { userId: string; level: number; diff --git a/src/global/types/tabState.ts b/src/global/types/tabState.ts index feadeb431..413544026 100644 --- a/src/global/types/tabState.ts +++ b/src/global/types/tabState.ts @@ -719,6 +719,10 @@ export type TabState = { starsToRefund: number; }; + disableSharingAboutModal?: { + userId: string; + }; + limitReachedModal?: { limit: ApiLimitTypeWithModal; }; diff --git a/src/limits.ts b/src/limits.ts index 29e4b192f..c9bdbc5a5 100644 --- a/src/limits.ts +++ b/src/limits.ts @@ -110,6 +110,7 @@ export const DEFAULT_APP_CONFIG: ApiAppConfig = { 'animated_userpics', 'premium_stickers', 'effects', + 'pm_noforwards', ], isPremiumPurchaseBlocked: false, maxUniqueReactions: 11, @@ -129,6 +130,7 @@ export const DEFAULT_APP_CONFIG: ApiAppConfig = { starsSuggestedPostFutureMin: 300, starsSuggestedPostFutureMax: 2678400, starsSuggestedPostCommissionPermille: 850, + noForwardsRequestExpirePeriod: 86400, tonSuggestedPostCommissionPermille: 850, todoItemLengthMax: 64, todoItemsMax: 30, diff --git a/src/styles/icons.css b/src/styles/icons.css index 1810a8052..1858b9d41 100644 --- a/src/styles/icons.css +++ b/src/styles/icons.css @@ -3,8 +3,8 @@ font-weight: normal; font-style: normal; font-display: block; - src: url("./icons.woff2?533a93d931439ea631191a01b52e3eec") format("woff2"), -url("./icons.woff?533a93d931439ea631191a01b52e3eec") format("woff"); + src: url("./icons.woff2?4ca2ae9f8c7763ea420459de680c8340") format("woff2"), +url("./icons.woff?4ca2ae9f8c7763ea420459de680c8340") format("woff"); } .icon-char::before { @@ -21,972 +21,987 @@ url("./icons.woff?533a93d931439ea631191a01b52e3eec") format("woff"); width: 1em; } -.icon-active-sessions::before { +.icon-zoom-out::before { content: "\f101"; } -.icon-add-caption::before { +.icon-zoom-in::before { content: "\f102"; } -.icon-add-filled::before { +.icon-word-wrap::before { content: "\f103"; } -.icon-add-one-badge::before { +.icon-webapp::before { content: "\f104"; } -.icon-add-user-filled::before { +.icon-web::before { content: "\f105"; } -.icon-add-user::before { +.icon-warning::before { content: "\f106"; } -.icon-add::before { +.icon-volume-3::before { content: "\f107"; } -.icon-admin::before { +.icon-volume-2::before { content: "\f108"; } -.icon-allow-speak::before { +.icon-volume-1::before { content: "\f109"; } -.icon-animals::before { +.icon-voice-chat::before { content: "\f10a"; } -.icon-animations::before { +.icon-view-once::before { content: "\f10b"; } -.icon-archive-filled::before { +.icon-video::before { content: "\f10c"; } -.icon-archive-from-main::before { +.icon-video-stop::before { content: "\f10d"; } -.icon-archive-to-main::before { +.icon-video-outlined::before { content: "\f10e"; } -.icon-archive::before { +.icon-user::before { content: "\f10f"; } -.icon-arrow-down-circle::before { +.icon-user-tag::before { content: "\f110"; } -.icon-arrow-down::before { +.icon-user-stars::before { content: "\f111"; } -.icon-arrow-left::before { +.icon-user-online::before { content: "\f112"; } -.icon-arrow-right::before { +.icon-user-filled::before { content: "\f113"; } -.icon-ask-support::before { +.icon-up::before { content: "\f114"; } -.icon-attach::before { +.icon-unread::before { content: "\f115"; } -.icon-auction-drop::before { +.icon-unpin::before { content: "\f116"; } -.icon-auction-filled::before { +.icon-unmute::before { content: "\f117"; } -.icon-auction-next-round::before { +.icon-unlock::before { content: "\f118"; } -.icon-auction::before { +.icon-unlock-badge::before { content: "\f119"; } -.icon-author-hidden::before { +.icon-unlist::before { content: "\f11a"; } -.icon-avatar-archived-chats::before { +.icon-unlist-outline::before { content: "\f11b"; } -.icon-avatar-deleted-account::before { +.icon-unique-profile::before { content: "\f11c"; } -.icon-avatar-saved-messages::before { +.icon-undo::before { content: "\f11d"; } -.icon-bold::before { +.icon-understood::before { content: "\f11e"; } -.icon-boost-craft-chance::before { +.icon-underlined::before { content: "\f11f"; } -.icon-boost-outline::before { +.icon-unarchive::before { content: "\f120"; } -.icon-boost::before { +.icon-truck::before { content: "\f121"; } -.icon-boostcircle::before { +.icon-transcribe::before { content: "\f122"; } -.icon-boosts::before { +.icon-trade::before { content: "\f123"; } -.icon-bot-command::before { +.icon-topic-new::before { content: "\f124"; } -.icon-bot-commands-filled::before { +.icon-tools::before { content: "\f125"; } -.icon-bots::before { +.icon-toncoin::before { content: "\f126"; } -.icon-brush::before { +.icon-timer::before { content: "\f127"; } -.icon-bug::before { +.icon-tag::before { content: "\f128"; } -.icon-calendar-filter::before { +.icon-tag-name::before { content: "\f129"; } -.icon-calendar::before { +.icon-tag-filter::before { content: "\f12a"; } -.icon-camera-add::before { +.icon-tag-crossed::before { content: "\f12b"; } -.icon-camera::before { +.icon-tag-add::before { content: "\f12c"; } -.icon-car::before { +.icon-strikethrough::before { content: "\f12d"; } -.icon-card::before { +.icon-story-reply::before { content: "\f12e"; } -.icon-cash-circle::before { +.icon-story-priority::before { content: "\f12f"; } -.icon-channel-filled::before { +.icon-story-expired::before { content: "\f130"; } -.icon-channel::before { +.icon-story-caption::before { content: "\f131"; } -.icon-channelviews::before { +.icon-stop::before { content: "\f132"; } -.icon-chat-badge::before { +.icon-stop-raising-hand::before { content: "\f133"; } -.icon-chats-badge::before { +.icon-stickers::before { content: "\f134"; } -.icon-check::before { +.icon-stealth-past::before { content: "\f135"; } -.icon-clock-edit::before { +.icon-stealth-future::before { content: "\f136"; } -.icon-clock::before { +.icon-stats::before { content: "\f137"; } -.icon-close-circle::before { +.icon-stars-refund::before { content: "\f138"; } -.icon-close-topic::before { +.icon-stars-lock::before { content: "\f139"; } -.icon-close::before { +.icon-star::before { content: "\f13a"; } -.icon-closed-gift::before { +.icon-sport::before { content: "\f13b"; } -.icon-cloud-download::before { +.icon-spoiler::before { content: "\f13c"; } -.icon-collapse-modal::before { +.icon-spoiler-disable::before { content: "\f13d"; } -.icon-collapse::before { +.icon-speaker::before { content: "\f13e"; } -.icon-colorize::before { +.icon-speaker-story::before { content: "\f13f"; } -.icon-combine-craft::before { +.icon-speaker-outline::before { content: "\f140"; } -.icon-comments-sticker::before { +.icon-speaker-muted-story::before { content: "\f141"; } -.icon-comments::before { +.icon-sort::before { content: "\f142"; } -.icon-copy-media::before { +.icon-sort-by-price::before { content: "\f143"; } -.icon-copy::before { +.icon-sort-by-number::before { content: "\f144"; } -.icon-craft::before { +.icon-sort-by-date::before { content: "\f145"; } -.icon-crop::before { +.icon-smile::before { content: "\f146"; } -.icon-crown-take-off-outline::before { +.icon-smallscreen::before { content: "\f147"; } -.icon-crown-take-off::before { +.icon-skip-previous::before { content: "\f148"; } -.icon-crown-wear-outline::before { +.icon-skip-next::before { content: "\f149"; } -.icon-crown-wear::before { +.icon-sidebar::before { content: "\f14a"; } -.icon-darkmode::before { +.icon-show-message::before { content: "\f14b"; } -.icon-data::before { +.icon-share-screen::before { content: "\f14c"; } -.icon-delete-filled::before { +.icon-share-screen-stop::before { content: "\f14d"; } -.icon-delete-left::before { +.icon-share-screen-outlined::before { content: "\f14e"; } -.icon-delete-user::before { +.icon-share-filled::before { content: "\f14f"; } -.icon-delete::before { +.icon-settings::before { content: "\f150"; } -.icon-diamond::before { +.icon-settings-filled::before { content: "\f151"; } -.icon-document::before { +.icon-send::before { content: "\f152"; } -.icon-double-badge::before { +.icon-send-outline::before { content: "\f153"; } -.icon-down::before { +.icon-sell::before { content: "\f154"; } -.icon-download::before { +.icon-sell-outline::before { content: "\f155"; } -.icon-dropdown-arrows::before { +.icon-select::before { content: "\f156"; } -.icon-eats::before { +.icon-select-filled::before { content: "\f157"; } -.icon-edit::before { +.icon-search::before { content: "\f158"; } -.icon-email::before { +.icon-sd-photo::before { content: "\f159"; } -.icon-enter::before { +.icon-scheduled::before { content: "\f15a"; } -.icon-expand-modal::before { +.icon-schedule::before { content: "\f15b"; } -.icon-expand::before { +.icon-saved-messages::before { content: "\f15c"; } -.icon-eye-crossed-outline::before { +.icon-save-story::before { content: "\f15d"; } -.icon-eye-crossed::before { +.icon-rotate::before { content: "\f15e"; } -.icon-eye-outline::before { +.icon-revote::before { content: "\f15f"; } -.icon-eye::before { +.icon-revenue-split::before { content: "\f160"; } -.icon-favorite-filled::before { +.icon-reply::before { content: "\f161"; } -.icon-favorite::before { +.icon-reply-filled::before { content: "\f162"; } -.icon-file-badge::before { +.icon-replies::before { content: "\f163"; } -.icon-flag::before { +.icon-replace::before { content: "\f164"; } -.icon-flip::before { +.icon-reorder-tabs::before { content: "\f165"; } -.icon-folder-badge::before { +.icon-reopen-topic::before { content: "\f166"; } -.icon-folder-tabs-bot::before { +.icon-remove::before { content: "\f167"; } -.icon-folder-tabs-channel::before { +.icon-remove-quote::before { content: "\f168"; } -.icon-folder-tabs-chat::before { +.icon-reload::before { content: "\f169"; } -.icon-folder-tabs-chats::before { +.icon-refund::before { content: "\f16a"; } -.icon-folder-tabs-folder::before { +.icon-redo::before { content: "\f16b"; } -.icon-folder-tabs-group::before { +.icon-recent::before { content: "\f16c"; } -.icon-folder-tabs-star::before { +.icon-readchats::before { content: "\f16d"; } -.icon-folder-tabs-user::before { +.icon-radial-badge::before { content: "\f16e"; } -.icon-folder::before { +.icon-quote::before { content: "\f16f"; } -.icon-fontsize::before { +.icon-quote-text::before { content: "\f170"; } -.icon-forums::before { +.icon-proof-of-ownership::before { content: "\f171"; } -.icon-forward::before { +.icon-privacy-policy::before { content: "\f172"; } -.icon-fragment::before { +.icon-previous::before { content: "\f173"; } -.icon-frozen-time::before { +.icon-poll::before { content: "\f174"; } -.icon-fullscreen::before { +.icon-play::before { content: "\f175"; } -.icon-gifs::before { +.icon-play-story::before { content: "\f176"; } -.icon-gift-transfer-inline::before { +.icon-pip::before { content: "\f177"; } -.icon-gift::before { +.icon-pinned-message::before { content: "\f178"; } -.icon-group-filled::before { +.icon-pinned-chat::before { content: "\f179"; } -.icon-group::before { +.icon-pin::before { content: "\f17a"; } -.icon-grouped-disable::before { +.icon-pin-list::before { content: "\f17b"; } -.icon-grouped::before { +.icon-pin-badge::before { content: "\f17c"; } -.icon-hand-stop::before { +.icon-photo::before { content: "\f17d"; } -.icon-hashtag::before { +.icon-phone::before { content: "\f17e"; } -.icon-hd-photo::before { +.icon-phone-discard::before { content: "\f17f"; } -.icon-heart-outline::before { +.icon-phone-discard-outline::before { content: "\f180"; } -.icon-heart::before { +.icon-permissions::before { content: "\f181"; } -.icon-help::before { +.icon-pause::before { content: "\f182"; } -.icon-info-filled::before { +.icon-password-off::before { content: "\f183"; } -.icon-info::before { +.icon-open-in-new-tab::before { content: "\f184"; } -.icon-install::before { +.icon-one-filled::before { content: "\f185"; } -.icon-italic::before { +.icon-note::before { content: "\f186"; } -.icon-key::before { +.icon-non-contacts::before { content: "\f187"; } -.icon-keyboard::before { +.icon-noise-suppression::before { content: "\f188"; } -.icon-lamp::before { +.icon-nochannel::before { content: "\f189"; } -.icon-language::before { +.icon-no-share::before { content: "\f18a"; } -.icon-large-pause::before { +.icon-no-download::before { content: "\f18b"; } -.icon-large-play::before { +.icon-next::before { content: "\f18c"; } -.icon-link-badge::before { +.icon-next-link::before { content: "\f18d"; } -.icon-link-broken::before { +.icon-new-chat-filled::before { content: "\f18e"; } -.icon-link::before { +.icon-my-notes::before { content: "\f18f"; } -.icon-location::before { +.icon-muted::before { content: "\f190"; } -.icon-lock-badge::before { +.icon-mute::before { content: "\f191"; } -.icon-lock::before { +.icon-move-caption-up::before { content: "\f192"; } -.icon-logout::before { +.icon-move-caption-down::before { content: "\f193"; } -.icon-loop::before { +.icon-more::before { content: "\f194"; } -.icon-mention::before { +.icon-more-circle::before { content: "\f195"; } -.icon-menu::before { +.icon-monospace::before { content: "\f196"; } -.icon-message-failed::before { +.icon-microphone::before { content: "\f197"; } -.icon-message-pending::before { +.icon-microphone-alt::before { content: "\f198"; } -.icon-message-read::before { +.icon-message::before { content: "\f199"; } .icon-message-succeeded::before { content: "\f19a"; } -.icon-message::before { +.icon-message-read::before { content: "\f19b"; } -.icon-microphone-alt::before { +.icon-message-pending::before { content: "\f19c"; } -.icon-microphone::before { +.icon-message-failed::before { content: "\f19d"; } -.icon-monospace::before { +.icon-menu::before { content: "\f19e"; } -.icon-more-circle::before { +.icon-mention::before { content: "\f19f"; } -.icon-more::before { +.icon-loop::before { content: "\f1a0"; } -.icon-move-caption-down::before { +.icon-logout::before { content: "\f1a1"; } -.icon-move-caption-up::before { +.icon-lock::before { content: "\f1a2"; } -.icon-mute::before { +.icon-lock-badge::before { content: "\f1a3"; } -.icon-muted::before { +.icon-location::before { content: "\f1a4"; } -.icon-my-notes::before { +.icon-link::before { content: "\f1a5"; } -.icon-new-chat-filled::before { +.icon-link-broken::before { content: "\f1a6"; } -.icon-next-link::before { +.icon-link-badge::before { content: "\f1a7"; } -.icon-next::before { +.icon-large-play::before { content: "\f1a8"; } -.icon-nochannel::before { +.icon-large-pause::before { content: "\f1a9"; } -.icon-noise-suppression::before { +.icon-language::before { content: "\f1aa"; } -.icon-non-contacts::before { +.icon-lamp::before { content: "\f1ab"; } -.icon-note::before { +.icon-keyboard::before { content: "\f1ac"; } -.icon-one-filled::before { +.icon-key::before { content: "\f1ad"; } -.icon-open-in-new-tab::before { +.icon-italic::before { content: "\f1ae"; } -.icon-password-off::before { +.icon-install::before { content: "\f1af"; } -.icon-pause::before { +.icon-info::before { content: "\f1b0"; } -.icon-permissions::before { +.icon-info-filled::before { content: "\f1b1"; } -.icon-phone-discard-outline::before { +.icon-help::before { content: "\f1b2"; } -.icon-phone-discard::before { +.icon-heart::before { content: "\f1b3"; } -.icon-phone::before { +.icon-heart-outline::before { content: "\f1b4"; } -.icon-photo::before { +.icon-hd-photo::before { content: "\f1b5"; } -.icon-pin-badge::before { +.icon-hashtag::before { content: "\f1b6"; } -.icon-pin-list::before { +.icon-hand-stop::before { content: "\f1b7"; } -.icon-pin::before { +.icon-hand-stop-filled::before { content: "\f1b8"; } -.icon-pinned-chat::before { +.icon-grouped::before { content: "\f1b9"; } -.icon-pinned-message::before { +.icon-grouped-disable::before { content: "\f1ba"; } -.icon-pip::before { +.icon-group::before { content: "\f1bb"; } -.icon-play-story::before { +.icon-group-filled::before { content: "\f1bc"; } -.icon-play::before { +.icon-gift::before { content: "\f1bd"; } -.icon-poll::before { +.icon-gift-transfer-inline::before { content: "\f1be"; } -.icon-previous::before { +.icon-gifs::before { content: "\f1bf"; } -.icon-privacy-policy::before { +.icon-fullscreen::before { content: "\f1c0"; } -.icon-proof-of-ownership::before { +.icon-frozen-time::before { content: "\f1c1"; } -.icon-quote-text::before { +.icon-fragment::before { content: "\f1c2"; } -.icon-quote::before { +.icon-forward::before { content: "\f1c3"; } -.icon-radial-badge::before { +.icon-forums::before { content: "\f1c4"; } -.icon-rating-icons-level1::before { +.icon-fontsize::before { content: "\f1c5"; } -.icon-rating-icons-level10::before { +.icon-folder::before { content: "\f1c6"; } -.icon-rating-icons-level2::before { +.icon-folder-badge::before { content: "\f1c7"; } -.icon-rating-icons-level20::before { +.icon-flip::before { content: "\f1c8"; } -.icon-rating-icons-level3::before { +.icon-flag::before { content: "\f1c9"; } -.icon-rating-icons-level30::before { +.icon-file-badge::before { content: "\f1ca"; } -.icon-rating-icons-level4::before { +.icon-favorite::before { content: "\f1cb"; } -.icon-rating-icons-level40::before { +.icon-favorite-filled::before { content: "\f1cc"; } -.icon-rating-icons-level5::before { +.icon-eye::before { content: "\f1cd"; } -.icon-rating-icons-level50::before { +.icon-eye-outline::before { content: "\f1ce"; } -.icon-rating-icons-level6::before { +.icon-eye-crossed::before { content: "\f1cf"; } -.icon-rating-icons-level60::before { +.icon-eye-crossed-outline::before { content: "\f1d0"; } -.icon-rating-icons-level7::before { +.icon-expand::before { content: "\f1d1"; } -.icon-rating-icons-level70::before { +.icon-expand-modal::before { content: "\f1d2"; } -.icon-rating-icons-level8::before { +.icon-enter::before { content: "\f1d3"; } -.icon-rating-icons-level80::before { +.icon-email::before { content: "\f1d4"; } -.icon-rating-icons-level9::before { +.icon-edit::before { content: "\f1d5"; } -.icon-rating-icons-level90::before { +.icon-eats::before { content: "\f1d6"; } -.icon-rating-icons-negative::before { +.icon-dropdown-arrows::before { content: "\f1d7"; } -.icon-readchats::before { +.icon-download::before { content: "\f1d8"; } -.icon-recent::before { +.icon-down::before { content: "\f1d9"; } -.icon-redo::before { +.icon-double-badge::before { content: "\f1da"; } -.icon-refund::before { +.icon-document::before { content: "\f1db"; } -.icon-reload::before { +.icon-diamond::before { content: "\f1dc"; } -.icon-remove-quote::before { +.icon-delete::before { content: "\f1dd"; } -.icon-remove::before { +.icon-delete-user::before { content: "\f1de"; } -.icon-reopen-topic::before { +.icon-delete-left::before { content: "\f1df"; } -.icon-reorder-tabs::before { +.icon-delete-filled::before { content: "\f1e0"; } -.icon-replace::before { +.icon-data::before { content: "\f1e1"; } -.icon-replies::before { +.icon-darkmode::before { content: "\f1e2"; } -.icon-reply-filled::before { +.icon-crown-wear::before { content: "\f1e3"; } -.icon-reply::before { +.icon-crown-wear-outline::before { content: "\f1e4"; } -.icon-revenue-split::before { +.icon-crown-take-off::before { content: "\f1e5"; } -.icon-revote::before { +.icon-crown-take-off-outline::before { content: "\f1e6"; } -.icon-rotate::before { +.icon-crop::before { content: "\f1e7"; } -.icon-save-story::before { +.icon-craft::before { content: "\f1e8"; } -.icon-saved-messages::before { +.icon-copy::before { content: "\f1e9"; } -.icon-schedule::before { +.icon-copy-media::before { content: "\f1ea"; } -.icon-scheduled::before { +.icon-comments::before { content: "\f1eb"; } -.icon-sd-photo::before { +.icon-comments-sticker::before { content: "\f1ec"; } -.icon-search::before { +.icon-combine-craft::before { content: "\f1ed"; } -.icon-select::before { +.icon-colorize::before { content: "\f1ee"; } -.icon-sell-outline::before { +.icon-collapse::before { content: "\f1ef"; } -.icon-sell::before { +.icon-collapse-modal::before { content: "\f1f0"; } -.icon-send-outline::before { +.icon-cloud-download::before { content: "\f1f1"; } -.icon-send::before { +.icon-closed-gift::before { content: "\f1f2"; } -.icon-settings-filled::before { +.icon-close::before { content: "\f1f3"; } -.icon-settings::before { +.icon-close-topic::before { content: "\f1f4"; } -.icon-share-filled::before { +.icon-close-circle::before { content: "\f1f5"; } -.icon-share-screen-outlined::before { +.icon-clock::before { content: "\f1f6"; } -.icon-share-screen-stop::before { +.icon-clock-edit::before { content: "\f1f7"; } -.icon-share-screen::before { +.icon-check::before { content: "\f1f8"; } -.icon-show-message::before { +.icon-chats-badge::before { content: "\f1f9"; } -.icon-sidebar::before { +.icon-chat-badge::before { content: "\f1fa"; } -.icon-skip-next::before { +.icon-channelviews::before { content: "\f1fb"; } -.icon-skip-previous::before { +.icon-channel::before { content: "\f1fc"; } -.icon-smallscreen::before { +.icon-channel-filled::before { content: "\f1fd"; } -.icon-smile::before { +.icon-cash-circle::before { content: "\f1fe"; } -.icon-sort-by-date::before { +.icon-card::before { content: "\f1ff"; } -.icon-sort-by-number::before { +.icon-car::before { content: "\f200"; } -.icon-sort-by-price::before { +.icon-camera::before { content: "\f201"; } -.icon-sort::before { +.icon-camera-add::before { content: "\f202"; } -.icon-speaker-muted-story::before { +.icon-calendar::before { content: "\f203"; } -.icon-speaker-outline::before { +.icon-calendar-filter::before { content: "\f204"; } -.icon-speaker-story::before { +.icon-bug::before { content: "\f205"; } -.icon-speaker::before { +.icon-brush::before { content: "\f206"; } -.icon-spoiler-disable::before { +.icon-bots::before { content: "\f207"; } -.icon-spoiler::before { +.icon-bot-commands-filled::before { content: "\f208"; } -.icon-sport::before { +.icon-bot-command::before { content: "\f209"; } -.icon-star::before { +.icon-boosts::before { content: "\f20a"; } -.icon-stars-lock::before { +.icon-boostcircle::before { content: "\f20b"; } -.icon-stars-refund::before { +.icon-boost::before { content: "\f20c"; } -.icon-stats::before { +.icon-boost-outline::before { content: "\f20d"; } -.icon-stealth-future::before { +.icon-boost-craft-chance::before { content: "\f20e"; } -.icon-stealth-past::before { +.icon-bold::before { content: "\f20f"; } -.icon-stickers::before { +.icon-avatar-saved-messages::before { content: "\f210"; } -.icon-stop-raising-hand::before { +.icon-avatar-deleted-account::before { content: "\f211"; } -.icon-stop::before { +.icon-avatar-archived-chats::before { content: "\f212"; } -.icon-story-caption::before { +.icon-author-hidden::before { content: "\f213"; } -.icon-story-expired::before { +.icon-auction::before { content: "\f214"; } -.icon-story-priority::before { +.icon-auction-next-round::before { content: "\f215"; } -.icon-story-reply::before { +.icon-auction-filled::before { content: "\f216"; } -.icon-strikethrough::before { +.icon-auction-drop::before { content: "\f217"; } -.icon-tag-add::before { +.icon-attach::before { content: "\f218"; } -.icon-tag-crossed::before { +.icon-ask-support::before { content: "\f219"; } -.icon-tag-filter::before { +.icon-arrow-right::before { content: "\f21a"; } -.icon-tag-name::before { +.icon-arrow-left::before { content: "\f21b"; } -.icon-tag::before { +.icon-arrow-down::before { content: "\f21c"; } -.icon-timer::before { +.icon-arrow-down-circle::before { content: "\f21d"; } -.icon-toncoin::before { +.icon-archive::before { content: "\f21e"; } -.icon-tools::before { +.icon-archive-to-main::before { content: "\f21f"; } -.icon-topic-new::before { +.icon-archive-from-main::before { content: "\f220"; } -.icon-trade::before { +.icon-archive-filled::before { content: "\f221"; } -.icon-transcribe::before { +.icon-animations::before { content: "\f222"; } -.icon-truck::before { +.icon-animals::before { content: "\f223"; } -.icon-unarchive::before { +.icon-allow-speak::before { content: "\f224"; } -.icon-underlined::before { +.icon-allow-share::before { content: "\f225"; } -.icon-understood::before { +.icon-admin::before { content: "\f226"; } -.icon-undo::before { +.icon-add::before { content: "\f227"; } -.icon-unique-profile::before { +.icon-add-user::before { content: "\f228"; } -.icon-unlist-outline::before { +.icon-add-user-filled::before { content: "\f229"; } -.icon-unlist::before { +.icon-add-one-badge::before { content: "\f22a"; } -.icon-unlock-badge::before { +.icon-add-filled::before { content: "\f22b"; } -.icon-unlock::before { +.icon-add-caption::before { content: "\f22c"; } -.icon-unmute::before { +.icon-active-sessions::before { content: "\f22d"; } -.icon-unpin::before { +.icon-rating-icons-negative::before { content: "\f22e"; } -.icon-unread::before { +.icon-rating-icons-level90::before { content: "\f22f"; } -.icon-up::before { +.icon-rating-icons-level9::before { content: "\f230"; } -.icon-user-filled::before { +.icon-rating-icons-level80::before { content: "\f231"; } -.icon-user-online::before { +.icon-rating-icons-level8::before { content: "\f232"; } -.icon-user-stars::before { +.icon-rating-icons-level70::before { content: "\f233"; } -.icon-user-tag::before { +.icon-rating-icons-level7::before { content: "\f234"; } -.icon-user::before { +.icon-rating-icons-level60::before { content: "\f235"; } -.icon-video-outlined::before { +.icon-rating-icons-level6::before { content: "\f236"; } -.icon-video-stop::before { +.icon-rating-icons-level50::before { content: "\f237"; } -.icon-video::before { +.icon-rating-icons-level5::before { content: "\f238"; } -.icon-view-once::before { +.icon-rating-icons-level40::before { content: "\f239"; } -.icon-voice-chat::before { +.icon-rating-icons-level4::before { content: "\f23a"; } -.icon-volume-1::before { +.icon-rating-icons-level30::before { content: "\f23b"; } -.icon-volume-2::before { +.icon-rating-icons-level3::before { content: "\f23c"; } -.icon-volume-3::before { +.icon-rating-icons-level20::before { content: "\f23d"; } -.icon-warning::before { +.icon-rating-icons-level2::before { content: "\f23e"; } -.icon-web::before { +.icon-rating-icons-level10::before { content: "\f23f"; } -.icon-webapp::before { +.icon-rating-icons-level1::before { content: "\f240"; } -.icon-word-wrap::before { +.icon-folder-tabs-user::before { content: "\f241"; } -.icon-zoom-in::before { +.icon-folder-tabs-star::before { content: "\f242"; } -.icon-zoom-out::before { +.icon-folder-tabs-group::before { content: "\f243"; } +.icon-folder-tabs-folder::before { + content: "\f244"; +} +.icon-folder-tabs-chats::before { + content: "\f245"; +} +.icon-folder-tabs-chat::before { + content: "\f246"; +} +.icon-folder-tabs-channel::before { + content: "\f247"; +} +.icon-folder-tabs-bot::before { + content: "\f248"; +} diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 3c878ac5a..607781dfa 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -16,327 +16,332 @@ } $icons-map: ( - "active-sessions": "\f101", - "add-caption": "\f102", - "add-filled": "\f103", - "add-one-badge": "\f104", - "add-user-filled": "\f105", - "add-user": "\f106", - "add": "\f107", - "admin": "\f108", - "allow-speak": "\f109", - "animals": "\f10a", - "animations": "\f10b", - "archive-filled": "\f10c", - "archive-from-main": "\f10d", - "archive-to-main": "\f10e", - "archive": "\f10f", - "arrow-down-circle": "\f110", - "arrow-down": "\f111", - "arrow-left": "\f112", - "arrow-right": "\f113", - "ask-support": "\f114", - "attach": "\f115", - "auction-drop": "\f116", - "auction-filled": "\f117", - "auction-next-round": "\f118", - "auction": "\f119", - "author-hidden": "\f11a", - "avatar-archived-chats": "\f11b", - "avatar-deleted-account": "\f11c", - "avatar-saved-messages": "\f11d", - "bold": "\f11e", - "boost-craft-chance": "\f11f", - "boost-outline": "\f120", - "boost": "\f121", - "boostcircle": "\f122", - "boosts": "\f123", - "bot-command": "\f124", - "bot-commands-filled": "\f125", - "bots": "\f126", - "brush": "\f127", - "bug": "\f128", - "calendar-filter": "\f129", - "calendar": "\f12a", - "camera-add": "\f12b", - "camera": "\f12c", - "car": "\f12d", - "card": "\f12e", - "cash-circle": "\f12f", - "channel-filled": "\f130", - "channel": "\f131", - "channelviews": "\f132", - "chat-badge": "\f133", - "chats-badge": "\f134", - "check": "\f135", - "clock-edit": "\f136", - "clock": "\f137", - "close-circle": "\f138", - "close-topic": "\f139", - "close": "\f13a", - "closed-gift": "\f13b", - "cloud-download": "\f13c", - "collapse-modal": "\f13d", - "collapse": "\f13e", - "colorize": "\f13f", - "combine-craft": "\f140", - "comments-sticker": "\f141", - "comments": "\f142", - "copy-media": "\f143", - "copy": "\f144", - "craft": "\f145", - "crop": "\f146", - "crown-take-off-outline": "\f147", - "crown-take-off": "\f148", - "crown-wear-outline": "\f149", - "crown-wear": "\f14a", - "darkmode": "\f14b", - "data": "\f14c", - "delete-filled": "\f14d", - "delete-left": "\f14e", - "delete-user": "\f14f", - "delete": "\f150", - "diamond": "\f151", - "document": "\f152", - "double-badge": "\f153", - "down": "\f154", - "download": "\f155", - "dropdown-arrows": "\f156", - "eats": "\f157", - "edit": "\f158", - "email": "\f159", - "enter": "\f15a", - "expand-modal": "\f15b", - "expand": "\f15c", - "eye-crossed-outline": "\f15d", - "eye-crossed": "\f15e", - "eye-outline": "\f15f", - "eye": "\f160", - "favorite-filled": "\f161", - "favorite": "\f162", - "file-badge": "\f163", - "flag": "\f164", - "flip": "\f165", - "folder-badge": "\f166", - "folder-tabs-bot": "\f167", - "folder-tabs-channel": "\f168", - "folder-tabs-chat": "\f169", - "folder-tabs-chats": "\f16a", - "folder-tabs-folder": "\f16b", - "folder-tabs-group": "\f16c", - "folder-tabs-star": "\f16d", - "folder-tabs-user": "\f16e", - "folder": "\f16f", - "fontsize": "\f170", - "forums": "\f171", - "forward": "\f172", - "fragment": "\f173", - "frozen-time": "\f174", - "fullscreen": "\f175", - "gifs": "\f176", - "gift-transfer-inline": "\f177", - "gift": "\f178", - "group-filled": "\f179", - "group": "\f17a", - "grouped-disable": "\f17b", - "grouped": "\f17c", - "hand-stop": "\f17d", - "hashtag": "\f17e", - "hd-photo": "\f17f", - "heart-outline": "\f180", - "heart": "\f181", - "help": "\f182", - "info-filled": "\f183", - "info": "\f184", - "install": "\f185", - "italic": "\f186", - "key": "\f187", - "keyboard": "\f188", - "lamp": "\f189", - "language": "\f18a", - "large-pause": "\f18b", - "large-play": "\f18c", - "link-badge": "\f18d", - "link-broken": "\f18e", - "link": "\f18f", - "location": "\f190", - "lock-badge": "\f191", - "lock": "\f192", - "logout": "\f193", - "loop": "\f194", - "mention": "\f195", - "menu": "\f196", - "message-failed": "\f197", - "message-pending": "\f198", - "message-read": "\f199", + "zoom-out": "\f101", + "zoom-in": "\f102", + "word-wrap": "\f103", + "webapp": "\f104", + "web": "\f105", + "warning": "\f106", + "volume-3": "\f107", + "volume-2": "\f108", + "volume-1": "\f109", + "voice-chat": "\f10a", + "view-once": "\f10b", + "video": "\f10c", + "video-stop": "\f10d", + "video-outlined": "\f10e", + "user": "\f10f", + "user-tag": "\f110", + "user-stars": "\f111", + "user-online": "\f112", + "user-filled": "\f113", + "up": "\f114", + "unread": "\f115", + "unpin": "\f116", + "unmute": "\f117", + "unlock": "\f118", + "unlock-badge": "\f119", + "unlist": "\f11a", + "unlist-outline": "\f11b", + "unique-profile": "\f11c", + "undo": "\f11d", + "understood": "\f11e", + "underlined": "\f11f", + "unarchive": "\f120", + "truck": "\f121", + "transcribe": "\f122", + "trade": "\f123", + "topic-new": "\f124", + "tools": "\f125", + "toncoin": "\f126", + "timer": "\f127", + "tag": "\f128", + "tag-name": "\f129", + "tag-filter": "\f12a", + "tag-crossed": "\f12b", + "tag-add": "\f12c", + "strikethrough": "\f12d", + "story-reply": "\f12e", + "story-priority": "\f12f", + "story-expired": "\f130", + "story-caption": "\f131", + "stop": "\f132", + "stop-raising-hand": "\f133", + "stickers": "\f134", + "stealth-past": "\f135", + "stealth-future": "\f136", + "stats": "\f137", + "stars-refund": "\f138", + "stars-lock": "\f139", + "star": "\f13a", + "sport": "\f13b", + "spoiler": "\f13c", + "spoiler-disable": "\f13d", + "speaker": "\f13e", + "speaker-story": "\f13f", + "speaker-outline": "\f140", + "speaker-muted-story": "\f141", + "sort": "\f142", + "sort-by-price": "\f143", + "sort-by-number": "\f144", + "sort-by-date": "\f145", + "smile": "\f146", + "smallscreen": "\f147", + "skip-previous": "\f148", + "skip-next": "\f149", + "sidebar": "\f14a", + "show-message": "\f14b", + "share-screen": "\f14c", + "share-screen-stop": "\f14d", + "share-screen-outlined": "\f14e", + "share-filled": "\f14f", + "settings": "\f150", + "settings-filled": "\f151", + "send": "\f152", + "send-outline": "\f153", + "sell": "\f154", + "sell-outline": "\f155", + "select": "\f156", + "select-filled": "\f157", + "search": "\f158", + "sd-photo": "\f159", + "scheduled": "\f15a", + "schedule": "\f15b", + "saved-messages": "\f15c", + "save-story": "\f15d", + "rotate": "\f15e", + "revote": "\f15f", + "revenue-split": "\f160", + "reply": "\f161", + "reply-filled": "\f162", + "replies": "\f163", + "replace": "\f164", + "reorder-tabs": "\f165", + "reopen-topic": "\f166", + "remove": "\f167", + "remove-quote": "\f168", + "reload": "\f169", + "refund": "\f16a", + "redo": "\f16b", + "recent": "\f16c", + "readchats": "\f16d", + "radial-badge": "\f16e", + "quote": "\f16f", + "quote-text": "\f170", + "proof-of-ownership": "\f171", + "privacy-policy": "\f172", + "previous": "\f173", + "poll": "\f174", + "play": "\f175", + "play-story": "\f176", + "pip": "\f177", + "pinned-message": "\f178", + "pinned-chat": "\f179", + "pin": "\f17a", + "pin-list": "\f17b", + "pin-badge": "\f17c", + "photo": "\f17d", + "phone": "\f17e", + "phone-discard": "\f17f", + "phone-discard-outline": "\f180", + "permissions": "\f181", + "pause": "\f182", + "password-off": "\f183", + "open-in-new-tab": "\f184", + "one-filled": "\f185", + "note": "\f186", + "non-contacts": "\f187", + "noise-suppression": "\f188", + "nochannel": "\f189", + "no-share": "\f18a", + "no-download": "\f18b", + "next": "\f18c", + "next-link": "\f18d", + "new-chat-filled": "\f18e", + "my-notes": "\f18f", + "muted": "\f190", + "mute": "\f191", + "move-caption-up": "\f192", + "move-caption-down": "\f193", + "more": "\f194", + "more-circle": "\f195", + "monospace": "\f196", + "microphone": "\f197", + "microphone-alt": "\f198", + "message": "\f199", "message-succeeded": "\f19a", - "message": "\f19b", - "microphone-alt": "\f19c", - "microphone": "\f19d", - "monospace": "\f19e", - "more-circle": "\f19f", - "more": "\f1a0", - "move-caption-down": "\f1a1", - "move-caption-up": "\f1a2", - "mute": "\f1a3", - "muted": "\f1a4", - "my-notes": "\f1a5", - "new-chat-filled": "\f1a6", - "next-link": "\f1a7", - "next": "\f1a8", - "nochannel": "\f1a9", - "noise-suppression": "\f1aa", - "non-contacts": "\f1ab", - "note": "\f1ac", - "one-filled": "\f1ad", - "open-in-new-tab": "\f1ae", - "password-off": "\f1af", - "pause": "\f1b0", - "permissions": "\f1b1", - "phone-discard-outline": "\f1b2", - "phone-discard": "\f1b3", - "phone": "\f1b4", - "photo": "\f1b5", - "pin-badge": "\f1b6", - "pin-list": "\f1b7", - "pin": "\f1b8", - "pinned-chat": "\f1b9", - "pinned-message": "\f1ba", - "pip": "\f1bb", - "play-story": "\f1bc", - "play": "\f1bd", - "poll": "\f1be", - "previous": "\f1bf", - "privacy-policy": "\f1c0", - "proof-of-ownership": "\f1c1", - "quote-text": "\f1c2", - "quote": "\f1c3", - "radial-badge": "\f1c4", - "rating-icons-level1": "\f1c5", - "rating-icons-level10": "\f1c6", - "rating-icons-level2": "\f1c7", - "rating-icons-level20": "\f1c8", - "rating-icons-level3": "\f1c9", - "rating-icons-level30": "\f1ca", - "rating-icons-level4": "\f1cb", - "rating-icons-level40": "\f1cc", - "rating-icons-level5": "\f1cd", - "rating-icons-level50": "\f1ce", - "rating-icons-level6": "\f1cf", - "rating-icons-level60": "\f1d0", - "rating-icons-level7": "\f1d1", - "rating-icons-level70": "\f1d2", - "rating-icons-level8": "\f1d3", - "rating-icons-level80": "\f1d4", - "rating-icons-level9": "\f1d5", - "rating-icons-level90": "\f1d6", - "rating-icons-negative": "\f1d7", - "readchats": "\f1d8", - "recent": "\f1d9", - "redo": "\f1da", - "refund": "\f1db", - "reload": "\f1dc", - "remove-quote": "\f1dd", - "remove": "\f1de", - "reopen-topic": "\f1df", - "reorder-tabs": "\f1e0", - "replace": "\f1e1", - "replies": "\f1e2", - "reply-filled": "\f1e3", - "reply": "\f1e4", - "revenue-split": "\f1e5", - "revote": "\f1e6", - "rotate": "\f1e7", - "save-story": "\f1e8", - "saved-messages": "\f1e9", - "schedule": "\f1ea", - "scheduled": "\f1eb", - "sd-photo": "\f1ec", - "search": "\f1ed", - "select": "\f1ee", - "sell-outline": "\f1ef", - "sell": "\f1f0", - "send-outline": "\f1f1", - "send": "\f1f2", - "settings-filled": "\f1f3", - "settings": "\f1f4", - "share-filled": "\f1f5", - "share-screen-outlined": "\f1f6", - "share-screen-stop": "\f1f7", - "share-screen": "\f1f8", - "show-message": "\f1f9", - "sidebar": "\f1fa", - "skip-next": "\f1fb", - "skip-previous": "\f1fc", - "smallscreen": "\f1fd", - "smile": "\f1fe", - "sort-by-date": "\f1ff", - "sort-by-number": "\f200", - "sort-by-price": "\f201", - "sort": "\f202", - "speaker-muted-story": "\f203", - "speaker-outline": "\f204", - "speaker-story": "\f205", - "speaker": "\f206", - "spoiler-disable": "\f207", - "spoiler": "\f208", - "sport": "\f209", - "star": "\f20a", - "stars-lock": "\f20b", - "stars-refund": "\f20c", - "stats": "\f20d", - "stealth-future": "\f20e", - "stealth-past": "\f20f", - "stickers": "\f210", - "stop-raising-hand": "\f211", - "stop": "\f212", - "story-caption": "\f213", - "story-expired": "\f214", - "story-priority": "\f215", - "story-reply": "\f216", - "strikethrough": "\f217", - "tag-add": "\f218", - "tag-crossed": "\f219", - "tag-filter": "\f21a", - "tag-name": "\f21b", - "tag": "\f21c", - "timer": "\f21d", - "toncoin": "\f21e", - "tools": "\f21f", - "topic-new": "\f220", - "trade": "\f221", - "transcribe": "\f222", - "truck": "\f223", - "unarchive": "\f224", - "underlined": "\f225", - "understood": "\f226", - "undo": "\f227", - "unique-profile": "\f228", - "unlist-outline": "\f229", - "unlist": "\f22a", - "unlock-badge": "\f22b", - "unlock": "\f22c", - "unmute": "\f22d", - "unpin": "\f22e", - "unread": "\f22f", - "up": "\f230", - "user-filled": "\f231", - "user-online": "\f232", - "user-stars": "\f233", - "user-tag": "\f234", - "user": "\f235", - "video-outlined": "\f236", - "video-stop": "\f237", - "video": "\f238", - "view-once": "\f239", - "voice-chat": "\f23a", - "volume-1": "\f23b", - "volume-2": "\f23c", - "volume-3": "\f23d", - "warning": "\f23e", - "web": "\f23f", - "webapp": "\f240", - "word-wrap": "\f241", - "zoom-in": "\f242", - "zoom-out": "\f243", + "message-read": "\f19b", + "message-pending": "\f19c", + "message-failed": "\f19d", + "menu": "\f19e", + "mention": "\f19f", + "loop": "\f1a0", + "logout": "\f1a1", + "lock": "\f1a2", + "lock-badge": "\f1a3", + "location": "\f1a4", + "link": "\f1a5", + "link-broken": "\f1a6", + "link-badge": "\f1a7", + "large-play": "\f1a8", + "large-pause": "\f1a9", + "language": "\f1aa", + "lamp": "\f1ab", + "keyboard": "\f1ac", + "key": "\f1ad", + "italic": "\f1ae", + "install": "\f1af", + "info": "\f1b0", + "info-filled": "\f1b1", + "help": "\f1b2", + "heart": "\f1b3", + "heart-outline": "\f1b4", + "hd-photo": "\f1b5", + "hashtag": "\f1b6", + "hand-stop": "\f1b7", + "hand-stop-filled": "\f1b8", + "grouped": "\f1b9", + "grouped-disable": "\f1ba", + "group": "\f1bb", + "group-filled": "\f1bc", + "gift": "\f1bd", + "gift-transfer-inline": "\f1be", + "gifs": "\f1bf", + "fullscreen": "\f1c0", + "frozen-time": "\f1c1", + "fragment": "\f1c2", + "forward": "\f1c3", + "forums": "\f1c4", + "fontsize": "\f1c5", + "folder": "\f1c6", + "folder-badge": "\f1c7", + "flip": "\f1c8", + "flag": "\f1c9", + "file-badge": "\f1ca", + "favorite": "\f1cb", + "favorite-filled": "\f1cc", + "eye": "\f1cd", + "eye-outline": "\f1ce", + "eye-crossed": "\f1cf", + "eye-crossed-outline": "\f1d0", + "expand": "\f1d1", + "expand-modal": "\f1d2", + "enter": "\f1d3", + "email": "\f1d4", + "edit": "\f1d5", + "eats": "\f1d6", + "dropdown-arrows": "\f1d7", + "download": "\f1d8", + "down": "\f1d9", + "double-badge": "\f1da", + "document": "\f1db", + "diamond": "\f1dc", + "delete": "\f1dd", + "delete-user": "\f1de", + "delete-left": "\f1df", + "delete-filled": "\f1e0", + "data": "\f1e1", + "darkmode": "\f1e2", + "crown-wear": "\f1e3", + "crown-wear-outline": "\f1e4", + "crown-take-off": "\f1e5", + "crown-take-off-outline": "\f1e6", + "crop": "\f1e7", + "craft": "\f1e8", + "copy": "\f1e9", + "copy-media": "\f1ea", + "comments": "\f1eb", + "comments-sticker": "\f1ec", + "combine-craft": "\f1ed", + "colorize": "\f1ee", + "collapse": "\f1ef", + "collapse-modal": "\f1f0", + "cloud-download": "\f1f1", + "closed-gift": "\f1f2", + "close": "\f1f3", + "close-topic": "\f1f4", + "close-circle": "\f1f5", + "clock": "\f1f6", + "clock-edit": "\f1f7", + "check": "\f1f8", + "chats-badge": "\f1f9", + "chat-badge": "\f1fa", + "channelviews": "\f1fb", + "channel": "\f1fc", + "channel-filled": "\f1fd", + "cash-circle": "\f1fe", + "card": "\f1ff", + "car": "\f200", + "camera": "\f201", + "camera-add": "\f202", + "calendar": "\f203", + "calendar-filter": "\f204", + "bug": "\f205", + "brush": "\f206", + "bots": "\f207", + "bot-commands-filled": "\f208", + "bot-command": "\f209", + "boosts": "\f20a", + "boostcircle": "\f20b", + "boost": "\f20c", + "boost-outline": "\f20d", + "boost-craft-chance": "\f20e", + "bold": "\f20f", + "avatar-saved-messages": "\f210", + "avatar-deleted-account": "\f211", + "avatar-archived-chats": "\f212", + "author-hidden": "\f213", + "auction": "\f214", + "auction-next-round": "\f215", + "auction-filled": "\f216", + "auction-drop": "\f217", + "attach": "\f218", + "ask-support": "\f219", + "arrow-right": "\f21a", + "arrow-left": "\f21b", + "arrow-down": "\f21c", + "arrow-down-circle": "\f21d", + "archive": "\f21e", + "archive-to-main": "\f21f", + "archive-from-main": "\f220", + "archive-filled": "\f221", + "animations": "\f222", + "animals": "\f223", + "allow-speak": "\f224", + "allow-share": "\f225", + "admin": "\f226", + "add": "\f227", + "add-user": "\f228", + "add-user-filled": "\f229", + "add-one-badge": "\f22a", + "add-filled": "\f22b", + "add-caption": "\f22c", + "active-sessions": "\f22d", + "rating-icons-negative": "\f22e", + "rating-icons-level90": "\f22f", + "rating-icons-level9": "\f230", + "rating-icons-level80": "\f231", + "rating-icons-level8": "\f232", + "rating-icons-level70": "\f233", + "rating-icons-level7": "\f234", + "rating-icons-level60": "\f235", + "rating-icons-level6": "\f236", + "rating-icons-level50": "\f237", + "rating-icons-level5": "\f238", + "rating-icons-level40": "\f239", + "rating-icons-level4": "\f23a", + "rating-icons-level30": "\f23b", + "rating-icons-level3": "\f23c", + "rating-icons-level20": "\f23d", + "rating-icons-level2": "\f23e", + "rating-icons-level10": "\f23f", + "rating-icons-level1": "\f240", + "folder-tabs-user": "\f241", + "folder-tabs-star": "\f242", + "folder-tabs-group": "\f243", + "folder-tabs-folder": "\f244", + "folder-tabs-chats": "\f245", + "folder-tabs-chat": "\f246", + "folder-tabs-channel": "\f247", + "folder-tabs-bot": "\f248", ); diff --git a/src/styles/icons.woff b/src/styles/icons.woff index 4bc876138..b18001d45 100644 Binary files a/src/styles/icons.woff and b/src/styles/icons.woff differ diff --git a/src/styles/icons.woff2 b/src/styles/icons.woff2 index 005e0579d..7b4531a8f 100644 Binary files a/src/styles/icons.woff2 and b/src/styles/icons.woff2 differ diff --git a/src/types/icons/font.ts b/src/types/icons/font.ts index 7d1f7f2e4..ba34177fc 100644 --- a/src/types/icons/font.ts +++ b/src/types/icons/font.ts @@ -1,324 +1,329 @@ export type FontIconName = - | 'active-sessions' - | 'add-caption' - | 'add-filled' - | 'add-one-badge' - | 'add-user-filled' - | 'add-user' - | 'add' - | 'admin' - | 'allow-speak' - | 'animals' - | 'animations' - | 'archive-filled' - | 'archive-from-main' - | 'archive-to-main' - | 'archive' - | 'arrow-down-circle' - | 'arrow-down' - | 'arrow-left' - | 'arrow-right' - | 'ask-support' - | 'attach' - | 'auction-drop' - | 'auction-filled' - | 'auction-next-round' - | 'auction' - | 'author-hidden' - | 'avatar-archived-chats' - | 'avatar-deleted-account' - | 'avatar-saved-messages' - | 'bold' - | 'boost-craft-chance' - | 'boost-outline' - | 'boost' - | 'boostcircle' - | 'boosts' - | 'bot-command' - | 'bot-commands-filled' - | 'bots' - | 'brush' - | 'bug' - | 'calendar-filter' - | 'calendar' - | 'camera-add' - | 'camera' - | 'car' - | 'card' - | 'cash-circle' - | 'channel-filled' - | 'channel' - | 'channelviews' - | 'chat-badge' - | 'chats-badge' - | 'check' - | 'clock-edit' - | 'clock' - | 'close-circle' - | 'close-topic' - | 'close' - | 'closed-gift' - | 'cloud-download' - | 'collapse-modal' - | 'collapse' - | 'colorize' - | 'combine-craft' - | 'comments-sticker' - | 'comments' - | 'copy-media' - | 'copy' - | 'craft' - | 'crop' - | 'crown-take-off-outline' - | 'crown-take-off' - | 'crown-wear-outline' - | 'crown-wear' - | 'darkmode' - | 'data' - | 'delete-filled' - | 'delete-left' - | 'delete-user' - | 'delete' - | 'diamond' - | 'document' - | 'double-badge' - | 'down' - | 'download' - | 'dropdown-arrows' - | 'eats' - | 'edit' - | 'email' - | 'enter' - | 'expand-modal' - | 'expand' - | 'eye-crossed-outline' - | 'eye-crossed' - | 'eye-outline' - | 'eye' - | 'favorite-filled' - | 'favorite' - | 'file-badge' - | 'flag' - | 'flip' - | 'folder-badge' - | 'folder-tabs-bot' - | 'folder-tabs-channel' - | 'folder-tabs-chat' - | 'folder-tabs-chats' - | 'folder-tabs-folder' - | 'folder-tabs-group' - | 'folder-tabs-star' - | 'folder-tabs-user' - | 'folder' - | 'fontsize' - | 'forums' - | 'forward' - | 'fragment' - | 'frozen-time' - | 'fullscreen' - | 'gifs' - | 'gift-transfer-inline' - | 'gift' - | 'group-filled' - | 'group' - | 'grouped-disable' - | 'grouped' - | 'hand-stop' - | 'hashtag' - | 'hd-photo' - | 'heart-outline' - | 'heart' - | 'help' - | 'info-filled' - | 'info' - | 'install' - | 'italic' - | 'key' - | 'keyboard' - | 'lamp' - | 'language' - | 'large-pause' - | 'large-play' - | 'link-badge' - | 'link-broken' - | 'link' - | 'location' - | 'lock-badge' - | 'lock' - | 'logout' - | 'loop' - | 'mention' - | 'menu' - | 'message-failed' - | 'message-pending' - | 'message-read' - | 'message-succeeded' - | 'message' - | 'microphone-alt' - | 'microphone' - | 'monospace' - | 'more-circle' - | 'more' - | 'move-caption-down' - | 'move-caption-up' - | 'mute' - | 'muted' - | 'my-notes' - | 'new-chat-filled' - | 'next-link' - | 'next' - | 'nochannel' - | 'noise-suppression' - | 'non-contacts' - | 'note' - | 'one-filled' - | 'open-in-new-tab' - | 'password-off' - | 'pause' - | 'permissions' - | 'phone-discard-outline' - | 'phone-discard' - | 'phone' - | 'photo' - | 'pin-badge' - | 'pin-list' - | 'pin' - | 'pinned-chat' - | 'pinned-message' - | 'pip' - | 'play-story' - | 'play' - | 'poll' - | 'previous' - | 'privacy-policy' - | 'proof-of-ownership' - | 'quote-text' - | 'quote' - | 'radial-badge' - | 'rating-icons-level1' - | 'rating-icons-level10' - | 'rating-icons-level2' - | 'rating-icons-level20' - | 'rating-icons-level3' - | 'rating-icons-level30' - | 'rating-icons-level4' - | 'rating-icons-level40' - | 'rating-icons-level5' - | 'rating-icons-level50' - | 'rating-icons-level6' - | 'rating-icons-level60' - | 'rating-icons-level7' - | 'rating-icons-level70' - | 'rating-icons-level8' - | 'rating-icons-level80' - | 'rating-icons-level9' - | 'rating-icons-level90' - | 'rating-icons-negative' - | 'readchats' - | 'recent' - | 'redo' - | 'refund' - | 'reload' - | 'remove-quote' - | 'remove' - | 'reopen-topic' - | 'reorder-tabs' - | 'replace' - | 'replies' - | 'reply-filled' - | 'reply' - | 'revenue-split' - | 'revote' - | 'rotate' - | 'save-story' - | 'saved-messages' - | 'schedule' - | 'scheduled' - | 'sd-photo' - | 'search' - | 'select' - | 'sell-outline' - | 'sell' - | 'send-outline' - | 'send' - | 'settings-filled' - | 'settings' - | 'share-filled' - | 'share-screen-outlined' - | 'share-screen-stop' - | 'share-screen' - | 'show-message' - | 'sidebar' - | 'skip-next' - | 'skip-previous' - | 'smallscreen' - | 'smile' - | 'sort-by-date' - | 'sort-by-number' - | 'sort-by-price' - | 'sort' - | 'speaker-muted-story' - | 'speaker-outline' - | 'speaker-story' - | 'speaker' - | 'spoiler-disable' - | 'spoiler' - | 'sport' - | 'star' - | 'stars-lock' - | 'stars-refund' - | 'stats' - | 'stealth-future' - | 'stealth-past' - | 'stickers' - | 'stop-raising-hand' - | 'stop' - | 'story-caption' - | 'story-expired' - | 'story-priority' - | 'story-reply' - | 'strikethrough' - | 'tag-add' - | 'tag-crossed' - | 'tag-filter' - | 'tag-name' - | 'tag' - | 'timer' - | 'toncoin' - | 'tools' - | 'topic-new' - | 'trade' - | 'transcribe' - | 'truck' - | 'unarchive' - | 'underlined' - | 'understood' - | 'undo' - | 'unique-profile' - | 'unlist-outline' - | 'unlist' - | 'unlock-badge' - | 'unlock' - | 'unmute' - | 'unpin' - | 'unread' - | 'up' - | 'user-filled' - | 'user-online' - | 'user-stars' - | 'user-tag' - | 'user' - | 'video-outlined' - | 'video-stop' - | 'video' - | 'view-once' - | 'voice-chat' - | 'volume-1' - | 'volume-2' - | 'volume-3' - | 'warning' - | 'web' - | 'webapp' - | 'word-wrap' + | 'zoom-out' | 'zoom-in' - | 'zoom-out'; + | 'word-wrap' + | 'webapp' + | 'web' + | 'warning' + | 'volume-3' + | 'volume-2' + | 'volume-1' + | 'voice-chat' + | 'view-once' + | 'video' + | 'video-stop' + | 'video-outlined' + | 'user' + | 'user-tag' + | 'user-stars' + | 'user-online' + | 'user-filled' + | 'up' + | 'unread' + | 'unpin' + | 'unmute' + | 'unlock' + | 'unlock-badge' + | 'unlist' + | 'unlist-outline' + | 'unique-profile' + | 'undo' + | 'understood' + | 'underlined' + | 'unarchive' + | 'truck' + | 'transcribe' + | 'trade' + | 'topic-new' + | 'tools' + | 'toncoin' + | 'timer' + | 'tag' + | 'tag-name' + | 'tag-filter' + | 'tag-crossed' + | 'tag-add' + | 'strikethrough' + | 'story-reply' + | 'story-priority' + | 'story-expired' + | 'story-caption' + | 'stop' + | 'stop-raising-hand' + | 'stickers' + | 'stealth-past' + | 'stealth-future' + | 'stats' + | 'stars-refund' + | 'stars-lock' + | 'star' + | 'sport' + | 'spoiler' + | 'spoiler-disable' + | 'speaker' + | 'speaker-story' + | 'speaker-outline' + | 'speaker-muted-story' + | 'sort' + | 'sort-by-price' + | 'sort-by-number' + | 'sort-by-date' + | 'smile' + | 'smallscreen' + | 'skip-previous' + | 'skip-next' + | 'sidebar' + | 'show-message' + | 'share-screen' + | 'share-screen-stop' + | 'share-screen-outlined' + | 'share-filled' + | 'settings' + | 'settings-filled' + | 'send' + | 'send-outline' + | 'sell' + | 'sell-outline' + | 'select' + | 'select-filled' + | 'search' + | 'sd-photo' + | 'scheduled' + | 'schedule' + | 'saved-messages' + | 'save-story' + | 'rotate' + | 'revote' + | 'revenue-split' + | 'reply' + | 'reply-filled' + | 'replies' + | 'replace' + | 'reorder-tabs' + | 'reopen-topic' + | 'remove' + | 'remove-quote' + | 'reload' + | 'refund' + | 'redo' + | 'recent' + | 'readchats' + | 'radial-badge' + | 'quote' + | 'quote-text' + | 'proof-of-ownership' + | 'privacy-policy' + | 'previous' + | 'poll' + | 'play' + | 'play-story' + | 'pip' + | 'pinned-message' + | 'pinned-chat' + | 'pin' + | 'pin-list' + | 'pin-badge' + | 'photo' + | 'phone' + | 'phone-discard' + | 'phone-discard-outline' + | 'permissions' + | 'pause' + | 'password-off' + | 'open-in-new-tab' + | 'one-filled' + | 'note' + | 'non-contacts' + | 'noise-suppression' + | 'nochannel' + | 'no-share' + | 'no-download' + | 'next' + | 'next-link' + | 'new-chat-filled' + | 'my-notes' + | 'muted' + | 'mute' + | 'move-caption-up' + | 'move-caption-down' + | 'more' + | 'more-circle' + | 'monospace' + | 'microphone' + | 'microphone-alt' + | 'message' + | 'message-succeeded' + | 'message-read' + | 'message-pending' + | 'message-failed' + | 'menu' + | 'mention' + | 'loop' + | 'logout' + | 'lock' + | 'lock-badge' + | 'location' + | 'link' + | 'link-broken' + | 'link-badge' + | 'large-play' + | 'large-pause' + | 'language' + | 'lamp' + | 'keyboard' + | 'key' + | 'italic' + | 'install' + | 'info' + | 'info-filled' + | 'help' + | 'heart' + | 'heart-outline' + | 'hd-photo' + | 'hashtag' + | 'hand-stop' + | 'hand-stop-filled' + | 'grouped' + | 'grouped-disable' + | 'group' + | 'group-filled' + | 'gift' + | 'gift-transfer-inline' + | 'gifs' + | 'fullscreen' + | 'frozen-time' + | 'fragment' + | 'forward' + | 'forums' + | 'fontsize' + | 'folder' + | 'folder-badge' + | 'flip' + | 'flag' + | 'file-badge' + | 'favorite' + | 'favorite-filled' + | 'eye' + | 'eye-outline' + | 'eye-crossed' + | 'eye-crossed-outline' + | 'expand' + | 'expand-modal' + | 'enter' + | 'email' + | 'edit' + | 'eats' + | 'dropdown-arrows' + | 'download' + | 'down' + | 'double-badge' + | 'document' + | 'diamond' + | 'delete' + | 'delete-user' + | 'delete-left' + | 'delete-filled' + | 'data' + | 'darkmode' + | 'crown-wear' + | 'crown-wear-outline' + | 'crown-take-off' + | 'crown-take-off-outline' + | 'crop' + | 'craft' + | 'copy' + | 'copy-media' + | 'comments' + | 'comments-sticker' + | 'combine-craft' + | 'colorize' + | 'collapse' + | 'collapse-modal' + | 'cloud-download' + | 'closed-gift' + | 'close' + | 'close-topic' + | 'close-circle' + | 'clock' + | 'clock-edit' + | 'check' + | 'chats-badge' + | 'chat-badge' + | 'channelviews' + | 'channel' + | 'channel-filled' + | 'cash-circle' + | 'card' + | 'car' + | 'camera' + | 'camera-add' + | 'calendar' + | 'calendar-filter' + | 'bug' + | 'brush' + | 'bots' + | 'bot-commands-filled' + | 'bot-command' + | 'boosts' + | 'boostcircle' + | 'boost' + | 'boost-outline' + | 'boost-craft-chance' + | 'bold' + | 'avatar-saved-messages' + | 'avatar-deleted-account' + | 'avatar-archived-chats' + | 'author-hidden' + | 'auction' + | 'auction-next-round' + | 'auction-filled' + | 'auction-drop' + | 'attach' + | 'ask-support' + | 'arrow-right' + | 'arrow-left' + | 'arrow-down' + | 'arrow-down-circle' + | 'archive' + | 'archive-to-main' + | 'archive-from-main' + | 'archive-filled' + | 'animations' + | 'animals' + | 'allow-speak' + | 'allow-share' + | 'admin' + | 'add' + | 'add-user' + | 'add-user-filled' + | 'add-one-badge' + | 'add-filled' + | 'add-caption' + | 'active-sessions' + | 'rating-icons-negative' + | 'rating-icons-level90' + | 'rating-icons-level9' + | 'rating-icons-level80' + | 'rating-icons-level8' + | 'rating-icons-level70' + | 'rating-icons-level7' + | 'rating-icons-level60' + | 'rating-icons-level6' + | 'rating-icons-level50' + | 'rating-icons-level5' + | 'rating-icons-level40' + | 'rating-icons-level4' + | 'rating-icons-level30' + | 'rating-icons-level3' + | 'rating-icons-level20' + | 'rating-icons-level2' + | 'rating-icons-level10' + | 'rating-icons-level1' + | 'folder-tabs-user' + | 'folder-tabs-star' + | 'folder-tabs-group' + | 'folder-tabs-folder' + | 'folder-tabs-chats' + | 'folder-tabs-chat' + | 'folder-tabs-channel' + | 'folder-tabs-bot'; diff --git a/src/types/language.d.ts b/src/types/language.d.ts index 7707454e6..a0b2c4269 100644 --- a/src/types/language.d.ts +++ b/src/types/language.d.ts @@ -54,6 +54,8 @@ export interface LangPair { 'PremiumPreviewUploadsDescription': undefined; 'PremiumPreviewAdvancedChatManagementDescription': undefined; 'PremiumPreviewAnimatedProfilesDescription': undefined; + 'PremiumPreviewNoForwards': undefined; + 'PremiumPreviewNoForwardsDescription': undefined; 'PremiumLimitAccountsTitle': undefined; 'PremiumLimitAccountsNoPremium': undefined; 'PremiumLimitAccounts': undefined; @@ -1537,6 +1539,22 @@ export interface LangPair { 'ActionChangedPhotoChannel': undefined; 'ActionCreatedChannel': undefined; 'ActionScreenshotTakenYou': undefined; + 'ActionSharingDisabledYou': undefined; + 'ActionSharingEnabledYou': undefined; + 'ActionSharingStillDisabled': undefined; + 'ContextMenuNoForwardsYou': undefined; + 'DisableSharing': undefined; + 'EnableSharing': undefined; + 'NotificationSharingEnabled': undefined; + 'NotificationSharingDisabled': undefined; + 'NoForwardingTitle': undefined; + 'NoForwardingDescription': undefined; + 'NoSavingTitle': undefined; + 'NoSavingDescription': undefined; + 'NoForwardsRequestYouTitle': undefined; + 'NoForwardsRequestForwarding': undefined; + 'NoForwardsRequestSaving': undefined; + 'NoForwardsRequestCopying': undefined; 'ActionBotAppPlaceholder': undefined; 'ActionGiftTextUnknown': undefined; 'ActionGiftTextUnknownYou': undefined; @@ -2018,6 +2036,8 @@ export interface LangPair { 'RankEditSave': undefined; 'RankEditTextOwn': undefined; 'MenuAddCaption': undefined; + 'NoForwardsRequestReject': undefined; + 'NoForwardsRequestAccept': undefined; } export interface LangPairWithVariables { @@ -2750,6 +2770,18 @@ export interface LangPairWithVariables { 'ActionScreenshotTaken': { 'from': V; }; + 'ActionSharingDisabled': { + 'from': V; + }; + 'ActionSharingEnabled': { + 'from': V; + }; + 'ContextMenuNoForwardsPeer': { + 'name': V; + }; + 'NoForwardsRequestTitle': { + 'user': V; + }; 'ActionBotAllowedFromDomain': { 'domain': V; };