diff --git a/src/api/gramjs/apiBuilders/appConfig.ts b/src/api/gramjs/apiBuilders/appConfig.ts index 21db0bcaa..3986097cb 100644 --- a/src/api/gramjs/apiBuilders/appConfig.ts +++ b/src/api/gramjs/apiBuilders/appConfig.ts @@ -74,6 +74,7 @@ export interface GramJsAppConfig extends LimitsConfig { // Boosts group_transcribe_level_min?: number; new_noncontact_peers_require_premium_without_ownpremium?: boolean; + channel_restrict_sponsored_level_min?: number; // Upload premium notifications upload_premium_speedup_notify_period?: number; upload_premium_speedup_download?: number; @@ -156,5 +157,6 @@ export function buildAppConfig(json: GramJs.TypeJSONValue, hash: number): ApiApp bandwidthPremiumNotifyPeriod: appConfig.upload_premium_speedup_notify_period, bandwidthPremiumUploadSpeedup: appConfig.upload_premium_speedup_upload, bandwidthPremiumDownloadSpeedup: appConfig.upload_premium_speedup_download, + channelRestrictAdsLevelMin: appConfig.channel_restrict_sponsored_level_min, }; } diff --git a/src/api/gramjs/apiBuilders/chats.ts b/src/api/gramjs/apiBuilders/chats.ts index de64b9923..403216ad4 100644 --- a/src/api/gramjs/apiBuilders/chats.ts +++ b/src/api/gramjs/apiBuilders/chats.ts @@ -17,11 +17,13 @@ import type { ApiMissingInvitedUser, ApiRestrictionReason, ApiSendAsPeerId, + ApiSponsoredMessageReportResult, ApiTopic, } from '../../types'; import { omitUndefined, pick, pickTruthy } from '../../../util/iteratees'; import { getServerTime, getServerTimeOffset } from '../../../util/serverTime'; +import { serializeBytes } from '../helpers'; import { buildApiUsernames } from './common'; import { omitVirtualClassFields } from './helpers'; import { @@ -645,3 +647,31 @@ export function buildApiMissingInvitedUser( isRequiringPremiumToInvite: user.premiumWouldAllowInvite, }; } + +export function buildApiSponsoredMessageReportResult( + result: GramJs.channels.TypeSponsoredMessageReportResult, +): ApiSponsoredMessageReportResult { + if (result instanceof GramJs.channels.SponsoredMessageReportResultReported) { + return { + type: 'reported', + }; + } + + if (result instanceof GramJs.channels.SponsoredMessageReportResultAdsHidden) { + return { + type: 'hidden', + }; + } + + const title = result.title; + const options = result.options.map((option) => ({ + text: option.text, + option: serializeBytes(option.option), + })); + + return { + type: 'selectOption', + title, + options, + }; +} diff --git a/src/api/gramjs/apiBuilders/messages.ts b/src/api/gramjs/apiBuilders/messages.ts index 0103067d6..4f9752eff 100644 --- a/src/api/gramjs/apiBuilders/messages.ts +++ b/src/api/gramjs/apiBuilders/messages.ts @@ -20,7 +20,6 @@ import type { ApiReplyInfo, ApiReplyKeyboard, ApiSponsoredMessage, - ApiSponsoredWebPage, ApiSticker, ApiStory, ApiStorySkipped, @@ -51,13 +50,12 @@ import { resolveMessageApiChatId, serializeBytes, } from '../helpers'; -import { buildApiBotApp } from './bots'; import { buildApiCallDiscardReason } from './calls'; import { buildApiPhoto, } from './common'; import { buildMessageContent, buildMessageMediaContent, buildMessageTextContent } from './messageContent'; -import { buildApiPeerId, getApiChatIdFromMtpPeer, isPeerUser } from './peers'; +import { buildApiPeerColor, buildApiPeerId, getApiChatIdFromMtpPeer } from './peers'; import { buildMessageReactions } from './reactions'; const LOCAL_MESSAGES_LIMIT = 1e6; // 1M @@ -79,33 +77,28 @@ export function setMessageBuilderCurrentUserId(_currentUserId: string) { export function buildApiSponsoredMessage(mtpMessage: GramJs.SponsoredMessage): ApiSponsoredMessage | undefined { const { - fromId, message, entities, startParam, channelPost, chatInvite, chatInviteHash, randomId, recommended, sponsorInfo, - additionalInfo, showPeerPhoto, webpage, buttonText, app, + message, entities, randomId, recommended, sponsorInfo, additionalInfo, buttonText, canReport, title, url, color, } = mtpMessage; - const chatId = fromId ? getApiChatIdFromMtpPeer(fromId) : undefined; - const chatInviteTitle = chatInvite - ? (chatInvite instanceof GramJs.ChatInvite - ? chatInvite.title - : !(chatInvite.chat instanceof GramJs.ChatEmpty) ? chatInvite.chat.title : undefined) - : undefined; + + let photo: ApiPhoto | undefined; + if (mtpMessage.photo instanceof GramJs.Photo) { + addPhotoToLocalDb(mtpMessage.photo); + photo = buildApiPhoto(mtpMessage.photo); + } return { randomId: serializeBytes(randomId), - isBot: fromId ? isPeerUser(fromId) : false, text: buildMessageTextContent(message, entities), expiresAt: Math.round(Date.now() / 1000) + SPONSORED_MESSAGE_CACHE_MS, - isRecommended: Boolean(recommended), - ...(webpage && { webPage: buildSponsoredWebPage(webpage) }), - ...(showPeerPhoto && { isAvatarShown: true }), - ...(chatId && { chatId }), - ...(chatInviteHash && { chatInviteHash }), - ...(chatInvite && { chatInviteTitle }), - ...(startParam && { startParam }), - ...(channelPost && { channelPostId: channelPost }), - ...(sponsorInfo && { sponsorInfo }), - ...(additionalInfo && { additionalInfo }), - ...(buttonText && { buttonText }), - ...(app && { botApp: buildApiBotApp(app) }), + isRecommended: recommended, + sponsorInfo, + additionalInfo, + buttonText, + canReport, + title, + url, + peerColor: color && buildApiPeerColor(color), + photo, }; } @@ -1094,19 +1087,3 @@ export function buildApiQuickReply(reply: GramJs.TypeQuickReply): ApiQuickReply topMessageId: topMessage, }; } - -function buildSponsoredWebPage(webPage: GramJs.TypeSponsoredWebPage): ApiSponsoredWebPage { - let photo: ApiPhoto | undefined; - if (webPage.photo instanceof GramJs.Photo) { - addPhotoToLocalDb(webPage.photo); - photo = buildApiPhoto(webPage.photo); - } - - return { - ...pick(webPage, [ - 'url', - 'siteName', - ]), - photo, - }; -} diff --git a/src/api/gramjs/apiBuilders/users.ts b/src/api/gramjs/apiBuilders/users.ts index 72dfd4823..a47282495 100644 --- a/src/api/gramjs/apiBuilders/users.ts +++ b/src/api/gramjs/apiBuilders/users.ts @@ -22,7 +22,7 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse profilePhoto, voiceMessagesForbidden, premiumGifts, fallbackPhoto, personalPhoto, translationsDisabled, storiesPinnedAvailable, contactRequirePremium, businessWorkHours, businessLocation, businessIntro, - birthday, personalChannelId, personalChannelMessage, + birthday, personalChannelId, personalChannelMessage, sponsoredEnabled, }, users, } = mtpUserFull; @@ -49,6 +49,7 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse businessIntro: businessIntro && buildApiBusinessIntro(businessIntro), personalChannelId: personalChannelId && buildApiPeerId(personalChannelId, 'channel'), personalChannelMessageId: personalChannelMessage, + areAdsEnabled: sponsoredEnabled, }; } diff --git a/src/api/gramjs/methods/account.ts b/src/api/gramjs/methods/account.ts index f895672c6..be6dbdb64 100644 --- a/src/api/gramjs/methods/account.ts +++ b/src/api/gramjs/methods/account.ts @@ -94,3 +94,15 @@ export async function resolveBusinessChatLink({ slug } : { slug: string }) { chatLink, }; } + +export function toggleSponsoredMessages({ + enabled, +}: { + enabled: boolean; +}) { + return invokeRequest(new GramJs.account.ToggleSponsoredMessages({ + enabled, + }), { + shouldReturnTrue: true, + }); +} diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index 45badb1a3..2383f1ee7 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -44,6 +44,7 @@ import { buildApiChatReactions, buildApiChatSettings, buildApiMissingInvitedUser, + buildApiSponsoredMessageReportResult, buildApiTopic, buildChatMembers, getPeerKey, @@ -70,6 +71,7 @@ import { addEntitiesToLocalDb, addMessageToLocalDb, addPhotoToLocalDb, + deserializeBytes, isChatFolder, } from '../helpers'; import localDb from '../localDb'; @@ -2017,3 +2019,39 @@ export async function fetchChannelRecommendations({ chat }: { chat: ApiChat }) { result instanceof GramJs.messages.ChatsSlice ? result.count : undefined, }; } + +export async function reportSponsoredMessage({ + chat, + randomId, + option, +}: { + chat: ApiChat; + randomId: string; + option: string; +}) { + const { id, accessHash } = chat; + const channel = buildInputEntity(id, accessHash); + + try { + const result = await invokeRequest(new GramJs.channels.ReportSponsoredMessage({ + channel: channel as GramJs.InputChannel, + randomId: deserializeBytes(randomId), + option: deserializeBytes(option), + }), { + shouldThrow: true, + }); + + if (!result) { + return undefined; + } + + return buildApiSponsoredMessageReportResult(result); + } catch (err) { + if (err instanceof Error && err.message === 'PREMIUM_ACCOUNT_REQUIRED') { + return { + type: 'premiumRequired' as const, + }; + } + return undefined; + } +} diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index 10b8e0801..b448d0ee7 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -22,7 +22,7 @@ export { editTopic, toggleForum, fetchTopicById, createTopic, toggleParticipantsHidden, checkChatlistInvite, joinChatlistInvite, createChalistInvite, editChatlistInvite, deleteChatlistInvite, fetchChatlistInvites, fetchLeaveChatlistSuggestions, leaveChatlist, togglePeerTranslations, setViewForumAsMessages, - fetchChannelRecommendations, fetchSavedChats, toggleSavedDialogPinned, + fetchChannelRecommendations, fetchSavedChats, toggleSavedDialogPinned, reportSponsoredMessage, } from './chats'; export { diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts index f5d94b476..7f3e794b2 100644 --- a/src/api/types/messages.ts +++ b/src/api/types/messages.ts @@ -1,7 +1,7 @@ import type { ThreadId } from '../../types'; import type { ApiWebDocument } from './bots'; import type { ApiGroupCall, PhoneCallAction } from './calls'; -import type { ApiChat } from './chats'; +import type { ApiChat, ApiPeerColor } from './chats'; import type { ApiInputStorePaymentPurpose, ApiPremiumGiftCodeOption } from './payments'; import type { ApiMessageStoryData, ApiWebPageStoryData } from './stories'; @@ -382,12 +382,6 @@ export interface ApiWebPage { story?: ApiWebPageStoryData; } -export interface ApiSponsoredWebPage { - url: string; - siteName: string; - photo?: ApiPhoto; -} - export type ApiReplyInfo = ApiMessageReplyInfo | ApiStoryReplyInfo; export interface ApiMessageReplyInfo { @@ -685,22 +679,18 @@ export type ApiThreadInfo = ApiCommentsInfo | ApiMessageThreadInfo; export type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed'; export type ApiSponsoredMessage = { - chatId?: string; randomId: string; - isRecommended?: boolean; - isAvatarShown?: boolean; - isBot?: boolean; - channelPostId?: number; - startParam?: string; - chatInviteHash?: string; - chatInviteTitle?: string; + isRecommended?: true; text: ApiFormattedText; - webPage?: ApiSponsoredWebPage; expiresAt: number; sponsorInfo?: string; additionalInfo?: string; buttonText?: string; - botApp?: ApiBotApp; + canReport?: true; + title: string; + url: string; + photo?: ApiPhoto; + peerColor?: ApiPeerColor; }; // KeyboardButtons @@ -841,6 +831,17 @@ export type ApiQuickReply = { topMessageId: number; }; +export type ApiSponsoredMessageReportResult = { + type: 'reported' | 'hidden' | 'premiumRequired'; +} | { + type: 'selectOption'; + title: string; + options: { + text: string; + option: string; + }[]; +}; + export const MAIN_THREAD_ID = -1; // `Symbol` can not be transferred from worker diff --git a/src/api/types/misc.ts b/src/api/types/misc.ts index 9309edd7e..6848ef05e 100644 --- a/src/api/types/misc.ts +++ b/src/api/types/misc.ts @@ -208,6 +208,7 @@ export interface ApiAppConfig { bandwidthPremiumNotifyPeriod?: number; bandwidthPremiumUploadSpeedup?: number; bandwidthPremiumDownloadSpeedup?: number; + channelRestrictAdsLevelMin?: number; } export interface ApiConfig { diff --git a/src/api/types/users.ts b/src/api/types/users.ts index 301e3dcc9..4d15a73a2 100644 --- a/src/api/types/users.ts +++ b/src/api/types/users.ts @@ -53,6 +53,7 @@ export interface ApiUserFullInfo { noVoiceMessages?: boolean; premiumGifts?: ApiPremiumGiftOption[]; isTranslationDisabled?: true; + areAdsEnabled?: boolean; hasPinnedStories?: boolean; isContactRequirePremium?: boolean; birthday?: ApiBirthday; diff --git a/src/assets/font-icons/nochannel.svg b/src/assets/font-icons/nochannel.svg new file mode 100644 index 000000000..418bf9032 --- /dev/null +++ b/src/assets/font-icons/nochannel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/revenue-split.svg b/src/assets/font-icons/revenue-split.svg new file mode 100644 index 000000000..4add5b4b5 --- /dev/null +++ b/src/assets/font-icons/revenue-split.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/bundles/extra.ts b/src/bundles/extra.ts index eed219e9c..c315f4df1 100644 --- a/src/bundles/extra.ts +++ b/src/bundles/extra.ts @@ -27,6 +27,7 @@ export { default as GiftCodeModal } from '../components/modals/giftcode/GiftCode export { default as ChatlistModal } from '../components/modals/chatlist/ChatlistModal'; export { default as AboutAdsModal } from '../components/common/AboutAdsModal'; +export { default as ReportAdModal } from '../components/modals/reportAd/ReportAdModal'; export { default as CalendarModal } from '../components/common/CalendarModal'; export { default as DeleteMessageModal } from '../components/common/DeleteMessageModal'; export { default as PinMessageModal } from '../components/common/PinMessageModal'; diff --git a/src/components/common/AboutAdsModal.module.scss b/src/components/common/AboutAdsModal.module.scss new file mode 100644 index 000000000..a593ec6d8 --- /dev/null +++ b/src/components/common/AboutAdsModal.module.scss @@ -0,0 +1,35 @@ +.title, .description { + text-align: center !important; + text-wrap: pretty; + padding-inline: 1.5rem; +} + +.secondary { + color: var(--color-text-secondary); +} + +.separator { + margin-block: 1rem; + width: 100%; +} + +.topIcon { + --premium-gradient: linear-gradient(88.39deg, #6C93FF -2.56%, #976FFF 51.27%, #DF69D1 107.39%); + display: grid; + place-items: center; + flex-shrink: 0; + border-radius: 50%; + background: var(--premium-gradient); + + font-size: 4rem; + color: white; + width: 6rem; + height: 6rem; + margin-bottom: 1rem; +} + +.content { + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/src/components/common/AboutAdsModal.tsx b/src/components/common/AboutAdsModal.tsx index fb9c5afb9..bd0c0ae1f 100644 --- a/src/components/common/AboutAdsModal.tsx +++ b/src/components/common/AboutAdsModal.tsx @@ -1,45 +1,120 @@ import type { FC } from '../../lib/teact/teact'; -import React, { memo } from '../../lib/teact/teact'; +import React, { memo, useMemo } from '../../lib/teact/teact'; +import buildClassName from '../../util/buildClassName'; import renderText from './helpers/renderText'; +import useDerivedState from '../../hooks/useDerivedState'; import useLang from '../../hooks/useLang'; +import useSelectorSignal from '../../hooks/useSelectorSignal'; import Button from '../ui/Button'; +import ListItem from '../ui/ListItem'; import Modal from '../ui/Modal'; +import Separator from '../ui/Separator'; +import Icon from './Icon'; import SafeLink from './SafeLink'; +import styles from './AboutAdsModal.module.scss'; + export type OwnProps = { isOpen: boolean; - onClose: () => void; + isRevenueSharing?: boolean; + onClose: NoneToVoidFunction; }; const AboutAdsModal: FC = ({ isOpen, + isRevenueSharing, onClose, }) => { const lang = useLang(); + const minLevelSignal = useSelectorSignal((global) => global.appConfig?.channelRestrictAdsLevelMin); + const minLevelToRestrictAds = useDerivedState(minLevelSignal); + + const regularAdContent = useMemo(() => { + return ( + <> +

{lang('SponsoredMessageInfoScreen.Title')}

+

{renderText(lang('SponsoredMessageInfoDescription1'), ['br'])}

+

{renderText(lang('SponsoredMessageInfoDescription2'), ['br'])}

+

{renderText(lang('SponsoredMessageInfoDescription3'), ['br'])}

+

+ +

+

{renderText(lang('SponsoredMessageInfoDescription4'), ['br'])}

+ + ); + }, [lang]); + + const revenueSharingAdContent = useMemo(() => { + return ( + <> +
+

{lang('AboutRevenueSharingAds')}

+

+ {lang('RevenueSharingAdsAlertSubtitle')} +

+ + {lang('RevenueSharingAdsInfo1Title')} + + {renderText(lang('RevenueSharingAdsInfo1Subtitle'), ['simple_markdown'])} + + + + {lang('RevenueSharingAdsInfo2Title')} + + {renderText(lang('RevenueSharingAdsInfo2Subtitle'), ['simple_markdown'])} + + + + {lang('RevenueSharingAdsInfo3Title')} + + {renderText(lang('RevenueSharingAdsInfo3Subtitle', minLevelToRestrictAds), ['simple_markdown'])} + + + +

{renderText(lang('RevenueSharingAdsInfo4Title'), ['simple_markdown'])}

+

+ {renderText(lang('RevenueSharingAdsInfo4Subtitle2', ''), ['simple_markdown'])} + +

+ + ); + }, [lang, minLevelToRestrictAds]); + return ( -

{renderText(lang('SponsoredMessageInfoDescription1'), ['br'])}

-

{renderText(lang('SponsoredMessageInfoDescription2'), ['br'])}

-

{renderText(lang('SponsoredMessageInfoDescription3'), ['br'])}

-

- -

-

{renderText(lang('SponsoredMessageInfoDescription4'), ['br'])}

-
- -
+ {isRevenueSharing ? revenueSharingAdContent : regularAdContent} +
); }; diff --git a/src/components/common/PeerColorWrapper.module.scss b/src/components/common/PeerColorWrapper.module.scss new file mode 100644 index 000000000..6e91c9f00 --- /dev/null +++ b/src/components/common/PeerColorWrapper.module.scss @@ -0,0 +1,3 @@ +.root { + position: relative; +} diff --git a/src/components/common/PeerColorWrapper.tsx b/src/components/common/PeerColorWrapper.tsx index 8f0b3e83e..4515803f8 100644 --- a/src/components/common/PeerColorWrapper.tsx +++ b/src/components/common/PeerColorWrapper.tsx @@ -1,30 +1,44 @@ import React, { memo } from '../../lib/teact/teact'; -import type { ApiPeer } from '../../api/types'; +import type { ApiPeer, ApiPeerColor } from '../../api/types'; import buildClassName from '../../util/buildClassName'; -import { getPeerColorClass } from './helpers/peerColor'; +import { getApiPeerColorClass, getPeerColorClass } from './helpers/peerColor'; import EmojiIconBackground from './embedded/EmojiIconBackground'; -type OwnProps = { +import styles from './PeerColorWrapper.module.scss'; + +interface OwnProps extends React.HTMLAttributes { peer?: ApiPeer; + peerColor?: ApiPeerColor; noUserColors?: boolean; shoudReset?: boolean; className?: string; emojiIconClassName?: string; children: React.ReactNode; -}; +} function PeerColorWrapper({ - peer, noUserColors, shoudReset, className, emojiIconClassName, children, + peer, peerColor, noUserColors, shoudReset, className, emojiIconClassName, children, ...otherProps }: OwnProps) { + const color = peerColor || peer?.color; + return ( -
- {peer?.color?.backgroundEmojiId && ( +
+ {color?.backgroundEmojiId && ( )} {children} diff --git a/src/components/common/helpers/peerColor.ts b/src/components/common/helpers/peerColor.ts index fdf995100..e0219e990 100644 --- a/src/components/common/helpers/peerColor.ts +++ b/src/components/common/helpers/peerColor.ts @@ -1,4 +1,4 @@ -import type { ApiPeer } from '../../../api/types'; +import type { ApiPeer, ApiPeerColor } from '../../../api/types'; import { getPeerColorCount, getPeerColorKey } from '../../../global/helpers'; @@ -9,3 +9,7 @@ export function getPeerColorClass(peer?: ApiPeer, noUserColors?: boolean, should } return noUserColors ? `peer-color-count-${getPeerColorCount(peer)}` : `peer-color-${getPeerColorKey(peer)}`; } + +export function getApiPeerColorClass(color: ApiPeerColor) { + return `peer-color-${color.color}`; +} diff --git a/src/components/common/profile/BusinessHours.tsx b/src/components/common/profile/BusinessHours.tsx index ce63c8c13..2f6733ecd 100644 --- a/src/components/common/profile/BusinessHours.tsx +++ b/src/components/common/profile/BusinessHours.tsx @@ -114,7 +114,7 @@ const BusinessHours = ({ useEffect(() => { if (!isExpanded) return; - const slide = document.querySelector(`.${ACTIVE_SLIDE_CLASS_NAME} .${styles.timetable}`); + const slide = document.querySelector(`.${ACTIVE_SLIDE_CLASS_NAME} > .${styles.timetable}`); if (!slide) return; const height = slide.offsetHeight; @@ -124,7 +124,7 @@ const BusinessHours = ({ }, [isExpanded]); const handleAnimationStart = useLastCallback(() => { - const slide = document.querySelector(`.${TO_SLIDE_CLASS_NAME} .${styles.timetable}`)!; + const slide = document.querySelector(`.${TO_SLIDE_CLASS_NAME} > .${styles.timetable}`)!; requestMeasure(() => { const height = slide.offsetHeight; diff --git a/src/components/middle/MessageList.tsx b/src/components/middle/MessageList.tsx index 3d145fca8..854b75add 100644 --- a/src/components/middle/MessageList.tsx +++ b/src/components/middle/MessageList.tsx @@ -52,6 +52,7 @@ import { selectScrollOffset, selectTabState, selectThreadInfo, + selectUserFullInfo, } from '../../global/selectors'; import animateScroll, { isAnimatingScroll, restartCurrentScrollAnimation } from '../../util/animateScroll'; import buildClassName from '../../util/buildClassName'; @@ -101,7 +102,6 @@ type OwnProps = { }; type StateProps = { - isCurrentUserPremium?: boolean; isChatLoaded?: boolean; isChannelChat?: boolean; isGroupChat?: boolean; @@ -127,6 +127,7 @@ type StateProps = { isEmptyThread?: boolean; isForum?: boolean; currentUserId: string; + areAdsEnabled?: boolean; }; const MESSAGE_REACTIONS_POLLING_INTERVAL = 20 * 1000; @@ -150,7 +151,6 @@ const MessageList: FC = ({ hasTools, onScrollDownToggle, onNotchToggle, - isCurrentUserPremium, isChatLoaded, isForum, isChannelChat, @@ -184,6 +184,7 @@ const MessageList: FC = ({ getForceNextPinnedInHeader, onPinnedIntersectionChange, isContactRequirePremium, + areAdsEnabled, }) => { const { loadViewportMessages, setScrollOffset, loadSponsoredMessages, loadMessageReactions, copyMessagesByIds, @@ -230,10 +231,10 @@ const MessageList: FC = ({ }, [firstUnreadId]); useEffect(() => { - if (!isCurrentUserPremium && isChannelChat && isSynced && isReady) { + if (areAdsEnabled && isChannelChat && isSynced && isReady) { loadSponsoredMessages({ chatId }); } - }, [isCurrentUserPremium, chatId, isSynced, isReady, isChannelChat]); + }, [chatId, isSynced, isReady, isChannelChat, areAdsEnabled]); // Updated only once when messages are loaded (as we want the unread divider to keep its position) useSyncEffect(() => { @@ -633,7 +634,7 @@ const MessageList: FC = ({ /> ) : hasMessages ? ( ( const chatFullInfo = !isUserId(chatId) ? selectChatFullInfo(global, chatId) : undefined; const isEmptyThread = !selectThreadInfo(global, chatId, threadId)?.messagesCount; + const isCurrentUserPremium = selectIsCurrentUserPremium(global); + const areAdsEnabled = !isCurrentUserPremium || selectUserFullInfo(global, currentUserId)?.areAdsEnabled; + return { - isCurrentUserPremium: selectIsCurrentUserPremium(global), + areAdsEnabled, isChatLoaded: true, isRestricted, restrictionReason, diff --git a/src/components/middle/MessageListContent.tsx b/src/components/middle/MessageListContent.tsx index e49e65038..380b3ff47 100644 --- a/src/components/middle/MessageListContent.tsx +++ b/src/components/middle/MessageListContent.tsx @@ -32,7 +32,7 @@ import SponsoredMessage from './message/SponsoredMessage'; import MessageListBotInfo from './MessageListBotInfo'; interface OwnProps { - isCurrentUserPremium?: boolean; + areAdsEnabled?: boolean; chatId: string; threadId: ThreadId; messageIds: number[]; @@ -64,7 +64,7 @@ interface OwnProps { const UNREAD_DIVIDER_CLASS = 'unread-divider'; const MessageListContent: FC = ({ - isCurrentUserPremium, + areAdsEnabled, chatId, threadId, messageIds, @@ -290,7 +290,7 @@ const MessageListContent: FC = ({ {withHistoryTriggers &&
} {shouldRenderBotInfo && } {dateGroups.flat()} - {!isCurrentUserPremium && isViewportNewest && ( + {areAdsEnabled && isViewportNewest && ( )} {withHistoryTriggers && ( diff --git a/src/components/middle/message/Message.scss b/src/components/middle/message/Message.scss index 462406822..73d03ba8b 100644 --- a/src/components/middle/message/Message.scss +++ b/src/components/middle/message/Message.scss @@ -674,47 +674,43 @@ } } - .message-action-button { + .message-action-buttons { position: absolute; bottom: 0; - color: white; background-color: var(--pattern-color); + border-radius: 1rem; + + display: flex; + flex-direction: column; opacity: 0; - transition: opacity 150ms, backdrop-filter 150ms, filter 150ms; + transition: opacity 150ms; @media (pointer: coarse) { opacity: 1 !important; } + } - &:hover, - &:active, - &:focus { - background-color: var(--pattern-color) !important; - backdrop-filter: brightness(115%); - - @supports not (backdrop-filter: brightness(115%)) { - filter: brightness(115%); - } - } + .message-action-button { + color: white; } &:hover, &[data-is-document-group-hover] { - .message-action-button { + .message-action-buttons { opacity: 1; } } - .message-action-button-shown { + .message-action-buttons-shown { opacity: 1; } - &.own .message-action-button { + &.own .message-action-buttons { left: -3rem; } - &:not(.own) .message-action-button { + &:not(.own) .message-action-buttons { right: -3rem; } diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx index ab2bc27a9..1dbd6d8e8 100644 --- a/src/components/middle/message/Message.tsx +++ b/src/components/middle/message/Message.tsx @@ -1389,7 +1389,7 @@ const Message: FC = ({ /> {!isInDocumentGroup && (
- {isSelected && } + {isSelected && }
)} {isLastInDocumentGroup && ( @@ -1398,7 +1398,7 @@ const Message: FC = ({ onClick={handleDocumentGroupSelectAll} > {isGroupSelected && ( - + )}
)} @@ -1419,33 +1419,38 @@ const Message: FC = ({ )} {renderContent()} {!isInDocumentGroupNotLast && metaPosition === 'standalone' && !isStoryMention && renderReactionsAndMeta()} - {canShowActionButton && canForward ? ( - - ) : canShowActionButton && canFocus ? ( - )} - color="translucent-white" - round - size="tiny" - ariaLabel="Focus message" - onClick={isPinnedList ? handleFocus : handleFocusForwarded} - > - - - ) : undefined} + {canFocus && ( + + )} +
+ )} {withCommentButton && ( = ({ onAboutAds, onSponsoredHide, onSponsorInfo, + onSponsoredReport, onReactionPickerOpen, onTranslate, onShowOriginal, @@ -443,9 +445,21 @@ const MessageContextMenu: FC = ({ {isSponsoredMessage && message.sponsorInfo && ( {lang('SponsoredMessageSponsor')} )} - {isSponsoredMessage && {lang('SponsoredMessageInfo')}} + {isSponsoredMessage && ( + + {lang(message.canReport ? 'AboutRevenueSharingAds' : 'SponsoredMessageInfo')} + + )} + {isSponsoredMessage && message.canReport && ( + + {lang('ReportAd')} + + )} {isSponsoredMessage && onSponsoredHide && ( - {lang('HideAd')} + <> + + {lang('HideAd')} + )} {(canShowSeenBy || canShowReactionsCount) && !isSponsoredMessage && ( <> diff --git a/src/components/middle/message/SponsoredMessage.scss b/src/components/middle/message/SponsoredMessage.scss index 9b6c0ca6b..876841654 100644 --- a/src/components/middle/message/SponsoredMessage.scss +++ b/src/components/middle/message/SponsoredMessage.scss @@ -4,6 +4,7 @@ margin-top: -0.5rem; margin-bottom: 0.5rem; + z-index: calc(var(--z-sticky-date) + 1); &::before { display: none; @@ -36,26 +37,9 @@ color: var(--color-text); } - &.with-avatar { - padding-left: 2.5rem !important; - - & > .Avatar { - display: flex !important; - } - - - @media (max-width: 600px) { - padding-left: 2.875rem !important; - - .message-content { - max-width: min(29rem, calc(100vw - 7.0625rem)) !important; - } - } - } - - .message-action-button { + .message-action-buttons { bottom: auto !important; - top: 0.5rem; + top: 0; } .message-content { @@ -67,7 +51,7 @@ } .channel-avatar { - --radius: 0.125rem; + --radius: 0.25rem; float: right; margin: 0 0 0.5rem 0.5rem; @@ -86,7 +70,6 @@ font-size: calc(var(--message-text-size, 1rem) - 0.125rem); background-color: var(--accent-background-color); border-radius: 0.375rem; - position: relative; overflow: hidden; &::before { @@ -131,4 +114,19 @@ .svg-appendix { transform: translate(0.01875rem, -0.00625rem); } + + .ad-about { + font-size: 0.6875rem; + margin-inline-start: 0.25rem; + border-radius: 1rem; + padding-inline: 0.375rem; + transition: 150ms filter ease-in; + background: var(--accent-background-active-color); + cursor: var(--custom-cursor, pointer); + filter: opacity(0.8); + + &:hover { + filter: opacity(1); + } + } } diff --git a/src/components/middle/message/SponsoredMessage.tsx b/src/components/middle/message/SponsoredMessage.tsx index e5c69f340..8ffd76dff 100644 --- a/src/components/middle/message/SponsoredMessage.tsx +++ b/src/components/middle/message/SponsoredMessage.tsx @@ -1,23 +1,16 @@ -import type { MouseEvent as ReactMouseEvent, RefObject } from 'react'; +import type { RefObject } from 'react'; import type { FC } from '../../../lib/teact/teact'; import React, { memo, useEffect, useRef } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; -import type { - ApiChat, ApiSponsoredMessage, ApiUser, -} from '../../../api/types'; +import type { ApiSponsoredMessage } from '../../../api/types'; -import { getChatTitle, getUserFullName } from '../../../global/helpers'; -import { selectChat, selectSponsoredMessage, selectUser } from '../../../global/selectors'; +import { selectSponsoredMessage } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; -import { extractCurrentThemeParams } from '../../../util/themeStyle'; -import { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/windowEnvironment'; -import { getPeerColorClass } from '../../common/helpers/peerColor'; -import renderText from '../../common/helpers/renderText'; +import { IS_ANDROID } from '../../../util/windowEnvironment'; import { renderTextWithEntities } from '../../common/helpers/renderTextWithEntities'; import { preventMessageInputBlur } from '../helpers/preventMessageInputBlur'; -import useAppLayout from '../../../hooks/useAppLayout'; import useContextMenuHandlers from '../../../hooks/useContextMenuHandlers'; import useFlag from '../../../hooks/useFlag'; import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; @@ -26,6 +19,8 @@ import useLastCallback from '../../../hooks/useLastCallback'; import AboutAdsModal from '../../common/AboutAdsModal.async'; import Avatar from '../../common/Avatar'; +import Icon from '../../common/Icon'; +import PeerColorWrapper from '../../common/PeerColorWrapper'; import Button from '../../ui/Button'; import MessageAppendix from './MessageAppendix'; import SponsoredMessageContextMenuContainer from './SponsoredMessageContextMenuContainer.async'; @@ -39,31 +34,21 @@ type OwnProps = { type StateProps = { message?: ApiSponsoredMessage; - peer?: ApiChat; - bot?: ApiUser; - channel?: ApiChat; }; const INTERSECTION_DEBOUNCE_MS = 200; const SponsoredMessage: FC = ({ chatId, - peer, message, containerRef, - bot, - channel, }) => { const { viewSponsoredMessage, - openChat, - openChatByInvite, - requestAppWebView, - startBot, - focusMessage, openUrl, - openPremiumModal, + hideSponsoredMessages, clickSponsoredMessage, + reportSponsoredMessage, } = getActions(); const lang = useLang(); @@ -83,11 +68,8 @@ const SponsoredMessage: FC = ({ isContextMenuOpen, contextMenuPosition, handleBeforeContextMenu, handleContextMenu, handleContextMenuClose, handleContextMenuHide, - } = useContextMenuHandlers(ref, IS_TOUCH_ENV, true, IS_ANDROID); + } = useContextMenuHandlers(ref, undefined, true, IS_ANDROID); const [isAboutAdsModalOpen, openAboutAdsModal, closeAboutAdsModal] = useFlag(false); - const { isMobile } = useAppLayout(); - const withAvatar = Boolean(message?.isAvatarShown && peer); - const isBotApp = Boolean(message?.botApp); useEffect(() => { return shouldObserve ? observeIntersection(contentRef.current!, (target) => { @@ -102,146 +84,30 @@ const SponsoredMessage: FC = ({ handleBeforeContextMenu(e); }; - const handleAvatarClick = useLastCallback(() => { - if (!peer) { - return; - } - - openChat({ id: peer.id }); + const handleReportSponsoredMessage = useLastCallback(() => { + reportSponsoredMessage({ chatId, randomId: message!.randomId }); }); - const handleLinkClick = useLastCallback((e: ReactMouseEvent) => { - e.preventDefault(); - - clickSponsoredMessage({ chatId }); - openUrl({ url: message!.webPage!.url, shouldSkipModal: true }); - - return false; - }); - - const handleCloseSponsoredMessage = useLastCallback(() => { - openPremiumModal(); + const handleHideSponsoredMessage = useLastCallback(() => { + hideSponsoredMessages(); }); const handleClick = useLastCallback(() => { if (!message) return; clickSponsoredMessage({ chatId }); - - if (isBotApp) { - const { shortName } = message.botApp!; - const theme = extractCurrentThemeParams(); - - requestAppWebView({ - botId: message.chatId!, - appName: shortName, - startApp: message.startParam, - theme, - }); - } else if (message.chatInviteHash) { - openChatByInvite({ hash: message.chatInviteHash }); - } else if (message.channelPostId) { - focusMessage({ chatId: message.chatId!, messageId: message.channelPostId }); - } else { - openChat({ id: message.chatId }); - - if (message.startParam) { - startBot({ - botId: message.chatId!, - param: message.startParam, - }); - } - } + openUrl({ url: message!.url, shouldSkipModal: true }); }); if (!message) { return undefined; } - function renderAvatar() { - return ( - - ); - } - - function renderPhoto() { - if (message?.botApp) { - if (!message.botApp.photo) return undefined; - - return ( - - ); - } - - if (channel) { - return ( - - ); - } - - return undefined; - } - function renderContent() { - if (message?.webPage) { - return ( - <> -
-
- {renderText(message.webPage.siteName)} -
- - {renderTextWithEntities({ - text: message!.text.text, - entities: message!.text.entities, - })} - -
- - - - ); - } - - const buttonText = message?.buttonText ?? ( - isBotApp - ? lang('BotWebAppInstantViewOpen') - : (message!.isBot - ? lang('Conversation.ViewBot') - : lang(message!.channelPostId ? 'Conversation.ViewPost' : 'Conversation.ViewChannel') - )); - const title = isBotApp - ? message!.botApp!.title - : (bot - ? renderText(getUserFullName(bot) || '') - : (channel ? renderText(message!.chatInviteTitle || getChatTitle(lang, channel) || '') : '') - ); - + if (!message) return undefined; return ( <> -
{title}
+
{message.title}
{renderTextWithEntities({ @@ -258,48 +124,64 @@ const SponsoredMessage: FC = ({ isRectangular onClick={handleClick} > - {buttonText} + {message.buttonText} ); } - const contentClassName = buildClassName( - 'message-content has-shadow has-solid-background has-appendix', - getPeerColorClass(bot || peer || channel), - ); - return (
- {withAvatar && renderAvatar()}
-
- {renderPhoto()} + + {message.photo && ( + + )} {message!.isRecommended ? lang('Message.RecommendedLabel') : lang('SponsoredMessage')} + {lang('SponsoredMessageAdWhatIsThis')} {renderContent()} -
+ - +
+ + {message.canReport && ( + + )} +
{contextMenuPosition && ( = ({ anchor={contextMenuPosition} message={message!} onAboutAds={openAboutAdsModal} + onReportAd={handleReportSponsoredMessage} onClose={handleContextMenuClose} onCloseAnimationEnd={handleContextMenuHide} /> )}
@@ -322,14 +206,9 @@ const SponsoredMessage: FC = ({ export default memo(withGlobal( (global, { chatId }): StateProps => { const message = selectSponsoredMessage(global, chatId); - const peer = message?.chatId ? selectChat(global, message?.chatId) : undefined; - const { chatId: fromChatId, isBot } = message || {}; return { message, - peer, - bot: fromChatId && isBot ? selectUser(global, fromChatId) : undefined, - channel: !isBot && fromChatId ? selectChat(global, fromChatId) : undefined, }; }, )(SponsoredMessage)); diff --git a/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx b/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx index bb525ebd4..2e808c270 100644 --- a/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx +++ b/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx @@ -1,11 +1,10 @@ import type { FC } from '../../../lib/teact/teact'; import React, { memo } from '../../../lib/teact/teact'; -import { getActions, withGlobal } from '../../../global'; +import { getActions } from '../../../global'; import type { ApiSponsoredMessage } from '../../../api/types'; import type { IAnchorPosition } from '../../../types'; -import { selectIsCurrentUserPremium, selectIsPremiumPurchaseBlocked } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; import useFlag from '../../../hooks/useFlag'; @@ -18,22 +17,19 @@ export type OwnProps = { isOpen: boolean; message: ApiSponsoredMessage; anchor: IAnchorPosition; - onAboutAds: () => void; - onClose: () => void; - onCloseAnimationEnd: () => void; + onAboutAds: NoneToVoidFunction; + onReportAd: NoneToVoidFunction; + onClose: NoneToVoidFunction; + onCloseAnimationEnd: NoneToVoidFunction; }; -type StateProps = { - canBuyPremium?: boolean; -}; - -const SponsoredMessageContextMenuContainer: FC = ({ +const SponsoredMessageContextMenuContainer: FC = ({ message, anchor, onAboutAds, + onReportAd, onClose, onCloseAnimationEnd, - canBuyPremium, }) => { const { openPremiumModal, showDialog } = getActions(); @@ -60,6 +56,11 @@ const SponsoredMessageContextMenuContainer: FC = ({ }); }); + const handleReportSponsoredMessage = useLastCallback(() => { + closeMenu(); + onReportAd(); + }); + if (!anchor) { return undefined; } @@ -73,17 +74,12 @@ const SponsoredMessageContextMenuContainer: FC = ({ onClose={closeMenu} onCloseAnimationEnd={closeMenu} onAboutAds={handleAboutAdsOpen} - onSponsoredHide={canBuyPremium ? handleSponsoredHide : undefined} + onSponsoredHide={handleSponsoredHide} onSponsorInfo={handleSponsorInfo} + onSponsoredReport={handleReportSponsoredMessage} />
); }; -export default memo(withGlobal( - (global): StateProps => { - return { - canBuyPremium: !selectIsCurrentUserPremium(global) && !selectIsPremiumPurchaseBlocked(global), - }; - }, -)(SponsoredMessageContextMenuContainer)); +export default memo(SponsoredMessageContextMenuContainer); diff --git a/src/components/modals/ModalContainer.tsx b/src/components/modals/ModalContainer.tsx index ecddef7eb..3031de69e 100644 --- a/src/components/modals/ModalContainer.tsx +++ b/src/components/modals/ModalContainer.tsx @@ -12,6 +12,7 @@ import ChatlistModal from './chatlist/ChatlistModal.async'; import GiftCodeModal from './giftcode/GiftCodeModal.async'; import InviteViaLinkModal from './inviteViaLink/InviteViaLinkModal.async'; import OneTimeMediaModal from './oneTimeMedia/OneTimeMediaModal.async'; +import ReportAdModal from './reportAd/ReportAdModal.async'; import UrlAuthModal from './urlAuth/UrlAuthModal.async'; import WebAppModal from './webApp/WebAppModal.async'; @@ -24,6 +25,7 @@ type ModalKey = keyof Pick; @@ -47,6 +49,7 @@ const MODALS: ModalRegistry = { oneTimeMediaModal: OneTimeMediaModal, inviteViaLinkModal: InviteViaLinkModal, requestedAttachBotInstall: AttachBotInstallModal, + reportAdModal: ReportAdModal, webApp: WebAppModal, }; const MODAL_KEYS = Object.keys(MODALS) as ModalKey[]; diff --git a/src/components/modals/reportAd/ReportAdModal.async.tsx b/src/components/modals/reportAd/ReportAdModal.async.tsx new file mode 100644 index 000000000..389218040 --- /dev/null +++ b/src/components/modals/reportAd/ReportAdModal.async.tsx @@ -0,0 +1,18 @@ +import type { FC } from '../../../lib/teact/teact'; +import React from '../../../lib/teact/teact'; + +import type { OwnProps } from './ReportAdModal'; + +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const ReportAdModalAsync: FC = (props) => { + const { modal } = props; + const ReportAdModal = useModuleLoader(Bundles.Extra, 'ReportAdModal', !modal); + + // eslint-disable-next-line react/jsx-props-no-spreading + return ReportAdModal ? : undefined; +}; + +export default ReportAdModalAsync; diff --git a/src/components/modals/reportAd/ReportAdModal.module.scss b/src/components/modals/reportAd/ReportAdModal.module.scss new file mode 100644 index 000000000..73ab87944 --- /dev/null +++ b/src/components/modals/reportAd/ReportAdModal.module.scss @@ -0,0 +1,54 @@ +.slide { // Do not remove .slide, identifier used in JS + overflow-x: hidden; +} + +.modalTitle { + display: flex; + flex-direction: column; +} + +.optionText { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.option { + margin-bottom: 0.25rem !important; +} + +.optionButton { + padding-block: 0 !important; +} + +.sectionTitle { + color: var(--color-primary); + padding-inline: 1rem; +} + +.description { + margin-top: 0.75rem; + margin-bottom: 0; + color: var(--color-text-secondary); + padding-inline: 1rem; +} + +.title { + margin-bottom: 0; +} + +.titleMultiline > .title { + font-size: 1rem; +} + +.subtitle { + font-size: 0.875rem; + color: var(--color-text-secondary); +} + +.transition { + /* stylelint-disable-next-line plugin/no-low-performance-animation-properties */ + transition: height 0.25s ease-in-out; + overflow: hidden; +} diff --git a/src/components/modals/reportAd/ReportAdModal.tsx b/src/components/modals/reportAd/ReportAdModal.tsx new file mode 100644 index 000000000..dc7d12cf5 --- /dev/null +++ b/src/components/modals/reportAd/ReportAdModal.tsx @@ -0,0 +1,157 @@ +import React, { + memo, useEffect, useMemo, useRef, +} from '../../../lib/teact/teact'; +import { getActions } from '../../../global'; + +import type { TabState } from '../../../global/types'; + +import { requestMeasure, requestMutation } from '../../../lib/fasterdom/fasterdom'; +import buildClassName from '../../../util/buildClassName'; + +import useLang from '../../../hooks/useLang'; +import useLastCallback from '../../../hooks/useLastCallback'; + +import Icon from '../../common/Icon'; +import SafeLink from '../../common/SafeLink'; +import Button from '../../ui/Button'; +import ListItem from '../../ui/ListItem'; +import Modal from '../../ui/Modal'; +import Transition, { ACTIVE_SLIDE_CLASS_NAME, TO_SLIDE_CLASS_NAME } from '../../ui/Transition'; + +import styles from './ReportAdModal.module.scss'; + +const ADDED_PADDING = 40; + +export type OwnProps = { + modal: TabState['reportAdModal']; +}; + +const ReportAdModal = ({ + modal, +}: OwnProps) => { + const { + reportSponsoredMessage, closeReportAdModal, openPreviousReportAdModal, + } = getActions(); + const lang = useLang(); + const isOpen = Boolean(modal); + + // eslint-disable-next-line no-null/no-null + const transitionRef = useRef(null); + + const handleOptionClick = useLastCallback((e, option: string) => { + const { chatId, randomId } = modal!; + reportSponsoredMessage({ chatId, randomId, option }); + }); + + const [renderingSection, renderingDepth] = useMemo(() => { + if (!modal) return [undefined, 0]; + const sectionDepth = modal.sections.length - 1; + return [modal.sections[sectionDepth], sectionDepth]; + }, [modal]); + + const handleBackClick = useLastCallback(() => { + if (!renderingDepth) { + closeReportAdModal(); + return; + } + + openPreviousReportAdModal(); + }); + + const bottomText = useMemo(() => { + if (!modal) return undefined; + const template = lang('lng_report_sponsored_reported_learn'); + const parts = template.split('{link}'); + return [ + parts[0], + , + parts[1], + ]; + }, [lang, modal]); + + const header = useMemo(() => { + if (!modal) { + return undefined; + } + + const hasSubtitle = Boolean(renderingSection?.subtitle); + + return ( +
+ +
+

{lang('ReportAd')}

+ {hasSubtitle && ( + {renderingSection.subtitle} + )} +
+
+ ); + }, [lang, modal, renderingDepth, renderingSection?.subtitle]); + + useEffect(() => { + if (!modal) return; + const slide = document.querySelector(`.${ACTIVE_SLIDE_CLASS_NAME} > .${styles.slide}`); + if (!slide) return; + + const height = slide.scrollHeight; + requestMutation(() => { + transitionRef.current!.style.height = `${height + ADDED_PADDING}px`; + }); + }, [modal]); + + const handleAnimationStart = useLastCallback(() => { + const slide = document.querySelector(`.${TO_SLIDE_CLASS_NAME} > .${styles.slide}`)!; + + requestMeasure(() => { + const height = slide.scrollHeight; + requestMutation(() => { + transitionRef.current!.style.height = `${height + ADDED_PADDING}px`; + }); + }); + }); + + return ( + + +
+

{renderingSection?.title}

+ {renderingSection?.options.map((option) => ( + +
{option.text}
+
+ ))} +
+

{bottomText}

+
+
+ ); +}; + +export default memo(ReportAdModal); diff --git a/src/components/ui/Separator.tsx b/src/components/ui/Separator.tsx index a7675591b..503cf25da 100644 --- a/src/components/ui/Separator.tsx +++ b/src/components/ui/Separator.tsx @@ -7,7 +7,7 @@ import useLang from '../../hooks/useLang'; import styles from './Separator.module.scss'; type OwnProps = { - children: React.ReactNode; + children?: React.ReactNode; className?: string; }; diff --git a/src/config.ts b/src/config.ts index 675ea4fb8..923eb364d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -49,7 +49,7 @@ export const MEDIA_PROGRESSIVE_CACHE_DISABLED = false; export const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive'; export const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB export const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg'; -export const LANG_CACHE_NAME = 'tt-lang-packs-v34'; +export const LANG_CACHE_NAME = 'tt-lang-packs-v35'; export const ASSET_CACHE_NAME = 'tt-assets'; export const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500]; export const DATA_BROADCAST_CHANNEL_NAME = 'tt-global'; diff --git a/src/global/actions/api/messages.ts b/src/global/actions/api/messages.ts index 932f31c5a..8beff59c2 100644 --- a/src/global/actions/api/messages.ts +++ b/src/global/actions/api/messages.ts @@ -67,6 +67,7 @@ import { addChatMessagesById, addChats, addUsers, + deleteSponsoredMessage, removeOutlyingList, removeRequestedMessageTranslation, replaceSettings, @@ -90,6 +91,7 @@ import { updateThreadUnreadFromForwardedMessage, updateTopic, updateUploadByMessageKey, + updateUserFullInfo, updateUsers, } from '../../reducers'; import { updateTabState } from '../../reducers/tabs'; @@ -1548,6 +1550,79 @@ addActionHandler('clickSponsoredMessage', (global, actions, payload): ActionRetu void callApi('clickSponsoredMessage', { chat, random: message.randomId }); }); +addActionHandler('reportSponsoredMessage', async (global, actions, payload): Promise => { + const { + chatId, randomId, option = '', tabId = getCurrentTabId(), + } = payload; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + const result = await callApi('reportSponsoredMessage', { chat, randomId, option }); + + if (!result) return; + + if (result.type === 'premiumRequired') { + actions.openPremiumModal({ initialSection: 'no_ads', tabId }); + actions.closeReportAdModal({ tabId }); + return; + } + + if (result.type === 'reported' || result.type === 'hidden') { + actions.showNotification({ + message: translate(result.type === 'reported' ? 'AdReported' : 'AdHidden'), + tabId, + }); + actions.closeReportAdModal({ tabId }); + + global = getGlobal(); + global = deleteSponsoredMessage(global, chatId); + setGlobal(global); + return; + } + + if (result.type === 'selectOption') { + global = getGlobal(); + const oldSections = selectTabState(global, tabId).reportAdModal?.sections; + const selectedOption = oldSections?.[oldSections.length - 1]?.options.find((o) => o.option === option); + const newSection = { + title: result.title, + options: result.options, + subtitle: selectedOption?.text, + }; + global = updateTabState(global, { + reportAdModal: { + chatId, + randomId, + sections: oldSections ? [...oldSections, newSection] : [newSection], + }, + }, tabId); + setGlobal(global); + } +}); + +addActionHandler('hideSponsoredMessages', async (global, actions, payload): Promise => { + const { tabId = getCurrentTabId() } = payload || {}; + const isCurrentUserPremium = selectIsCurrentUserPremium(global); + if (!isCurrentUserPremium) { + actions.openPremiumModal({ initialSection: 'no_ads', tabId }); + return; + } + + const result = await callApi('toggleSponsoredMessages', { enabled: false }); + if (!result) return; + global = getGlobal(); + global = updateUserFullInfo(global, global.currentUserId!, { + areAdsEnabled: false, + }); + setGlobal(global); + actions.showNotification({ + message: translate('AdHidden'), + tabId, + }); +}); + addActionHandler('fetchUnreadMentions', async (global, actions, payload): Promise => { const { chatId, offsetId } = payload; await fetchUnreadMentions(global, chatId, offsetId); diff --git a/src/global/actions/ui/messages.ts b/src/global/actions/ui/messages.ts index 523eeaddf..cd9135ab2 100644 --- a/src/global/actions/ui/messages.ts +++ b/src/global/actions/ui/messages.ts @@ -863,6 +863,33 @@ addActionHandler('closeOneTimeMediaModal', (global, actions, payload): ActionRet setGlobal(global); }); +addActionHandler('closeReportAdModal', (global, actions, payload): ActionReturnType => { + const { tabId = getCurrentTabId() } = payload || {}; + return updateTabState(global, { + reportAdModal: undefined, + }, tabId); +}); + +addActionHandler('openPreviousReportAdModal', (global, actions, payload): ActionReturnType => { + const { tabId = getCurrentTabId() } = payload || {}; + const reportAdModal = selectTabState(global, tabId).reportAdModal; + if (!reportAdModal) { + return undefined; + } + + if (reportAdModal.sections.length === 1) { + actions.closeReportAdModal({ tabId }); + return undefined; + } + + return updateTabState(global, { + reportAdModal: { + ...reportAdModal, + sections: reportAdModal.sections.slice(0, -1), + }, + }, tabId); +}); + function copyTextForMessages(global: GlobalState, chatId: string, messageIds: number[]) { const { type: messageListType, threadId } = selectCurrentMessageList(global) || {}; const lang = langProvider.translate; diff --git a/src/global/reducers/messages.ts b/src/global/reducers/messages.ts index 4d5aca17c..d547170c0 100644 --- a/src/global/reducers/messages.ts +++ b/src/global/reducers/messages.ts @@ -671,6 +671,23 @@ export function updateSponsoredMessage( }; } +export function deleteSponsoredMessage( + global: T, chatId: string, +): T { + const byChatId = global.messages.sponsoredByChatId; + if (!byChatId[chatId]) { + return global; + } + + return { + ...global, + messages: { + ...global.messages, + sponsoredByChatId: omit(byChatId, [chatId]), + }, + }; +} + export function updateFocusDirection( global: T, direction?: FocusDirection, ...[tabId = getCurrentTabId()]: TabArgs diff --git a/src/global/types.ts b/src/global/types.ts index 4c84a3d60..c82a2630f 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -533,6 +533,19 @@ export type TabState = { openedStickerSetShortName?: string; openedCustomEmojiSetIds?: string[]; + reportAdModal?: { + chatId: string; + randomId: string; + sections: { + title: string; + subtitle?: string; + options: { + text: string; + option: string; + }[]; + }[]; + }; + activeDownloads: { byChatId: { [chatId: string]: { @@ -1465,6 +1478,14 @@ export interface ActionPayloads { clickSponsoredMessage: { chatId: string; }; + reportSponsoredMessage: { + chatId: string; + randomId: string; + option?: string; + } & WithTabId; + openPreviousReportAdModal: WithTabId | undefined; + closeReportAdModal: WithTabId | undefined; + hideSponsoredMessages: WithTabId | undefined; loadSendAs: { chatId: string; }; diff --git a/src/lib/gramjs/tl/AllTLObjects.js b/src/lib/gramjs/tl/AllTLObjects.js index d9260efba..1e9eb6837 100644 --- a/src/lib/gramjs/tl/AllTLObjects.js +++ b/src/lib/gramjs/tl/AllTLObjects.js @@ -1,6 +1,6 @@ const api = require('./api'); -const LAYER = 177; +const LAYER = 178; const tlobjects = {}; for (const tl of Object.values(api)) { diff --git a/src/lib/gramjs/tl/api.d.ts b/src/lib/gramjs/tl/api.d.ts index 3895f6bd7..9dafcf75f 100644 --- a/src/lib/gramjs/tl/api.d.ts +++ b/src/lib/gramjs/tl/api.d.ts @@ -86,7 +86,7 @@ namespace Api { export type TypeImportedContact = ImportedContact; export type TypeContactStatus = ContactStatus; export type TypeMessagesFilter = InputMessagesFilterEmpty | InputMessagesFilterPhotos | InputMessagesFilterVideo | InputMessagesFilterPhotoVideo | InputMessagesFilterDocument | InputMessagesFilterUrl | InputMessagesFilterGif | InputMessagesFilterVoice | InputMessagesFilterMusic | InputMessagesFilterChatPhotos | InputMessagesFilterPhoneCalls | InputMessagesFilterRoundVoice | InputMessagesFilterRoundVideo | InputMessagesFilterMyMentions | InputMessagesFilterGeo | InputMessagesFilterContacts | InputMessagesFilterPinned; - export type TypeUpdate = UpdateNewMessage | UpdateMessageID | UpdateDeleteMessages | UpdateUserTyping | UpdateChatUserTyping | UpdateChatParticipants | UpdateUserStatus | UpdateUserName | UpdateNewAuthorization | UpdateNewEncryptedMessage | UpdateEncryptedChatTyping | UpdateEncryption | UpdateEncryptedMessagesRead | UpdateChatParticipantAdd | UpdateChatParticipantDelete | UpdateDcOptions | UpdateNotifySettings | UpdateServiceNotification | UpdatePrivacy | UpdateUserPhone | UpdateReadHistoryInbox | UpdateReadHistoryOutbox | UpdateWebPage | UpdateReadMessagesContents | UpdateChannelTooLong | UpdateChannel | UpdateNewChannelMessage | UpdateReadChannelInbox | UpdateDeleteChannelMessages | UpdateChannelMessageViews | UpdateChatParticipantAdmin | UpdateNewStickerSet | UpdateStickerSetsOrder | UpdateStickerSets | UpdateSavedGifs | UpdateBotInlineQuery | UpdateBotInlineSend | UpdateEditChannelMessage | UpdateBotCallbackQuery | UpdateEditMessage | UpdateInlineBotCallbackQuery | UpdateReadChannelOutbox | UpdateDraftMessage | UpdateReadFeaturedStickers | UpdateRecentStickers | UpdateConfig | UpdatePtsChanged | UpdateChannelWebPage | UpdateDialogPinned | UpdatePinnedDialogs | UpdateBotWebhookJSON | UpdateBotWebhookJSONQuery | UpdateBotShippingQuery | UpdateBotPrecheckoutQuery | UpdatePhoneCall | UpdateLangPackTooLong | UpdateLangPack | UpdateFavedStickers | UpdateChannelReadMessagesContents | UpdateContactsReset | UpdateChannelAvailableMessages | UpdateDialogUnreadMark | UpdateMessagePoll | UpdateChatDefaultBannedRights | UpdateFolderPeers | UpdatePeerSettings | UpdatePeerLocated | UpdateNewScheduledMessage | UpdateDeleteScheduledMessages | UpdateTheme | UpdateGeoLiveViewed | UpdateLoginToken | UpdateMessagePollVote | UpdateDialogFilter | UpdateDialogFilterOrder | UpdateDialogFilters | UpdatePhoneCallSignalingData | UpdateChannelMessageForwards | UpdateReadChannelDiscussionInbox | UpdateReadChannelDiscussionOutbox | UpdatePeerBlocked | UpdateChannelUserTyping | UpdatePinnedMessages | UpdatePinnedChannelMessages | UpdateChat | UpdateGroupCallParticipants | UpdateGroupCall | UpdatePeerHistoryTTL | UpdateChatParticipant | UpdateChannelParticipant | UpdateBotStopped | UpdateGroupCallConnection | UpdateBotCommands | UpdatePendingJoinRequests | UpdateBotChatInviteRequester | UpdateMessageReactions | UpdateAttachMenuBots | UpdateWebViewResultSent | UpdateBotMenuButton | UpdateSavedRingtones | UpdateTranscribedAudio | UpdateReadFeaturedEmojiStickers | UpdateUserEmojiStatus | UpdateRecentEmojiStatuses | UpdateRecentReactions | UpdateMoveStickerSetToTop | UpdateMessageExtendedMedia | UpdateChannelPinnedTopic | UpdateChannelPinnedTopics | UpdateUser | UpdateAutoSaveSettings | UpdateStory | UpdateReadStories | UpdateStoryID | UpdateStoriesStealthMode | UpdateSentStoryReaction | UpdateBotChatBoost | UpdateChannelViewForumAsMessages | UpdatePeerWallpaper | UpdateBotMessageReaction | UpdateBotMessageReactions | UpdateSavedDialogPinned | UpdatePinnedSavedDialogs | UpdateSavedReactionTags | UpdateSmsJob | UpdateQuickReplies | UpdateNewQuickReply | UpdateDeleteQuickReply | UpdateQuickReplyMessage | UpdateDeleteQuickReplyMessages | UpdateBotBusinessConnect | UpdateBotNewBusinessMessage | UpdateBotEditBusinessMessage | UpdateBotDeleteBusinessMessage; + export type TypeUpdate = UpdateNewMessage | UpdateMessageID | UpdateDeleteMessages | UpdateUserTyping | UpdateChatUserTyping | UpdateChatParticipants | UpdateUserStatus | UpdateUserName | UpdateNewAuthorization | UpdateNewEncryptedMessage | UpdateEncryptedChatTyping | UpdateEncryption | UpdateEncryptedMessagesRead | UpdateChatParticipantAdd | UpdateChatParticipantDelete | UpdateDcOptions | UpdateNotifySettings | UpdateServiceNotification | UpdatePrivacy | UpdateUserPhone | UpdateReadHistoryInbox | UpdateReadHistoryOutbox | UpdateWebPage | UpdateReadMessagesContents | UpdateChannelTooLong | UpdateChannel | UpdateNewChannelMessage | UpdateReadChannelInbox | UpdateDeleteChannelMessages | UpdateChannelMessageViews | UpdateChatParticipantAdmin | UpdateNewStickerSet | UpdateStickerSetsOrder | UpdateStickerSets | UpdateSavedGifs | UpdateBotInlineQuery | UpdateBotInlineSend | UpdateEditChannelMessage | UpdateBotCallbackQuery | UpdateEditMessage | UpdateInlineBotCallbackQuery | UpdateReadChannelOutbox | UpdateDraftMessage | UpdateReadFeaturedStickers | UpdateRecentStickers | UpdateConfig | UpdatePtsChanged | UpdateChannelWebPage | UpdateDialogPinned | UpdatePinnedDialogs | UpdateBotWebhookJSON | UpdateBotWebhookJSONQuery | UpdateBotShippingQuery | UpdateBotPrecheckoutQuery | UpdatePhoneCall | UpdateLangPackTooLong | UpdateLangPack | UpdateFavedStickers | UpdateChannelReadMessagesContents | UpdateContactsReset | UpdateChannelAvailableMessages | UpdateDialogUnreadMark | UpdateMessagePoll | UpdateChatDefaultBannedRights | UpdateFolderPeers | UpdatePeerSettings | UpdatePeerLocated | UpdateNewScheduledMessage | UpdateDeleteScheduledMessages | UpdateTheme | UpdateGeoLiveViewed | UpdateLoginToken | UpdateMessagePollVote | UpdateDialogFilter | UpdateDialogFilterOrder | UpdateDialogFilters | UpdatePhoneCallSignalingData | UpdateChannelMessageForwards | UpdateReadChannelDiscussionInbox | UpdateReadChannelDiscussionOutbox | UpdatePeerBlocked | UpdateChannelUserTyping | UpdatePinnedMessages | UpdatePinnedChannelMessages | UpdateChat | UpdateGroupCallParticipants | UpdateGroupCall | UpdatePeerHistoryTTL | UpdateChatParticipant | UpdateChannelParticipant | UpdateBotStopped | UpdateGroupCallConnection | UpdateBotCommands | UpdatePendingJoinRequests | UpdateBotChatInviteRequester | UpdateMessageReactions | UpdateAttachMenuBots | UpdateWebViewResultSent | UpdateBotMenuButton | UpdateSavedRingtones | UpdateTranscribedAudio | UpdateReadFeaturedEmojiStickers | UpdateUserEmojiStatus | UpdateRecentEmojiStatuses | UpdateRecentReactions | UpdateMoveStickerSetToTop | UpdateMessageExtendedMedia | UpdateChannelPinnedTopic | UpdateChannelPinnedTopics | UpdateUser | UpdateAutoSaveSettings | UpdateStory | UpdateReadStories | UpdateStoryID | UpdateStoriesStealthMode | UpdateSentStoryReaction | UpdateBotChatBoost | UpdateChannelViewForumAsMessages | UpdatePeerWallpaper | UpdateBotMessageReaction | UpdateBotMessageReactions | UpdateSavedDialogPinned | UpdatePinnedSavedDialogs | UpdateSavedReactionTags | UpdateSmsJob | UpdateQuickReplies | UpdateNewQuickReply | UpdateDeleteQuickReply | UpdateQuickReplyMessage | UpdateDeleteQuickReplyMessages | UpdateBotBusinessConnect | UpdateBotNewBusinessMessage | UpdateBotEditBusinessMessage | UpdateBotDeleteBusinessMessage | UpdateNewStoryReaction; export type TypeUpdates = UpdatesTooLong | UpdateShortMessage | UpdateShortChatMessage | UpdateShort | UpdatesCombined | Updates | UpdateShortSentMessage; export type TypeDcOption = DcOption; export type TypeConfig = Config; @@ -234,7 +234,7 @@ namespace Api { export type TypeBaseTheme = BaseThemeClassic | BaseThemeDay | BaseThemeNight | BaseThemeTinted | BaseThemeArctic; export type TypeInputThemeSettings = InputThemeSettings; export type TypeThemeSettings = ThemeSettings; - export type TypeWebPageAttribute = WebPageAttributeTheme | WebPageAttributeStory; + export type TypeWebPageAttribute = WebPageAttributeTheme | WebPageAttributeStory | WebPageAttributeStickerSet; export type TypeBankCardOpenUrl = BankCardOpenUrl; export type TypeDialogFilter = DialogFilter | DialogFilterDefault | DialogFilterChatlist; export type TypeDialogFilterSuggested = DialogFilterSuggested; @@ -310,7 +310,6 @@ namespace Api { export type TypeInputChatlist = InputChatlistDialogFilter; export type TypeExportedChatlistInvite = ExportedChatlistInvite; export type TypeMessagePeerVote = MessagePeerVote | MessagePeerVoteInputOption | MessagePeerVoteMultiple; - export type TypeSponsoredWebPage = SponsoredWebPage; export type TypeStoryViews = StoryViews; export type TypeStoryItem = StoryItemDeleted | StoryItemSkipped | StoryItem; export type TypeStoryView = StoryView | StoryViewPublicForward | StoryViewPublicRepost; @@ -361,6 +360,8 @@ namespace Api { export type TypeRequestedPeer = RequestedPeerUser | RequestedPeerChat | RequestedPeerChannel; export type TypeSponsoredMessageReportOption = SponsoredMessageReportOption; export type TypeBroadcastRevenueTransaction = BroadcastRevenueTransactionProceeds | BroadcastRevenueTransactionWithdrawal | BroadcastRevenueTransactionRefund; + export type TypeReactionNotificationsFrom = ReactionNotificationsFromContacts | ReactionNotificationsFromAll; + export type TypeReactionsNotifySettings = ReactionsNotifySettings; export type TypeResPQ = ResPQ; export type TypeP_Q_inner_data = PQInnerData | PQInnerDataDc | PQInnerDataTemp | PQInnerDataTempDc; export type TypeServer_DH_Params = ServerDHParamsFail | ServerDHParamsOk; @@ -1372,6 +1373,7 @@ namespace Api { requestsPending?: int; recentRequesters?: long[]; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; }> { // flags: undefined; canSetUsername?: true; @@ -1393,6 +1395,7 @@ namespace Api { requestsPending?: int; recentRequesters?: long[]; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; }; export class ChannelFull extends VirtualClass<{ // flags: undefined; @@ -1448,6 +1451,7 @@ namespace Api { recentRequesters?: long[]; defaultSendAs?: Api.TypePeer; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; stories?: Api.TypePeerStories; wallpaper?: Api.TypeWallPaper; boostsApplied?: int; @@ -1507,6 +1511,7 @@ namespace Api { recentRequesters?: long[]; defaultSendAs?: Api.TypePeer; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; stories?: Api.TypePeerStories; wallpaper?: Api.TypeWallPaper; boostsApplied?: int; @@ -2500,6 +2505,7 @@ namespace Api { contactRequirePremium?: true; readDatesPrivate?: true; // flags2: undefined; + sponsoredEnabled?: true; id: long; about?: string; settings: Api.TypePeerSettings; @@ -2543,6 +2549,7 @@ namespace Api { contactRequirePremium?: true; readDatesPrivate?: true; // flags2: undefined; + sponsoredEnabled?: true; id: long; about?: string; settings: Api.TypePeerSettings; @@ -3757,6 +3764,15 @@ namespace Api { messages: int[]; qts: int; }; + export class UpdateNewStoryReaction extends VirtualClass<{ + storyId: int; + peer: Api.TypePeer; + reaction: Api.TypeReaction; + }> { + storyId: int; + peer: Api.TypePeer; + reaction: Api.TypeReaction; + }; export class UpdatesTooLong extends VirtualClass {}; export class UpdateShortMessage extends VirtualClass<{ // flags: undefined; @@ -7593,6 +7609,7 @@ namespace Api { allowAppHash?: true; allowMissedCall?: true; allowFirebase?: true; + unknownNumber?: true; logoutTokens?: bytes[]; token?: string; appSandbox?: Bool; @@ -7603,6 +7620,7 @@ namespace Api { allowAppHash?: true; allowMissedCall?: true; allowFirebase?: true; + unknownNumber?: true; logoutTokens?: bytes[]; token?: string; appSandbox?: Bool; @@ -7871,6 +7889,17 @@ namespace Api { id: int; story?: Api.TypeStoryItem; }; + export class WebPageAttributeStickerSet extends VirtualClass<{ + // flags: undefined; + emojis?: true; + textColor?: true; + stickers: Api.TypeDocument[]; + }> { + // flags: undefined; + emojis?: true; + textColor?: true; + stickers: Api.TypeDocument[]; + }; export class BankCardOpenUrl extends VirtualClass<{ url: string; name: string; @@ -8300,37 +8329,29 @@ namespace Api { export class SponsoredMessage extends VirtualClass<{ // flags: undefined; recommended?: true; - showPeerPhoto?: true; canReport?: true; randomId: bytes; - fromId?: Api.TypePeer; - chatInvite?: Api.TypeChatInvite; - chatInviteHash?: string; - channelPost?: int; - startParam?: string; - webpage?: Api.TypeSponsoredWebPage; - app?: Api.TypeBotApp; + url: string; + title: string; message: string; entities?: Api.TypeMessageEntity[]; - buttonText?: string; + photo?: Api.TypePhoto; + color?: Api.TypePeerColor; + buttonText: string; sponsorInfo?: string; additionalInfo?: string; }> { // flags: undefined; recommended?: true; - showPeerPhoto?: true; canReport?: true; randomId: bytes; - fromId?: Api.TypePeer; - chatInvite?: Api.TypeChatInvite; - chatInviteHash?: string; - channelPost?: int; - startParam?: string; - webpage?: Api.TypeSponsoredWebPage; - app?: Api.TypeBotApp; + url: string; + title: string; message: string; entities?: Api.TypeMessageEntity[]; - buttonText?: string; + photo?: Api.TypePhoto; + color?: Api.TypePeerColor; + buttonText: string; sponsorInfo?: string; additionalInfo?: string; }; @@ -9001,17 +9022,6 @@ namespace Api { options: bytes[]; date: int; }; - export class SponsoredWebPage extends VirtualClass<{ - // flags: undefined; - url: string; - siteName: string; - photo?: Api.TypePhoto; - }> { - // flags: undefined; - url: string; - siteName: string; - photo?: Api.TypePhoto; - }; export class StoryViews extends VirtualClass<{ // flags: undefined; hasViewers?: true; @@ -9820,6 +9830,21 @@ namespace Api { date: int; provider: string; }; + export class ReactionNotificationsFromContacts extends VirtualClass {}; + export class ReactionNotificationsFromAll extends VirtualClass {}; + export class ReactionsNotifySettings extends VirtualClass<{ + // flags: undefined; + messagesNotifyFrom?: Api.TypeReactionNotificationsFrom; + storiesNotifyFrom?: Api.TypeReactionNotificationsFrom; + sound: Api.TypeNotificationSound; + showPreviews: Bool; + }> { + // flags: undefined; + messagesNotifyFrom?: Api.TypeReactionNotificationsFrom; + storiesNotifyFrom?: Api.TypeReactionNotificationsFrom; + sound: Api.TypeNotificationSound; + showPreviews: Bool; + }; export class ResPQ extends VirtualClass<{ nonce: int128; serverNonce: int128; @@ -12315,13 +12340,17 @@ namespace Api { stealthMode: Api.TypeStoriesStealthMode; }; export class Stories extends VirtualClass<{ + // flags: undefined; count: int; stories: Api.TypeStoryItem[]; + pinnedToTop?: int[]; chats: Api.TypeChat[]; users: Api.TypeUser[]; }> { + // flags: undefined; count: int; stories: Api.TypeStoryItem[]; + pinnedToTop?: int[]; chats: Api.TypeChat[]; users: Api.TypeUser[]; }; @@ -13468,6 +13497,17 @@ namespace Api { }>, Bool> { channel: Api.TypeInputChannel; }; + export class ToggleSponsoredMessages extends Request, Bool> { + enabled: Bool; + }; + export class GetReactionsNotifySettings extends Request {}; + export class SetReactionsNotifySettings extends Request, Api.TypeReactionsNotifySettings> { + settings: Api.TypeReactionsNotifySettings; + }; } export namespace users { @@ -14192,6 +14232,7 @@ namespace Api { }; export class SearchGlobal extends Request, messages.TypeMessages> { // flags: undefined; + broadcastsOnly?: true; folderId?: int; q: string; filter: Api.TypeMessagesFilter; @@ -15215,11 +15257,15 @@ namespace Api { limit: int; }; export class SetChatAvailableReactions extends Request, Api.TypeUpdates> { + // flags: undefined; peer: Api.TypeInputPeer; availableReactions: Api.TypeChatReactions; + reactionsLimit?: int; }; export class GetAvailableReactions extends Request, messages.TypeChats> { - channel: Api.TypeInputChannel; + // flags: undefined; + channel?: Api.TypeInputChannel; + } | void>, messages.TypeChats> { + // flags: undefined; + channel?: Api.TypeInputChannel; }; export class UpdateEmojiStatus extends Request, Bool> { + peer: Api.TypeInputPeer; + id: int[]; + }; } export namespace premium { @@ -17671,7 +17726,7 @@ namespace Api { export type AnyRequest = InvokeAfterMsg | InvokeAfterMsgs | InitConnection | InvokeWithLayer | InvokeWithoutUpdates | InvokeWithMessagesRange | InvokeWithTakeout | InvokeWithBusinessConnection | ReqPq | ReqPqMulti | ReqPqMultiNew | ReqDHParams | SetClientDHParams | DestroyAuthKey | RpcDropAnswer | GetFutureSalts | Ping | PingDelayDisconnect | DestroySession | auth.SendCode | auth.SignUp | auth.SignIn | auth.LogOut | auth.ResetAuthorizations | auth.ExportAuthorization | auth.ImportAuthorization | auth.BindTempAuthKey | auth.ImportBotAuthorization | auth.CheckPassword | auth.RequestPasswordRecovery | auth.RecoverPassword | auth.ResendCode | auth.CancelCode | auth.DropTempAuthKeys | auth.ExportLoginToken | auth.ImportLoginToken | auth.AcceptLoginToken | auth.CheckRecoveryPassword | auth.ImportWebTokenAuthorization | auth.RequestFirebaseSms | auth.ResetLoginEmail - | account.RegisterDevice | account.UnregisterDevice | account.UpdateNotifySettings | account.GetNotifySettings | account.ResetNotifySettings | account.UpdateProfile | account.UpdateStatus | account.GetWallPapers | account.ReportPeer | account.CheckUsername | account.UpdateUsername | account.GetPrivacy | account.SetPrivacy | account.DeleteAccount | account.GetAccountTTL | account.SetAccountTTL | account.SendChangePhoneCode | account.ChangePhone | account.UpdateDeviceLocked | account.GetAuthorizations | account.ResetAuthorization | account.GetPassword | account.GetPasswordSettings | account.UpdatePasswordSettings | account.SendConfirmPhoneCode | account.ConfirmPhone | account.GetTmpPassword | account.GetWebAuthorizations | account.ResetWebAuthorization | account.ResetWebAuthorizations | account.GetAllSecureValues | account.GetSecureValue | account.SaveSecureValue | account.DeleteSecureValue | account.GetAuthorizationForm | account.AcceptAuthorization | account.SendVerifyPhoneCode | account.VerifyPhone | account.SendVerifyEmailCode | account.VerifyEmail | account.InitTakeoutSession | account.FinishTakeoutSession | account.ConfirmPasswordEmail | account.ResendPasswordEmail | account.CancelPasswordEmail | account.GetContactSignUpNotification | account.SetContactSignUpNotification | account.GetNotifyExceptions | account.GetWallPaper | account.UploadWallPaper | account.SaveWallPaper | account.InstallWallPaper | account.ResetWallPapers | account.GetAutoDownloadSettings | account.SaveAutoDownloadSettings | account.UploadTheme | account.CreateTheme | account.UpdateTheme | account.SaveTheme | account.InstallTheme | account.GetTheme | account.GetThemes | account.SetContentSettings | account.GetContentSettings | account.GetMultiWallPapers | account.GetGlobalPrivacySettings | account.SetGlobalPrivacySettings | account.ReportProfilePhoto | account.ResetPassword | account.DeclinePasswordReset | account.GetChatThemes | account.SetAuthorizationTTL | account.ChangeAuthorizationSettings | account.GetSavedRingtones | account.SaveRingtone | account.UploadRingtone | account.UpdateEmojiStatus | account.GetDefaultEmojiStatuses | account.GetRecentEmojiStatuses | account.ClearRecentEmojiStatuses | account.ReorderUsernames | account.ToggleUsername | account.GetDefaultProfilePhotoEmojis | account.GetDefaultGroupPhotoEmojis | account.GetAutoSaveSettings | account.SaveAutoSaveSettings | account.DeleteAutoSaveExceptions | account.InvalidateSignInCodes | account.UpdateColor | account.GetDefaultBackgroundEmojis | account.GetChannelDefaultEmojiStatuses | account.GetChannelRestrictedStatusEmojis | account.UpdateBusinessWorkHours | account.UpdateBusinessLocation | account.UpdateBusinessGreetingMessage | account.UpdateBusinessAwayMessage | account.UpdateConnectedBot | account.GetConnectedBots | account.GetBotBusinessConnection | account.UpdateBusinessIntro | account.ToggleConnectedBotPaused | account.DisablePeerConnectedBot | account.UpdateBirthday | account.CreateBusinessChatLink | account.EditBusinessChatLink | account.DeleteBusinessChatLink | account.GetBusinessChatLinks | account.ResolveBusinessChatLink | account.UpdatePersonalChannel + | account.RegisterDevice | account.UnregisterDevice | account.UpdateNotifySettings | account.GetNotifySettings | account.ResetNotifySettings | account.UpdateProfile | account.UpdateStatus | account.GetWallPapers | account.ReportPeer | account.CheckUsername | account.UpdateUsername | account.GetPrivacy | account.SetPrivacy | account.DeleteAccount | account.GetAccountTTL | account.SetAccountTTL | account.SendChangePhoneCode | account.ChangePhone | account.UpdateDeviceLocked | account.GetAuthorizations | account.ResetAuthorization | account.GetPassword | account.GetPasswordSettings | account.UpdatePasswordSettings | account.SendConfirmPhoneCode | account.ConfirmPhone | account.GetTmpPassword | account.GetWebAuthorizations | account.ResetWebAuthorization | account.ResetWebAuthorizations | account.GetAllSecureValues | account.GetSecureValue | account.SaveSecureValue | account.DeleteSecureValue | account.GetAuthorizationForm | account.AcceptAuthorization | account.SendVerifyPhoneCode | account.VerifyPhone | account.SendVerifyEmailCode | account.VerifyEmail | account.InitTakeoutSession | account.FinishTakeoutSession | account.ConfirmPasswordEmail | account.ResendPasswordEmail | account.CancelPasswordEmail | account.GetContactSignUpNotification | account.SetContactSignUpNotification | account.GetNotifyExceptions | account.GetWallPaper | account.UploadWallPaper | account.SaveWallPaper | account.InstallWallPaper | account.ResetWallPapers | account.GetAutoDownloadSettings | account.SaveAutoDownloadSettings | account.UploadTheme | account.CreateTheme | account.UpdateTheme | account.SaveTheme | account.InstallTheme | account.GetTheme | account.GetThemes | account.SetContentSettings | account.GetContentSettings | account.GetMultiWallPapers | account.GetGlobalPrivacySettings | account.SetGlobalPrivacySettings | account.ReportProfilePhoto | account.ResetPassword | account.DeclinePasswordReset | account.GetChatThemes | account.SetAuthorizationTTL | account.ChangeAuthorizationSettings | account.GetSavedRingtones | account.SaveRingtone | account.UploadRingtone | account.UpdateEmojiStatus | account.GetDefaultEmojiStatuses | account.GetRecentEmojiStatuses | account.ClearRecentEmojiStatuses | account.ReorderUsernames | account.ToggleUsername | account.GetDefaultProfilePhotoEmojis | account.GetDefaultGroupPhotoEmojis | account.GetAutoSaveSettings | account.SaveAutoSaveSettings | account.DeleteAutoSaveExceptions | account.InvalidateSignInCodes | account.UpdateColor | account.GetDefaultBackgroundEmojis | account.GetChannelDefaultEmojiStatuses | account.GetChannelRestrictedStatusEmojis | account.UpdateBusinessWorkHours | account.UpdateBusinessLocation | account.UpdateBusinessGreetingMessage | account.UpdateBusinessAwayMessage | account.UpdateConnectedBot | account.GetConnectedBots | account.GetBotBusinessConnection | account.UpdateBusinessIntro | account.ToggleConnectedBotPaused | account.DisablePeerConnectedBot | account.UpdateBirthday | account.CreateBusinessChatLink | account.EditBusinessChatLink | account.DeleteBusinessChatLink | account.GetBusinessChatLinks | account.ResolveBusinessChatLink | account.UpdatePersonalChannel | account.ToggleSponsoredMessages | account.GetReactionsNotifySettings | account.SetReactionsNotifySettings | users.GetUsers | users.GetFullUser | users.SetSecureValueErrors | users.GetIsPremiumRequiredToContact | contacts.GetContactIDs | contacts.GetStatuses | contacts.GetContacts | contacts.ImportContacts | contacts.DeleteContacts | contacts.DeleteByPhones | contacts.Block | contacts.Unblock | contacts.GetBlocked | contacts.Search | contacts.ResolveUsername | contacts.GetTopPeers | contacts.ResetTopPeerRating | contacts.ResetSaved | contacts.GetSaved | contacts.ToggleTopPeers | contacts.AddContact | contacts.AcceptContact | contacts.GetLocated | contacts.BlockFromReplies | contacts.ResolvePhone | contacts.ExportContactToken | contacts.ImportContactToken | contacts.EditCloseFriends | contacts.SetBlocked | contacts.GetBirthdays | messages.GetMessages | messages.GetDialogs | messages.GetHistory | messages.Search | messages.ReadHistory | messages.DeleteHistory | messages.DeleteMessages | messages.ReceivedMessages | messages.SetTyping | messages.SendMessage | messages.SendMedia | messages.ForwardMessages | messages.ReportSpam | messages.GetPeerSettings | messages.Report | messages.GetChats | messages.GetFullChat | messages.EditChatTitle | messages.EditChatPhoto | messages.AddChatUser | messages.DeleteChatUser | messages.CreateChat | messages.GetDhConfig | messages.RequestEncryption | messages.AcceptEncryption | messages.DiscardEncryption | messages.SetEncryptedTyping | messages.ReadEncryptedHistory | messages.SendEncrypted | messages.SendEncryptedFile | messages.SendEncryptedService | messages.ReceivedQueue | messages.ReportEncryptedSpam | messages.ReadMessageContents | messages.GetStickers | messages.GetAllStickers | messages.GetWebPagePreview | messages.ExportChatInvite | messages.CheckChatInvite | messages.ImportChatInvite | messages.GetStickerSet | messages.InstallStickerSet | messages.UninstallStickerSet | messages.StartBot | messages.GetMessagesViews | messages.EditChatAdmin | messages.MigrateChat | messages.SearchGlobal | messages.ReorderStickerSets | messages.GetDocumentByHash | messages.GetSavedGifs | messages.SaveGif | messages.GetInlineBotResults | messages.SetInlineBotResults | messages.SendInlineBotResult | messages.GetMessageEditData | messages.EditMessage | messages.EditInlineBotMessage | messages.GetBotCallbackAnswer | messages.SetBotCallbackAnswer | messages.GetPeerDialogs | messages.SaveDraft | messages.GetAllDrafts | messages.GetFeaturedStickers | messages.ReadFeaturedStickers | messages.GetRecentStickers | messages.SaveRecentSticker | messages.ClearRecentStickers | messages.GetArchivedStickers | messages.GetMaskStickers | messages.GetAttachedStickers | messages.SetGameScore | messages.SetInlineGameScore | messages.GetGameHighScores | messages.GetInlineGameHighScores | messages.GetCommonChats | messages.GetWebPage | messages.ToggleDialogPin | messages.ReorderPinnedDialogs | messages.GetPinnedDialogs | messages.SetBotShippingResults | messages.SetBotPrecheckoutResults | messages.UploadMedia | messages.SendScreenshotNotification | messages.GetFavedStickers | messages.FaveSticker | messages.GetUnreadMentions | messages.ReadMentions | messages.GetRecentLocations | messages.SendMultiMedia | messages.UploadEncryptedFile | messages.SearchStickerSets | messages.GetSplitRanges | messages.MarkDialogUnread | messages.GetDialogUnreadMarks | messages.ClearAllDrafts | messages.UpdatePinnedMessage | messages.SendVote | messages.GetPollResults | messages.GetOnlines | messages.EditChatAbout | messages.EditChatDefaultBannedRights | messages.GetEmojiKeywords | messages.GetEmojiKeywordsDifference | messages.GetEmojiKeywordsLanguages | messages.GetEmojiURL | messages.GetSearchCounters | messages.RequestUrlAuth | messages.AcceptUrlAuth | messages.HidePeerSettingsBar | messages.GetScheduledHistory | messages.GetScheduledMessages | messages.SendScheduledMessages | messages.DeleteScheduledMessages | messages.GetPollVotes | messages.ToggleStickerSets | messages.GetDialogFilters | messages.GetSuggestedDialogFilters | messages.UpdateDialogFilter | messages.UpdateDialogFiltersOrder | messages.GetOldFeaturedStickers | messages.GetReplies | messages.GetDiscussionMessage | messages.ReadDiscussion | messages.UnpinAllMessages | messages.DeleteChat | messages.DeletePhoneCallHistory | messages.CheckHistoryImport | messages.InitHistoryImport | messages.UploadImportedMedia | messages.StartHistoryImport | messages.GetExportedChatInvites | messages.GetExportedChatInvite | messages.EditExportedChatInvite | messages.DeleteRevokedExportedChatInvites | messages.DeleteExportedChatInvite | messages.GetAdminsWithInvites | messages.GetChatInviteImporters | messages.SetHistoryTTL | messages.CheckHistoryImportPeer | messages.SetChatTheme | messages.GetMessageReadParticipants | messages.GetSearchResultsCalendar | messages.GetSearchResultsPositions | messages.HideChatJoinRequest | messages.HideAllChatJoinRequests | messages.ToggleNoForwards | messages.SaveDefaultSendAs | messages.SendReaction | messages.GetMessagesReactions | messages.GetMessageReactionsList | messages.SetChatAvailableReactions | messages.GetAvailableReactions | messages.SetDefaultReaction | messages.TranslateText | messages.GetUnreadReactions | messages.ReadReactions | messages.SearchSentMedia | messages.GetAttachMenuBots | messages.GetAttachMenuBot | messages.ToggleBotInAttachMenu | messages.RequestWebView | messages.ProlongWebView | messages.RequestSimpleWebView | messages.SendWebViewResultMessage | messages.SendWebViewData | messages.TranscribeAudio | messages.RateTranscribedAudio | messages.GetCustomEmojiDocuments | messages.GetEmojiStickers | messages.GetFeaturedEmojiStickers | messages.ReportReaction | messages.GetTopReactions | messages.GetRecentReactions | messages.ClearRecentReactions | messages.GetExtendedMedia | messages.SetDefaultHistoryTTL | messages.GetDefaultHistoryTTL | messages.SendBotRequestedPeer | messages.GetEmojiGroups | messages.GetEmojiStatusGroups | messages.GetEmojiProfilePhotoGroups | messages.SearchCustomEmoji | messages.TogglePeerTranslations | messages.GetBotApp | messages.RequestAppWebView | messages.SetChatWallPaper | messages.SearchEmojiStickerSets | messages.GetSavedDialogs | messages.GetSavedHistory | messages.DeleteSavedHistory | messages.GetPinnedSavedDialogs | messages.ToggleSavedDialogPin | messages.ReorderPinnedSavedDialogs | messages.GetSavedReactionTags | messages.UpdateSavedReactionTag | messages.GetDefaultTagReactions | messages.GetOutboxReadDate | messages.GetQuickReplies | messages.ReorderQuickReplies | messages.CheckQuickReplyShortcut | messages.EditQuickReplyShortcut | messages.DeleteQuickReplyShortcut | messages.GetQuickReplyMessages | messages.SendQuickReplyMessages | messages.DeleteQuickReplyMessages | messages.ToggleDialogFilterTags | messages.GetMyStickers @@ -17688,7 +17743,7 @@ namespace Api { | folders.EditPeerFolders | stats.GetBroadcastStats | stats.LoadAsyncGraph | stats.GetMegagroupStats | stats.GetMessagePublicForwards | stats.GetMessageStats | stats.GetStoryStats | stats.GetStoryPublicForwards | stats.GetBroadcastRevenueStats | stats.GetBroadcastRevenueWithdrawalUrl | stats.GetBroadcastRevenueTransactions | chatlists.ExportChatlistInvite | chatlists.DeleteExportedInvite | chatlists.EditExportedInvite | chatlists.GetExportedInvites | chatlists.CheckChatlistInvite | chatlists.JoinChatlistInvite | chatlists.GetChatlistUpdates | chatlists.JoinChatlistUpdates | chatlists.HideChatlistUpdates | chatlists.GetLeaveChatlistSuggestions | chatlists.LeaveChatlist - | stories.CanSendStory | stories.SendStory | stories.EditStory | stories.DeleteStories | stories.TogglePinned | stories.GetAllStories | stories.GetPinnedStories | stories.GetStoriesArchive | stories.GetStoriesByID | stories.ToggleAllStoriesHidden | stories.ReadStories | stories.IncrementStoryViews | stories.GetStoryViewsList | stories.GetStoriesViews | stories.ExportStoryLink | stories.Report | stories.ActivateStealthMode | stories.SendReaction | stories.GetPeerStories | stories.GetAllReadPeerStories | stories.GetPeerMaxIDs | stories.GetChatsToSend | stories.TogglePeerStoriesHidden | stories.GetStoryReactionsList + | stories.CanSendStory | stories.SendStory | stories.EditStory | stories.DeleteStories | stories.TogglePinned | stories.GetAllStories | stories.GetPinnedStories | stories.GetStoriesArchive | stories.GetStoriesByID | stories.ToggleAllStoriesHidden | stories.ReadStories | stories.IncrementStoryViews | stories.GetStoryViewsList | stories.GetStoriesViews | stories.ExportStoryLink | stories.Report | stories.ActivateStealthMode | stories.SendReaction | stories.GetPeerStories | stories.GetAllReadPeerStories | stories.GetPeerMaxIDs | stories.GetChatsToSend | stories.TogglePeerStoriesHidden | stories.GetStoryReactionsList | stories.TogglePinnedToTop | premium.GetBoostsList | premium.GetMyBoosts | premium.ApplyBoost | premium.GetBoostsStatus | premium.GetUserBoosts | smsjobs.IsEligibleToJoin | smsjobs.Join | smsjobs.Leave | smsjobs.UpdateSettings | smsjobs.GetStatus | smsjobs.GetSmsJob | smsjobs.FinishJob | fragment.GetCollectibleInfo; diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js index e993ac270..b662ac747 100644 --- a/src/lib/gramjs/tl/apiTl.js +++ b/src/lib/gramjs/tl/apiTl.js @@ -80,8 +80,8 @@ chat#41cbf256 flags:# creator:flags.0?true left:flags.2?true deactivated:flags.5 chatForbidden#6592a1a7 id:long title:string = Chat; channel#aadfc8f flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int = Chat; channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; -chatFull#c9d31138 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions = ChatFull; -channelFull#44c054a7 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; +chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull; +channelFull#bbab348d flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; chatParticipantAdmin#a0933f5b user_id:long inviter_id:long date:int = ChatParticipant; @@ -188,7 +188,7 @@ inputReportReasonGeoIrrelevant#dbd4feed = ReportReason; inputReportReasonFake#f5ddd6e7 = ReportReason; inputReportReasonIllegalDrugs#a8eb2be = ReportReason; inputReportReasonPersonalDetails#9ec7863d = ReportReason; -userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; +userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; contact#145ade0b user_id:long mutual:Bool = Contact; importedContact#c13e3c50 user_id:long client_id:long = ImportedContact; contactStatus#16d9703b user_id:long status:UserStatus = ContactStatus; @@ -359,6 +359,7 @@ updateBotBusinessConnect#8ae5c97a connection:BotBusinessConnection qts:int = Upd updateBotNewBusinessMessage#9ddb347c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotEditBusinessMessage#7df587c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotDeleteBusinessMessage#a02a982e connection_id:string peer:Peer messages:Vector qts:int = Update; +updateNewStoryReaction#1824e40b story_id:int peer:Peer reaction:Reaction = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference; updates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector state:updates.State = updates.Difference; @@ -927,7 +928,7 @@ inputWallPaperSlug#72091c80 slug:string = InputWallPaper; inputWallPaperNoFile#967a462e id:long = InputWallPaper; account.wallPapersNotModified#1c199183 = account.WallPapers; account.wallPapers#cdc3858c hash:long wallpapers:Vector = account.WallPapers; -codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; +codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true unknown_number:flags.9?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; wallPaperSettings#372efcd0 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int third_background_color:flags.5?int fourth_background_color:flags.6?int intensity:flags.3?int rotation:flags.4?int emoticon:flags.7?string = WallPaperSettings; autoDownloadSettings#baa57628 flags:# disabled:flags.0?true video_preload_large:flags.1?true audio_preload_next:flags.2?true phonecalls_less_data:flags.3?true stories_preload:flags.4?true photo_size_max:int video_size_max:long file_size_max:long video_upload_maxbitrate:int small_queue_active_operations_max:int large_queue_active_operations_max:int = AutoDownloadSettings; account.autoDownloadSettings#63cacf26 low:AutoDownloadSettings medium:AutoDownloadSettings high:AutoDownloadSettings = account.AutoDownloadSettings; @@ -967,6 +968,7 @@ inputThemeSettings#8fde504f flags:# message_colors_animated:flags.2?true base_th themeSettings#fa58b6d4 flags:# message_colors_animated:flags.2?true base_theme:BaseTheme accent_color:int outbox_accent_color:flags.3?int message_colors:flags.0?Vector wallpaper:flags.1?WallPaper = ThemeSettings; webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; webPageAttributeStory#2e94c3e7 flags:# peer:Peer id:int story:flags.0?StoryItem = WebPageAttribute; +webPageAttributeStickerSet#50cc03d3 flags:# emojis:flags.0?true text_color:flags.1?true stickers:Vector = WebPageAttribute; messages.votesList#4899484e flags:# count:int votes:Vector chats:Vector users:Vector next_offset:flags.0?string = messages.VotesList; bankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl; payments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData; @@ -1041,7 +1043,7 @@ botCommandScopePeerUser#a1321f3 peer:InputPeer user_id:InputUser = BotCommandSco account.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordResult; account.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult; account.resetPasswordOk#e926d63e = account.ResetPasswordResult; -sponsoredMessage#ed5383f7 flags:# recommended:flags.5?true show_peer_photo:flags.6?true can_report:flags.12?true random_id:bytes from_id:flags.3?Peer chat_invite:flags.4?ChatInvite chat_invite_hash:flags.4?string channel_post:flags.2?int start_param:flags.0?string webpage:flags.9?SponsoredWebPage app:flags.10?BotApp message:string entities:flags.1?Vector button_text:flags.11?string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; +sponsoredMessage#bdedf566 flags:# recommended:flags.5?true can_report:flags.12?true random_id:bytes url:string title:string message:string entities:flags.1?Vector photo:flags.6?Photo color:flags.13?PeerColor button_text:string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; messages.sponsoredMessages#c9ee1d87 flags:# posts_between:flags.0?int messages:Vector chats:Vector users:Vector = messages.SponsoredMessages; messages.sponsoredMessagesEmpty#1839490f = messages.SponsoredMessages; searchResultsCalendarPeriod#c9b0539f date:int min_msg_id:int max_msg_id:int count:int = SearchResultsCalendarPeriod; @@ -1165,14 +1167,13 @@ bots.botInfo#e8a775b0 name:string about:string description:string = bots.BotInfo messagePeerVote#b6cc2d5c peer:Peer option:bytes date:int = MessagePeerVote; messagePeerVoteInputOption#74cda504 peer:Peer date:int = MessagePeerVote; messagePeerVoteMultiple#4628f6e6 peer:Peer options:Vector date:int = MessagePeerVote; -sponsoredWebPage#3db8ec63 flags:# url:string site_name:string photo:flags.0?Photo = SponsoredWebPage; storyViews#8d595cd6 flags:# has_viewers:flags.1?true views_count:int forwards_count:flags.2?int reactions:flags.3?Vector reactions_count:flags.4?int recent_viewers:flags.0?Vector = StoryViews; storyItemDeleted#51e6ee4f id:int = StoryItem; storyItemSkipped#ffadc913 flags:# close_friends:flags.8?true id:int date:int expire_date:int = StoryItem; storyItem#79b26a24 flags:# pinned:flags.5?true public:flags.7?true close_friends:flags.8?true min:flags.9?true noforwards:flags.10?true edited:flags.11?true contacts:flags.12?true selected_contacts:flags.13?true out:flags.16?true id:int date:int from_id:flags.18?Peer fwd_from:flags.17?StoryFwdHeader expire_date:int caption:flags.0?string entities:flags.1?Vector media:MessageMedia media_areas:flags.14?Vector privacy:flags.2?Vector views:flags.3?StoryViews sent_reaction:flags.15?Reaction = StoryItem; stories.allStoriesNotModified#1158fe3e flags:# state:string stealth_mode:StoriesStealthMode = stories.AllStories; stories.allStories#6efc5e81 flags:# has_more:flags.0?true count:int state:string peer_stories:Vector chats:Vector users:Vector stealth_mode:StoriesStealthMode = stories.AllStories; -stories.stories#5dd8c3c8 count:int stories:Vector chats:Vector users:Vector = stories.Stories; +stories.stories#63c3dd0a flags:# count:int stories:Vector pinned_to_top:flags.0?Vector chats:Vector users:Vector = stories.Stories; storyView#b0bdeac5 flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true user_id:long date:int reaction:flags.2?Reaction = StoryView; storyViewPublicForward#9083670b flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true message:Message = StoryView; storyViewPublicRepost#bd74cf49 flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true peer_id:Peer story:StoryItem = StoryView; @@ -1284,6 +1285,9 @@ broadcastRevenueTransactionProceeds#557e2cc4 amount:long from_date:int to_date:i broadcastRevenueTransactionWithdrawal#5a590978 flags:# pending:flags.0?true failed:flags.2?true amount:long date:int provider:string transaction_date:flags.1?int transaction_url:flags.1?string = BroadcastRevenueTransaction; broadcastRevenueTransactionRefund#42d30d2e amount:long date:int provider:string = BroadcastRevenueTransaction; stats.broadcastRevenueTransactions#87158466 count:int transactions:Vector = stats.BroadcastRevenueTransactions; +reactionNotificationsFromContacts#bac3a61a = ReactionNotificationsFrom; +reactionNotificationsFromAll#4b9e22a0 = ReactionNotificationsFrom; +reactionsNotifySettings#56e34970 flags:# messages_notify_from:flags.0?ReactionNotificationsFrom stories_notify_from:flags.1?ReactionNotificationsFrom sound:NotificationSound show_previews:Bool = ReactionsNotifySettings; ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X; @@ -1345,6 +1349,7 @@ account.getRecentEmojiStatuses#f578105 hash:long = account.EmojiStatuses; account.reorderUsernames#ef500eab order:Vector = Bool; account.toggleUsername#58d6b376 username:string active:Bool = Bool; account.resolveBusinessChatLink#5492e5ee slug:string = account.ResolvedBusinessChatLinks; +account.toggleSponsoredMessages#b9d9a38d enabled:Bool = Bool; users.getUsers#d91a548 id:Vector = Vector; users.getFullUser#b60f5918 id:InputUser = users.UserFull; contacts.getContacts#5dd69e12 hash:long = contacts.Contacts; @@ -1395,7 +1400,7 @@ messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; messages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_param:string = Updates; messages.getMessagesViews#5784d3e1 peer:InputPeer id:Vector increment:Bool = messages.MessageViews; messages.migrateChat#a2875319 chat_id:long = Updates; -messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.searchGlobal#4bc6589a flags:# broadcasts_only:flags.1?true folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; messages.getDocumentByHash#b1f2061f sha256:bytes size:long mime_type:string = Document; messages.getSavedGifs#5cf09635 hash:long = messages.SavedGifs; messages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool; @@ -1457,7 +1462,7 @@ messages.saveDefaultSendAs#ccfddf96 peer:InputPeer send_as:InputPeer = Bool; messages.sendReaction#d30d78d4 flags:# big:flags.1?true add_to_recent:flags.2?true peer:InputPeer msg_id:int reaction:flags.0?Vector = Updates; messages.getMessagesReactions#8bba90e6 peer:InputPeer id:Vector = Updates; messages.getMessageReactionsList#461b3f48 flags:# peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = messages.MessageReactionsList; -messages.setChatAvailableReactions#feb16771 peer:InputPeer available_reactions:ChatReactions = Updates; +messages.setChatAvailableReactions#5a150bd4 flags:# peer:InputPeer available_reactions:ChatReactions reactions_limit:flags.0?int = Updates; messages.getAvailableReactions#18dea0ac hash:int = messages.AvailableReactions; messages.setDefaultReaction#4f47a016 reaction:Reaction = Bool; messages.translateText#63183030 flags:# peer:flags.0?InputPeer id:flags.0?Vector text:flags.1?Vector to_lang:string = messages.TranslatedText; @@ -1557,7 +1562,8 @@ channels.deleteTopicHistory#34435f2d channel:InputChannel top_msg_id:int = messa channels.toggleParticipantsHidden#6a6e7854 channel:InputChannel enabled:Bool = Updates; channels.clickSponsoredMessage#18afbc93 channel:InputChannel random_id:bytes = Bool; channels.toggleViewForumAsMessages#9738bb15 channel:InputChannel enabled:Bool = Updates; -channels.getChannelRecommendations#83b70d97 channel:InputChannel = messages.Chats; +channels.getChannelRecommendations#25a71742 flags:# channel:flags.0?InputChannel = messages.Chats; +channels.reportSponsoredMessage#af8ff6b9 channel:InputChannel random_id:bytes option:bytes = channels.SponsoredMessageReportResult; bots.setBotInfo#10cf3123 flags:# bot:flags.2?InputUser lang_code:string name:flags.3?string about:flags.0?string description:flags.1?string = Bool; bots.canSendMessage#1359f4e6 bot:InputUser = Bool; bots.allowSendMessage#f132e3ef bot:InputUser = Updates; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index 3d03916b2..c50389935 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -59,6 +59,7 @@ "account.reorderUsernames", "account.toggleUsername", "account.resolveBusinessChatLink", + "account.toggleSponsoredMessages", "users.getUsers", "users.getFullUser", "contacts.getContacts", @@ -221,6 +222,7 @@ "channels.viewSponsoredMessage", "channels.getSponsoredMessages", "channels.getChannelRecommendations", + "channels.reportSponsoredMessage", "bots.canSendMessage", "bots.allowSendMessage", "bots.invokeWebViewCustomMethod", diff --git a/src/lib/gramjs/tl/static/api.tl b/src/lib/gramjs/tl/static/api.tl index e319e0e22..4f5794895 100644 --- a/src/lib/gramjs/tl/static/api.tl +++ b/src/lib/gramjs/tl/static/api.tl @@ -100,8 +100,8 @@ chatForbidden#6592a1a7 id:long title:string = Chat; channel#aadfc8f flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int = Chat; channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; -chatFull#c9d31138 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions = ChatFull; -channelFull#44c054a7 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; +chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull; +channelFull#bbab348d flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; @@ -228,7 +228,7 @@ inputReportReasonFake#f5ddd6e7 = ReportReason; inputReportReasonIllegalDrugs#a8eb2be = ReportReason; inputReportReasonPersonalDetails#9ec7863d = ReportReason; -userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; +userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; contact#145ade0b user_id:long mutual:Bool = Contact; @@ -412,6 +412,7 @@ updateBotBusinessConnect#8ae5c97a connection:BotBusinessConnection qts:int = Upd updateBotNewBusinessMessage#9ddb347c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotEditBusinessMessage#7df587c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotDeleteBusinessMessage#a02a982e connection_id:string peer:Peer messages:Vector qts:int = Update; +updateNewStoryReaction#1824e40b story_id:int peer:Peer reaction:Reaction = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -1171,7 +1172,7 @@ inputWallPaperNoFile#967a462e id:long = InputWallPaper; account.wallPapersNotModified#1c199183 = account.WallPapers; account.wallPapers#cdc3858c hash:long wallpapers:Vector = account.WallPapers; -codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; +codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true unknown_number:flags.9?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; wallPaperSettings#372efcd0 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int third_background_color:flags.5?int fourth_background_color:flags.6?int intensity:flags.3?int rotation:flags.4?int emoticon:flags.7?string = WallPaperSettings; @@ -1236,6 +1237,7 @@ themeSettings#fa58b6d4 flags:# message_colors_animated:flags.2?true base_theme:B webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; webPageAttributeStory#2e94c3e7 flags:# peer:Peer id:int story:flags.0?StoryItem = WebPageAttribute; +webPageAttributeStickerSet#50cc03d3 flags:# emojis:flags.0?true text_color:flags.1?true stickers:Vector = WebPageAttribute; messages.votesList#4899484e flags:# count:int votes:Vector chats:Vector users:Vector next_offset:flags.0?string = messages.VotesList; @@ -1361,7 +1363,7 @@ account.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordR account.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult; account.resetPasswordOk#e926d63e = account.ResetPasswordResult; -sponsoredMessage#ed5383f7 flags:# recommended:flags.5?true show_peer_photo:flags.6?true can_report:flags.12?true random_id:bytes from_id:flags.3?Peer chat_invite:flags.4?ChatInvite chat_invite_hash:flags.4?string channel_post:flags.2?int start_param:flags.0?string webpage:flags.9?SponsoredWebPage app:flags.10?BotApp message:string entities:flags.1?Vector button_text:flags.11?string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; +sponsoredMessage#bdedf566 flags:# recommended:flags.5?true can_report:flags.12?true random_id:bytes url:string title:string message:string entities:flags.1?Vector photo:flags.6?Photo color:flags.13?PeerColor button_text:string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; messages.sponsoredMessages#c9ee1d87 flags:# posts_between:flags.0?int messages:Vector chats:Vector users:Vector = messages.SponsoredMessages; messages.sponsoredMessagesEmpty#1839490f = messages.SponsoredMessages; @@ -1565,8 +1567,6 @@ messagePeerVote#b6cc2d5c peer:Peer option:bytes date:int = MessagePeerVote; messagePeerVoteInputOption#74cda504 peer:Peer date:int = MessagePeerVote; messagePeerVoteMultiple#4628f6e6 peer:Peer options:Vector date:int = MessagePeerVote; -sponsoredWebPage#3db8ec63 flags:# url:string site_name:string photo:flags.0?Photo = SponsoredWebPage; - storyViews#8d595cd6 flags:# has_viewers:flags.1?true views_count:int forwards_count:flags.2?int reactions:flags.3?Vector reactions_count:flags.4?int recent_viewers:flags.0?Vector = StoryViews; storyItemDeleted#51e6ee4f id:int = StoryItem; @@ -1576,7 +1576,7 @@ storyItem#79b26a24 flags:# pinned:flags.5?true public:flags.7?true close_friends stories.allStoriesNotModified#1158fe3e flags:# state:string stealth_mode:StoriesStealthMode = stories.AllStories; stories.allStories#6efc5e81 flags:# has_more:flags.0?true count:int state:string peer_stories:Vector chats:Vector users:Vector stealth_mode:StoriesStealthMode = stories.AllStories; -stories.stories#5dd8c3c8 count:int stories:Vector chats:Vector users:Vector = stories.Stories; +stories.stories#63c3dd0a flags:# count:int stories:Vector pinned_to_top:flags.0?Vector chats:Vector users:Vector = stories.Stories; storyView#b0bdeac5 flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true user_id:long date:int reaction:flags.2?Reaction = StoryView; storyViewPublicForward#9083670b flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true message:Message = StoryView; @@ -1770,6 +1770,11 @@ broadcastRevenueTransactionRefund#42d30d2e amount:long date:int provider:string stats.broadcastRevenueTransactions#87158466 count:int transactions:Vector = stats.BroadcastRevenueTransactions; +reactionNotificationsFromContacts#bac3a61a = ReactionNotificationsFrom; +reactionNotificationsFromAll#4b9e22a0 = ReactionNotificationsFrom; + +reactionsNotifySettings#56e34970 flags:# messages_notify_from:flags.0?ReactionNotificationsFrom stories_notify_from:flags.1?ReactionNotificationsFrom sound:NotificationSound show_previews:Bool = ReactionsNotifySettings; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1913,6 +1918,9 @@ account.deleteBusinessChatLink#60073674 slug:string = Bool; account.getBusinessChatLinks#6f70dde1 = account.BusinessChatLinks; account.resolveBusinessChatLink#5492e5ee slug:string = account.ResolvedBusinessChatLinks; account.updatePersonalChannel#d94305e0 channel:InputChannel = Bool; +account.toggleSponsoredMessages#b9d9a38d enabled:Bool = Bool; +account.getReactionsNotifySettings#6dd654c = ReactionsNotifySettings; +account.setReactionsNotifySettings#316ce548 settings:ReactionsNotifySettings = ReactionsNotifySettings; users.getUsers#d91a548 id:Vector = Vector; users.getFullUser#b60f5918 id:InputUser = users.UserFull; @@ -1993,7 +2001,7 @@ messages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_par messages.getMessagesViews#5784d3e1 peer:InputPeer id:Vector increment:Bool = messages.MessageViews; messages.editChatAdmin#a85bd1c2 chat_id:long user_id:InputUser is_admin:Bool = Bool; messages.migrateChat#a2875319 chat_id:long = Updates; -messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.searchGlobal#4bc6589a flags:# broadcasts_only:flags.1?true folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; messages.reorderStickerSets#78337739 flags:# masks:flags.0?true emojis:flags.1?true order:Vector = Bool; messages.getDocumentByHash#b1f2061f sha256:bytes size:long mime_type:string = Document; messages.getSavedGifs#5cf09635 hash:long = messages.SavedGifs; @@ -2097,7 +2105,7 @@ messages.saveDefaultSendAs#ccfddf96 peer:InputPeer send_as:InputPeer = Bool; messages.sendReaction#d30d78d4 flags:# big:flags.1?true add_to_recent:flags.2?true peer:InputPeer msg_id:int reaction:flags.0?Vector = Updates; messages.getMessagesReactions#8bba90e6 peer:InputPeer id:Vector = Updates; messages.getMessageReactionsList#461b3f48 flags:# peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = messages.MessageReactionsList; -messages.setChatAvailableReactions#feb16771 peer:InputPeer available_reactions:ChatReactions = Updates; +messages.setChatAvailableReactions#5a150bd4 flags:# peer:InputPeer available_reactions:ChatReactions reactions_limit:flags.0?int = Updates; messages.getAvailableReactions#18dea0ac hash:int = messages.AvailableReactions; messages.setDefaultReaction#4f47a016 reaction:Reaction = Bool; messages.translateText#63183030 flags:# peer:flags.0?InputPeer id:flags.0?Vector text:flags.1?Vector to_lang:string = messages.TranslatedText; @@ -2258,7 +2266,7 @@ channels.toggleParticipantsHidden#6a6e7854 channel:InputChannel enabled:Bool = U channels.clickSponsoredMessage#18afbc93 channel:InputChannel random_id:bytes = Bool; channels.updateColor#d8aa3671 flags:# for_profile:flags.1?true channel:InputChannel color:flags.2?int background_emoji_id:flags.0?long = Updates; channels.toggleViewForumAsMessages#9738bb15 channel:InputChannel enabled:Bool = Updates; -channels.getChannelRecommendations#83b70d97 channel:InputChannel = messages.Chats; +channels.getChannelRecommendations#25a71742 flags:# channel:flags.0?InputChannel = messages.Chats; channels.updateEmojiStatus#f0d3e6a8 channel:InputChannel emoji_status:EmojiStatus = Updates; channels.setBoostsToUnblockRestrictions#ad399cee channel:InputChannel boosts:int = Updates; channels.setEmojiStickers#3cd930b7 channel:InputChannel stickerset:InputStickerSet = Bool; @@ -2398,6 +2406,7 @@ stories.getPeerMaxIDs#535983c3 id:Vector = Vector; stories.getChatsToSend#a56a8b60 = messages.Chats; stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool; stories.getStoryReactionsList#b9b2881f flags:# forwards_first:flags.2?true peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = stories.StoryReactionsList; +stories.togglePinnedToTop#b297e9b peer:InputPeer id:Vector = Bool; premium.getBoostsList#60f67660 flags:# gifts:flags.0?true peer:InputPeer offset:string limit:int = premium.BoostsList; premium.getMyBoosts#be77b4a = premium.MyBoosts; diff --git a/src/styles/icons.scss b/src/styles/icons.scss index f8f866e89..e809895bf 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -158,110 +158,112 @@ $icons-map: ( "my-notes": "\f17f", "new-chat-filled": "\f180", "next": "\f181", - "noise-suppression": "\f182", - "non-contacts": "\f183", - "one-filled": "\f184", - "open-in-new-tab": "\f185", - "password-off": "\f186", - "pause": "\f187", - "permissions": "\f188", - "phone-discard-outline": "\f189", - "phone-discard": "\f18a", - "phone": "\f18b", - "photo": "\f18c", - "pin-badge": "\f18d", - "pin-list": "\f18e", - "pin": "\f18f", - "pinned-chat": "\f190", - "pinned-message": "\f191", - "pip": "\f192", - "play-story": "\f193", - "play": "\f194", - "poll": "\f195", - "premium": "\f196", - "previous": "\f197", - "privacy-policy": "\f198", - "quote-text": "\f199", - "quote": "\f19a", - "readchats": "\f19b", - "recent": "\f19c", - "reload": "\f19d", - "remove": "\f19e", - "reopen-topic": "\f19f", - "replace": "\f1a0", - "replies": "\f1a1", - "reply-filled": "\f1a2", - "reply": "\f1a3", - "revote": "\f1a4", - "save-story": "\f1a5", - "saved-messages": "\f1a6", - "schedule": "\f1a7", - "search": "\f1a8", - "select": "\f1a9", - "send-outline": "\f1aa", - "send": "\f1ab", - "settings-filled": "\f1ac", - "settings": "\f1ad", - "share-filled": "\f1ae", - "share-screen-outlined": "\f1af", - "share-screen-stop": "\f1b0", - "share-screen": "\f1b1", - "sidebar": "\f1b2", - "skip-next": "\f1b3", - "skip-previous": "\f1b4", - "smallscreen": "\f1b5", - "smile": "\f1b6", - "sort": "\f1b7", - "speaker-muted-story": "\f1b8", - "speaker-outline": "\f1b9", - "speaker-story": "\f1ba", - "speaker": "\f1bb", - "spoiler-disable": "\f1bc", - "spoiler": "\f1bd", - "sport": "\f1be", - "stats": "\f1bf", - "stealth-future": "\f1c0", - "stealth-past": "\f1c1", - "stickers": "\f1c2", - "stop-raising-hand": "\f1c3", - "stop": "\f1c4", - "story-caption": "\f1c5", - "story-expired": "\f1c6", - "story-priority": "\f1c7", - "story-reply": "\f1c8", - "strikethrough": "\f1c9", - "tag-add": "\f1ca", - "tag-crossed": "\f1cb", - "tag-filter": "\f1cc", - "tag-name": "\f1cd", - "tag": "\f1ce", - "timer": "\f1cf", - "transcribe": "\f1d0", - "truck": "\f1d1", - "unarchive": "\f1d2", - "underlined": "\f1d3", - "unlock-badge": "\f1d4", - "unlock": "\f1d5", - "unmute": "\f1d6", - "unpin": "\f1d7", - "unread": "\f1d8", - "up": "\f1d9", - "user-filled": "\f1da", - "user-online": "\f1db", - "user": "\f1dc", - "video-outlined": "\f1dd", - "video-stop": "\f1de", - "video": "\f1df", - "view-once": "\f1e0", - "voice-chat": "\f1e1", - "volume-1": "\f1e2", - "volume-2": "\f1e3", - "volume-3": "\f1e4", - "web": "\f1e5", - "webapp": "\f1e6", - "word-wrap": "\f1e7", - "zoom-in": "\f1e8", - "zoom-out": "\f1e9", + "nochannel": "\f182", + "noise-suppression": "\f183", + "non-contacts": "\f184", + "one-filled": "\f185", + "open-in-new-tab": "\f186", + "password-off": "\f187", + "pause": "\f188", + "permissions": "\f189", + "phone-discard-outline": "\f18a", + "phone-discard": "\f18b", + "phone": "\f18c", + "photo": "\f18d", + "pin-badge": "\f18e", + "pin-list": "\f18f", + "pin": "\f190", + "pinned-chat": "\f191", + "pinned-message": "\f192", + "pip": "\f193", + "play-story": "\f194", + "play": "\f195", + "poll": "\f196", + "premium": "\f197", + "previous": "\f198", + "privacy-policy": "\f199", + "quote-text": "\f19a", + "quote": "\f19b", + "readchats": "\f19c", + "recent": "\f19d", + "reload": "\f19e", + "remove": "\f19f", + "reopen-topic": "\f1a0", + "replace": "\f1a1", + "replies": "\f1a2", + "reply-filled": "\f1a3", + "reply": "\f1a4", + "revenue-split": "\f1a5", + "revote": "\f1a6", + "save-story": "\f1a7", + "saved-messages": "\f1a8", + "schedule": "\f1a9", + "search": "\f1aa", + "select": "\f1ab", + "send-outline": "\f1ac", + "send": "\f1ad", + "settings-filled": "\f1ae", + "settings": "\f1af", + "share-filled": "\f1b0", + "share-screen-outlined": "\f1b1", + "share-screen-stop": "\f1b2", + "share-screen": "\f1b3", + "sidebar": "\f1b4", + "skip-next": "\f1b5", + "skip-previous": "\f1b6", + "smallscreen": "\f1b7", + "smile": "\f1b8", + "sort": "\f1b9", + "speaker-muted-story": "\f1ba", + "speaker-outline": "\f1bb", + "speaker-story": "\f1bc", + "speaker": "\f1bd", + "spoiler-disable": "\f1be", + "spoiler": "\f1bf", + "sport": "\f1c0", + "stats": "\f1c1", + "stealth-future": "\f1c2", + "stealth-past": "\f1c3", + "stickers": "\f1c4", + "stop-raising-hand": "\f1c5", + "stop": "\f1c6", + "story-caption": "\f1c7", + "story-expired": "\f1c8", + "story-priority": "\f1c9", + "story-reply": "\f1ca", + "strikethrough": "\f1cb", + "tag-add": "\f1cc", + "tag-crossed": "\f1cd", + "tag-filter": "\f1ce", + "tag-name": "\f1cf", + "tag": "\f1d0", + "timer": "\f1d1", + "transcribe": "\f1d2", + "truck": "\f1d3", + "unarchive": "\f1d4", + "underlined": "\f1d5", + "unlock-badge": "\f1d6", + "unlock": "\f1d7", + "unmute": "\f1d8", + "unpin": "\f1d9", + "unread": "\f1da", + "up": "\f1db", + "user-filled": "\f1dc", + "user-online": "\f1dd", + "user": "\f1de", + "video-outlined": "\f1df", + "video-stop": "\f1e0", + "video": "\f1e1", + "view-once": "\f1e2", + "voice-chat": "\f1e3", + "volume-1": "\f1e4", + "volume-2": "\f1e5", + "volume-3": "\f1e6", + "web": "\f1e7", + "webapp": "\f1e8", + "word-wrap": "\f1e9", + "zoom-in": "\f1ea", + "zoom-out": "\f1eb", ); .icon-active-sessions::before { @@ -651,6 +653,9 @@ $icons-map: ( .icon-next::before { content: map.get($icons-map, "next"); } +.icon-nochannel::before { + content: map.get($icons-map, "nochannel"); +} .icon-noise-suppression::before { content: map.get($icons-map, "noise-suppression"); } @@ -753,6 +758,9 @@ $icons-map: ( .icon-reply::before { content: map.get($icons-map, "reply"); } +.icon-revenue-split::before { + content: map.get($icons-map, "revenue-split"); +} .icon-revote::before { content: map.get($icons-map, "revote"); } diff --git a/src/styles/icons.woff b/src/styles/icons.woff index c334a07b9..f944e4d08 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 70eded375..1a74a357a 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 57739f1ea..8f49ccf13 100644 --- a/src/types/icons/font.ts +++ b/src/types/icons/font.ts @@ -128,6 +128,7 @@ export type FontIconName = | 'my-notes' | 'new-chat-filled' | 'next' + | 'nochannel' | 'noise-suppression' | 'non-contacts' | 'one-filled' @@ -162,6 +163,7 @@ export type FontIconName = | 'replies' | 'reply-filled' | 'reply' + | 'revenue-split' | 'revote' | 'save-story' | 'saved-messages'