From 9daa5f1a194c977554a90a1ea8930ba2fb8877cf Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Thu, 29 Aug 2024 15:52:26 +0200 Subject: [PATCH] Statistics: Monetization Stats for Channels (#4843) Co-authored-by: zubiden <19638254+zubiden@users.noreply.github.com> --- src/api/gramjs/apiBuilders/statistics.ts | 34 +- src/api/gramjs/methods/chats.ts | 2 + src/api/gramjs/methods/index.ts | 1 + src/api/gramjs/methods/statistics.ts | 17 + src/api/types/chats.ts | 1 + src/api/types/statistics.ts | 15 + src/assets/font-icons/cash-circle.svg | 3 + src/assets/font-icons/toncoin.svg | 3 + src/assets/localization/fallback.strings | 4 + src/bundles/extra.ts | 1 + .../common/AboutAdsModal.module.scss | 24 +- src/components/common/AboutAdsModal.tsx | 119 ++--- .../common/AboutMonetizationModal.async.tsx | 18 + .../common/AboutMonetizationModal.module.scss | 10 + .../common/AboutMonetizationModal.tsx | 105 +++++ src/components/middle/HeaderActions.tsx | 5 + src/components/middle/HeaderMenuContainer.tsx | 17 + .../middle/message/MessageContextMenu.tsx | 6 +- .../middle/message/SponsoredMessage.tsx | 4 +- .../SponsoredMessageContextMenuContainer.tsx | 8 +- .../modals/common/TableAboutModal.module.scss | 39 ++ .../modals/common/TableAboutModal.tsx | 68 +++ src/components/right/RightColumn.tsx | 9 + src/components/right/RightHeader.tsx | 7 + .../MonetizationStatistics.module.scss | 76 ++++ .../statistics/MonetizationStatistics.tsx | 237 ++++++++++ .../statistics/StatisticsOverview.module.scss | 21 +- .../right/statistics/StatisticsOverview.tsx | 44 +- src/components/ui/Button.tsx | 2 + src/config.ts | 1 + src/global/actions/api/payments.ts | 14 + src/global/actions/api/statistics.ts | 23 + src/global/actions/ui/stories.ts | 8 + src/global/reducers/statistics.ts | 13 + src/global/selectors/ui.ts | 2 + src/global/types.ts | 14 + src/lib/gramjs/tl/apiTl.js | 1 + src/lib/gramjs/tl/static/api.json | 1 + src/lib/lovely-chart/Axes.js | 48 +- src/lib/lovely-chart/Tooltip.js | 35 +- src/lib/lovely-chart/data.js | 13 +- src/lib/lovely-chart/format.js | 4 + src/styles/icons.scss | 412 +++++++++--------- src/styles/icons.woff | Bin 30548 -> 30752 bytes src/styles/icons.woff2 | Bin 25576 -> 25692 bytes src/types/icons/font.ts | 2 + src/types/index.ts | 1 + src/types/language.d.ts | 10 + 48 files changed, 1199 insertions(+), 303 deletions(-) create mode 100644 src/assets/font-icons/cash-circle.svg create mode 100644 src/assets/font-icons/toncoin.svg create mode 100644 src/components/common/AboutMonetizationModal.async.tsx create mode 100644 src/components/common/AboutMonetizationModal.module.scss create mode 100644 src/components/common/AboutMonetizationModal.tsx create mode 100644 src/components/modals/common/TableAboutModal.module.scss create mode 100644 src/components/modals/common/TableAboutModal.tsx create mode 100644 src/components/right/statistics/MonetizationStatistics.module.scss create mode 100644 src/components/right/statistics/MonetizationStatistics.tsx diff --git a/src/api/gramjs/apiBuilders/statistics.ts b/src/api/gramjs/apiBuilders/statistics.ts index 9dc6a5643..2419cc4e3 100644 --- a/src/api/gramjs/apiBuilders/statistics.ts +++ b/src/api/gramjs/apiBuilders/statistics.ts @@ -1,11 +1,13 @@ import { Api as GramJs } from '../../../lib/gramjs'; import type { + ApiChannelMonetizationStatistics, ApiChannelStatistics, ApiGroupStatistics, ApiMessagePublicForward, ApiPostStatistics, ApiStoryPublicForward, + ChannelMonetizationBalances, PrepaidGiveaway, StatisticsGraph, StatisticsMessageInteractionCounter, StatisticsOverviewItem, @@ -17,6 +19,8 @@ import type { import { buildApiUsernames, buildAvatarPhotoId } from './common'; import { buildApiPeerId, getApiChatIdFromMtpPeer } from './peers'; +const DECIMALS = 10 ** 9; + export function buildChannelStatistics(stats: GramJs.stats.BroadcastStats): ApiChannelStatistics { return { // Graphs @@ -49,6 +53,20 @@ export function buildChannelStatistics(stats: GramJs.stats.BroadcastStats): ApiC }; } +export function buildChannelMonetizationStatistics( + stats: GramJs.stats.BroadcastRevenueStats, +): ApiChannelMonetizationStatistics { + return { + // Graphs + topHoursGraph: buildGraph(stats.topHoursGraph), + revenueGraph: buildGraph(stats.revenueGraph, undefined, true, stats.usdRate), + + // Statistics overview + balances: buildChannelMonetizationBalances(stats.balances), + usdRate: stats.usdRate, + }; +} + export function buildApiPostInteractionCounter( interaction: GramJs.TypePostInteractionCounters, ): StatisticsMessageInteractionCounter | StatisticsStoryInteractionCounter | undefined { @@ -136,7 +154,7 @@ export function buildStoryPublicForwards( } export function buildGraph( - result: GramJs.TypeStatsGraph, isPercentage?: boolean, + result: GramJs.TypeStatsGraph, isPercentage?: boolean, isCurrency?: boolean, currencyRate?: number, ): StatisticsGraph | undefined { if ((result as GramJs.StatsGraphError).error) { return undefined; @@ -156,6 +174,8 @@ export function buildGraph( hasSecondYAxis, isStacked: data.stacked && !hasSecondYAxis, isPercentage, + isCurrency, + currencyRate, datasets: y.map((item: any) => { const key = item[0]; @@ -249,3 +269,15 @@ function buildApiMessagePublicForward(message: GramJs.TypeMessage, chats: GramJs }, }; } + +function buildChannelMonetizationBalances({ + currentBalance, + availableBalance, + overallRevenue, +}: GramJs.BroadcastRevenueBalances): ChannelMonetizationBalances { + return { + currentBalance: Number(currentBalance) / DECIMALS, + availableBalance: Number(availableBalance) / DECIMALS, + overallRevenue: Number(overallRevenue) / DECIMALS, + }; +} diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index b8f4114f6..4707f1982 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -640,6 +640,7 @@ async function getFullChannelInfo( emojiset, boostsApplied, boostsUnrestrict, + canViewRevenue: canViewMonetization, } = result.fullChat; if (chatPhoto) { @@ -700,6 +701,7 @@ async function getFullChannelInfo( } : undefined, canViewMembers: canViewParticipants, canViewStatistics: canViewStats, + canViewMonetization, isPreHistoryHidden: hiddenPrehistory, members, kickedMembers, diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index 93ec6dd24..0a809c562 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -84,6 +84,7 @@ export * from './reactions'; export { fetchChannelStatistics, fetchGroupStatistics, fetchMessageStatistics, fetchMessagePublicForwards, fetchStatisticsAsyncGraph, fetchStoryStatistics, fetchStoryPublicForwards, + fetchChannelMonetizationStatistics, } from './statistics'; export { diff --git a/src/api/gramjs/methods/statistics.ts b/src/api/gramjs/methods/statistics.ts index 31384c6b7..758a606f5 100644 --- a/src/api/gramjs/methods/statistics.ts +++ b/src/api/gramjs/methods/statistics.ts @@ -8,6 +8,7 @@ import type { import { STATISTICS_PUBLIC_FORWARDS_LIMIT } from '../../../config'; import { buildApiChatFromPreview } from '../apiBuilders/chats'; import { + buildChannelMonetizationStatistics, buildChannelStatistics, buildGraph, buildGroupStatistics, @@ -39,6 +40,22 @@ export async function fetchChannelStatistics({ }; } +export async function fetchChannelMonetizationStatistics({ + chat, dcId, +}: { chat: ApiChat; dcId?: number }) { + const result = await invokeRequest(new GramJs.stats.GetBroadcastRevenueStats({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + }), { + dcId, + }); + + if (!result) { + return undefined; + } + + return buildChannelMonetizationStatistics(result); +} + export async function fetchGroupStatistics({ chat, dcId, }: { chat: ApiChat; dcId?: number }) { diff --git a/src/api/types/chats.ts b/src/api/types/chats.ts index e001cc07c..f6889674f 100644 --- a/src/api/types/chats.ts +++ b/src/api/types/chats.ts @@ -126,6 +126,7 @@ export interface ApiChatFullInfo { reactionsLimit?: number; sendAsId?: string; canViewStatistics?: boolean; + canViewMonetization?: boolean; recentRequesterIds?: string[]; requestsPending?: number; statisticsDcId?: number; diff --git a/src/api/types/statistics.ts b/src/api/types/statistics.ts index f91a27adc..4d1a7f19d 100644 --- a/src/api/types/statistics.ts +++ b/src/api/types/statistics.ts @@ -23,6 +23,13 @@ export interface ApiChannelStatistics { recentPosts: Array; } +export interface ApiChannelMonetizationStatistics { + topHoursGraph?: StatisticsGraph | string; + revenueGraph?: StatisticsGraph | string; + balances?: ChannelMonetizationBalances; + usdRate?: number; +} + export interface ApiGroupStatistics { growthGraph?: StatisticsGraph | string; membersGraph?: StatisticsGraph | string; @@ -79,6 +86,8 @@ export interface StatisticsGraph { labels: Array; isStacked: boolean; isPercentage?: boolean; + isCurrency?: boolean; + currencyRate?: number; hideCaption: boolean; hasSecondYAxis: boolean; minimapRange: { @@ -131,3 +140,9 @@ export interface StatisticsStoryInteractionCounter { forwardsCount: number; reactionsCount: number; } + +export interface ChannelMonetizationBalances { + currentBalance: number; + availableBalance: number; + overallRevenue: number; +} diff --git a/src/assets/font-icons/cash-circle.svg b/src/assets/font-icons/cash-circle.svg new file mode 100644 index 000000000..8743da4da --- /dev/null +++ b/src/assets/font-icons/cash-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/font-icons/toncoin.svg b/src/assets/font-icons/toncoin.svg new file mode 100644 index 000000000..2ebd21efa --- /dev/null +++ b/src/assets/font-icons/toncoin.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/localization/fallback.strings b/src/assets/localization/fallback.strings index 3350aaac8..211f114d7 100644 --- a/src/assets/localization/fallback.strings +++ b/src/assets/localization/fallback.strings @@ -1271,6 +1271,10 @@ "MenuInstallApp" = "Install App"; "RemoveEffect" = "Remove effect"; "ReplyInPrivateMessage" = "Reply In Private Message"; +"MonetizationInfoTONTitle" = "What is 💎 TON?"; +"ChannelEarnLearnCoinAbout" = "TON is a blockchain platform and cryptocurrency that Telegram uses for its high speed and low commissions on transactions. {link}"; +"MonetizationBalanceZeroInfo" = "You will be able to collect rewards using Fragment, a third-party platform used by advertisers to pay for ads. {link}"; +"ChannelEarnAbout" = "Telegram shares 50% of the revenue from ads displayed in your channel as rewards. {link}"; "AriaSearchOlderResult" = "Focus next result"; "AriaSearchNewerResult" = "Focus previous result"; "CreditsBoxHistoryEntryGiftOutAbout" = "With Stars, {user} will be able to unlock content and services on Telegram. {link}" diff --git a/src/bundles/extra.ts b/src/bundles/extra.ts index 1695dd434..64f8ed796 100644 --- a/src/bundles/extra.ts +++ b/src/bundles/extra.ts @@ -31,6 +31,7 @@ export { default as StarsBalanceModal } from '../components/modals/stars/StarsBa export { default as StarPaymentModal } from '../components/modals/stars/StarsPaymentModal'; export { default as AboutAdsModal } from '../components/common/AboutAdsModal'; +export { default as AboutMonetizationModal } from '../components/common/AboutMonetizationModal'; 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'; diff --git a/src/components/common/AboutAdsModal.module.scss b/src/components/common/AboutAdsModal.module.scss index a593ec6d8..88ba2f0be 100644 --- a/src/components/common/AboutAdsModal.module.scss +++ b/src/components/common/AboutAdsModal.module.scss @@ -1,3 +1,7 @@ +.root :global(.modal-dialog) { + width: 26.25rem; +} + .title, .description { text-align: center !important; text-wrap: pretty; @@ -8,26 +12,6 @@ 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; diff --git a/src/components/common/AboutAdsModal.tsx b/src/components/common/AboutAdsModal.tsx index d881d3963..5516a45a7 100644 --- a/src/components/common/AboutAdsModal.tsx +++ b/src/components/common/AboutAdsModal.tsx @@ -1,6 +1,8 @@ import type { FC } from '../../lib/teact/teact'; import React, { memo, useMemo } from '../../lib/teact/teact'; +import type { TableAboutData } from '../modals/common/TableAboutModal'; + import buildClassName from '../../util/buildClassName'; import renderText from './helpers/renderText'; @@ -8,27 +10,25 @@ import useSelectorSignal from '../../hooks/data/useSelectorSignal'; import useDerivedState from '../../hooks/useDerivedState'; import useOldLang from '../../hooks/useOldLang'; +import TableAboutModal from '../modals/common/TableAboutModal'; import Button from '../ui/Button'; -import ListItem from '../ui/ListItem'; import Modal from '../ui/Modal'; -import Separator from '../ui/Separator'; -import Icon from './icons/Icon'; import SafeLink from './SafeLink'; import styles from './AboutAdsModal.module.scss'; export type OwnProps = { isOpen: boolean; - isRevenueSharing?: boolean; + isMonetizationSharing?: boolean; onClose: NoneToVoidFunction; }; const AboutAdsModal: FC = ({ isOpen, - isRevenueSharing, + isMonetizationSharing, onClose, }) => { - const lang = useOldLang(); + const oldLang = useOldLang(); const minLevelSignal = useSelectorSignal((global) => global.appConfig?.channelRestrictAdsLevelMin); const minLevelToRestrictAds = useDerivedState(minLevelSignal); @@ -36,84 +36,89 @@ const AboutAdsModal: FC = ({ const regularAdContent = useMemo(() => { return ( <> -

{lang('SponsoredMessageInfoScreen.Title')}

-

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

-

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

-

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

+

{oldLang('SponsoredMessageInfoScreen.Title')}

+

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

+

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

+

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

-

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

+

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

); - }, [lang]); + }, [oldLang]); - const revenueSharingAdContent = useMemo(() => { - return ( + const modalData = useMemo(() => { + if (!isOpen) return undefined; + + const header = ( <> -
-

{lang('AboutRevenueSharingAds')}

+

{oldLang('AboutRevenueSharingAds')}

- {lang('RevenueSharingAdsAlertSubtitle')} + {oldLang('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'])}

+ + ); + + const listItemData = [ + ['lock', oldLang('RevenueSharingAdsInfo1Title'), + renderText(oldLang('RevenueSharingAdsInfo1Subtitle'), ['simple_markdown'])], + ['revenue-split', oldLang('RevenueSharingAdsInfo2Title'), + renderText(oldLang('RevenueSharingAdsInfo2Subtitle'), ['simple_markdown'])], + ['nochannel', oldLang('RevenueSharingAdsInfo3Title'), + renderText(oldLang('RevenueSharingAdsInfo3Subtitle', minLevelToRestrictAds), ['simple_markdown'])], + ] satisfies TableAboutData; + + const footer = ( + <> +

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

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

); - }, [lang, minLevelToRestrictAds]); + + return { + header, + listItemData, + footer, + }; + }, [isOpen, oldLang, minLevelToRestrictAds]); + + if (isMonetizationSharing && modalData) { + return ( + + ); + } return ( - {isRevenueSharing ? revenueSharingAdContent : regularAdContent} + {regularAdContent} ); diff --git a/src/components/common/AboutMonetizationModal.async.tsx b/src/components/common/AboutMonetizationModal.async.tsx new file mode 100644 index 000000000..bc48d1400 --- /dev/null +++ b/src/components/common/AboutMonetizationModal.async.tsx @@ -0,0 +1,18 @@ +import type { FC } from '../../lib/teact/teact'; +import React from '../../lib/teact/teact'; + +import type { OwnProps } from './AboutMonetizationModal'; + +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const AboutMonetizationModalAsync: FC = (props) => { + const { isOpen } = props; + const AboutMonetizationModal = useModuleLoader(Bundles.Extra, 'AboutMonetizationModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return AboutMonetizationModal ? : undefined; +}; + +export default AboutMonetizationModalAsync; diff --git a/src/components/common/AboutMonetizationModal.module.scss b/src/components/common/AboutMonetizationModal.module.scss new file mode 100644 index 000000000..01a6d958c --- /dev/null +++ b/src/components/common/AboutMonetizationModal.module.scss @@ -0,0 +1,10 @@ +.title, .description { + text-align: center !important; + text-wrap: pretty; + padding-inline: 1.5rem; +} + +.toncoin { + font-size: 1rem; + color: var(--color-primary); +} diff --git a/src/components/common/AboutMonetizationModal.tsx b/src/components/common/AboutMonetizationModal.tsx new file mode 100644 index 000000000..560fef02b --- /dev/null +++ b/src/components/common/AboutMonetizationModal.tsx @@ -0,0 +1,105 @@ +import type { FC } from '../../lib/teact/teact'; +import React, { memo, useMemo } from '../../lib/teact/teact'; + +import type { TableAboutData } from '../modals/common/TableAboutModal'; + +import renderText from './helpers/renderText'; + +import useLang from '../../hooks/useLang'; +import useOldLang from '../../hooks/useOldLang'; + +import TableAboutModal from '../modals/common/TableAboutModal'; +import Icon from './icons/Icon'; +import SafeLink from './SafeLink'; + +import styles from './AboutMonetizationModal.module.scss'; + +export type OwnProps = { + isOpen: boolean; + onClose: NoneToVoidFunction; +}; + +const AboutMonetizationModal: FC = ({ + isOpen, + onClose, +}) => { + const oldLang = useOldLang(); + const lang = useLang(); + + const blockchainText = useMemo(() => { + const linkText = oldLang('LearnMore'); + return lang( + 'ChannelEarnLearnCoinAbout', + { + link: ( + + {linkText} + + + ), + }, + { + withNodes: true, + }, + ); + }, [lang, oldLang]); + + const monetizationTitle = useMemo(() => { + return lang( + 'MonetizationInfoTONTitle', + undefined, + { + withNodes: true, + specialReplacement: { '💎': }, + }, + ); + }, [lang]); + + const modalData = useMemo(() => { + if (!isOpen) return undefined; + + const header = ( +

{oldLang('lng_channel_earn_learn_title')}

+ ); + + const listItemData = [ + ['channel', oldLang('lng_channel_earn_learn_in_subtitle'), + renderText(oldLang('lng_channel_earn_learn_in_about'), ['simple_markdown'])], + ['revenue-split', oldLang('lng_channel_earn_learn_split_subtitle'), + renderText(oldLang('Monetization.Intro.Split.Text'), ['simple_markdown'])], + ['cash-circle', oldLang('lng_channel_earn_learn_out_subtitle'), + renderText(oldLang('lng_channel_earn_learn_out_about'), ['simple_markdown'])], + ] satisfies TableAboutData; + + const footer = ( + <> +

{monetizationTitle}

+

{blockchainText}

+ + ); + + return { + header, + listItemData, + footer, + }; + }, [isOpen, oldLang, monetizationTitle, blockchainText]); + + if (!modalData) { + return undefined; + } + + return ( + + ); +}; + +export default memo(AboutMonetizationModal); diff --git a/src/components/middle/HeaderActions.tsx b/src/components/middle/HeaderActions.tsx index 31644355e..ed0cddbd3 100644 --- a/src/components/middle/HeaderActions.tsx +++ b/src/components/middle/HeaderActions.tsx @@ -66,6 +66,7 @@ interface StateProps { canCall?: boolean; canMute?: boolean; canViewStatistics?: boolean; + canViewMonetization?: boolean; canViewBoosts?: boolean; canShowBoostModal?: boolean; canLeave?: boolean; @@ -100,6 +101,7 @@ const HeaderActions: FC = ({ canCall, canMute, canViewStatistics, + canViewMonetization, canViewBoosts, canShowBoostModal, canLeave, @@ -433,6 +435,7 @@ const HeaderActions: FC = ({ canMute={canMute} canViewStatistics={canViewStatistics} canViewBoosts={canViewBoosts} + canViewMonetization={canViewMonetization} canShowBoostModal={canShowBoostModal} canLeave={canLeave} canEnterVoiceChat={canEnterVoiceChat} @@ -499,6 +502,7 @@ export default memo(withGlobal( const canCreateVoiceChat = ARE_CALLS_SUPPORTED && isMainThread && !chat.isCallActive && (chat.adminRights?.manageCall || (chat.isCreator && isChatBasicGroup(chat))); const canViewStatistics = isMainThread && chatFullInfo?.canViewStatistics; + const canViewMonetization = isMainThread && chatFullInfo?.canViewMonetization; const canViewBoosts = isMainThread && (isSuperGroup || isChannel) && (canViewStatistics || getHasAdminRight(chat, 'postStories')); const canShowBoostModal = !canViewBoosts && (isSuperGroup || isChannel); @@ -521,6 +525,7 @@ export default memo(withGlobal( canCall, canMute, canViewStatistics, + canViewMonetization, canViewBoosts, canShowBoostModal, canLeave, diff --git a/src/components/middle/HeaderMenuContainer.tsx b/src/components/middle/HeaderMenuContainer.tsx index 8618c95ce..77926edb6 100644 --- a/src/components/middle/HeaderMenuContainer.tsx +++ b/src/components/middle/HeaderMenuContainer.tsx @@ -84,6 +84,7 @@ export type OwnProps = { canMute?: boolean; canViewStatistics?: boolean; canViewBoosts?: boolean; + canViewMonetization?: boolean; canShowBoostModal?: boolean; withForumActions?: boolean; canLeave?: boolean; @@ -145,6 +146,7 @@ const HeaderMenuContainer: FC = ({ canCall, canMute, canViewStatistics, + canViewMonetization, canViewBoosts, pendingJoinRequests, canLeave, @@ -186,6 +188,7 @@ const HeaderMenuContainer: FC = ({ openAddContactDialog, requestMasterAndRequestCall, toggleStatistics, + openMonetizationStatistics, openBoostStatistics, openPremiumGiftModal, openThreadWithInfo, @@ -348,6 +351,12 @@ const HeaderMenuContainer: FC = ({ closeMenu(); }); + const handleMonetizationClick = useLastCallback(() => { + openMonetizationStatistics({ chatId }); + setShouldCloseFast(!isRightColumnShown); + closeMenu(); + }); + const handleBoostClick = useLastCallback(() => { if (canViewBoosts) { openBoostStatistics({ chatId }); @@ -618,6 +627,14 @@ const HeaderMenuContainer: FC = ({ {lang('Statistics')} )} + {isChannel && canViewMonetization && ( + + {lang('lng_channel_earn_title')} + + )} {canTranslate && ( = ({ onShowReactors, onToggleReaction, onCopyMessages, - onAboutAds, + onAboutAdsClick, onSponsoredHide, onSponsorInfo, onSponsoredReport, @@ -461,7 +461,7 @@ const MessageContextMenu: FC = ({ {lang('SponsoredMessageSponsor')} )} {isSponsoredMessage && ( - + {lang(message.canReport ? 'AboutRevenueSharingAds' : 'SponsoredMessageInfo')} )} diff --git a/src/components/middle/message/SponsoredMessage.tsx b/src/components/middle/message/SponsoredMessage.tsx index e65af78a8..cd63aedb5 100644 --- a/src/components/middle/message/SponsoredMessage.tsx +++ b/src/components/middle/message/SponsoredMessage.tsx @@ -188,7 +188,7 @@ const SponsoredMessage: FC = ({ isOpen={isContextMenuOpen} anchor={contextMenuPosition} message={message!} - onAboutAds={openAboutAdsModal} + onAboutAdsClick={openAboutAdsModal} onReportAd={handleReportSponsoredMessage} onClose={handleContextMenuClose} onCloseAnimationEnd={handleContextMenuHide} @@ -196,7 +196,7 @@ const SponsoredMessage: FC = ({ )} diff --git a/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx b/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx index 2e808c270..f2ab19255 100644 --- a/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx +++ b/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx @@ -17,7 +17,7 @@ export type OwnProps = { isOpen: boolean; message: ApiSponsoredMessage; anchor: IAnchorPosition; - onAboutAds: NoneToVoidFunction; + onAboutAdsClick: NoneToVoidFunction; onReportAd: NoneToVoidFunction; onClose: NoneToVoidFunction; onCloseAnimationEnd: NoneToVoidFunction; @@ -26,7 +26,7 @@ export type OwnProps = { const SponsoredMessageContextMenuContainer: FC = ({ message, anchor, - onAboutAds, + onAboutAdsClick, onReportAd, onClose, onCloseAnimationEnd, @@ -37,7 +37,7 @@ const SponsoredMessageContextMenuContainer: FC = ({ const { transitionClassNames } = useShowTransition(isMenuOpen, onCloseAnimationEnd, undefined, false); const handleAboutAdsOpen = useLastCallback(() => { - onAboutAds(); + onAboutAdsClick(); closeMenu(); }); @@ -73,7 +73,7 @@ const SponsoredMessageContextMenuContainer: FC = ({ message={message} onClose={closeMenu} onCloseAnimationEnd={closeMenu} - onAboutAds={handleAboutAdsOpen} + onAboutAdsClick={handleAboutAdsOpen} onSponsoredHide={handleSponsoredHide} onSponsorInfo={handleSponsorInfo} onSponsoredReport={handleReportSponsoredMessage} diff --git a/src/components/modals/common/TableAboutModal.module.scss b/src/components/modals/common/TableAboutModal.module.scss new file mode 100644 index 000000000..df6bbad6b --- /dev/null +++ b/src/components/modals/common/TableAboutModal.module.scss @@ -0,0 +1,39 @@ +.root :global(.modal-dialog) { + width: 26.25rem; +} + +.title, .description { + text-align: center !important; + text-wrap: pretty; + padding-inline: 1.5rem; +} + +.secondary { + color: var(--color-text-secondary); +} + +.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; +} + +.separator { + margin-block: 1rem; + width: 110%; +} diff --git a/src/components/modals/common/TableAboutModal.tsx b/src/components/modals/common/TableAboutModal.tsx new file mode 100644 index 000000000..165fb4382 --- /dev/null +++ b/src/components/modals/common/TableAboutModal.tsx @@ -0,0 +1,68 @@ +import React, { memo, type TeactNode } from '../../../lib/teact/teact'; + +import type { IconName } from '../../../types/icons'; + +import Icon from '../../common/icons/Icon'; +import Button from '../../ui/Button'; +import ListItem from '../../ui/ListItem'; +import Modal from '../../ui/Modal'; +import Separator from '../../ui/Separator'; + +import styles from './TableAboutModal.module.scss'; + +export type TableAboutData = [IconName | undefined, TeactNode, TeactNode][]; + +type OwnProps = { + isOpen?: boolean; + listItemData?: TableAboutData; + headerIconName: IconName; + header?: TeactNode; + footer?: TeactNode; + buttonText?: string; + onClose: NoneToVoidFunction; + onButtonClick?: NoneToVoidFunction; +}; + +const TableAboutModal = ({ + isOpen, + listItemData, + headerIconName, + header, + footer, + buttonText, + onClose, + onButtonClick, +}: OwnProps) => { + return ( + +
+ {header} +
+ {listItemData?.map(([icon, title, subtitle]) => { + return ( + + {title} + {subtitle} + + ); + })} +
+ + {footer} + {buttonText && ( + + )} +
+ ); +}; + +export default memo(TableAboutModal); diff --git a/src/components/right/RightColumn.tsx b/src/components/right/RightColumn.tsx index eb1b3cb93..da1ba39a8 100644 --- a/src/components/right/RightColumn.tsx +++ b/src/components/right/RightColumn.tsx @@ -35,6 +35,7 @@ import Profile from './Profile'; import RightHeader from './RightHeader'; import BoostStatistics from './statistics/BoostStatistics'; import MessageStatistics from './statistics/MessageStatistics.async'; +import MonetizationStatistics from './statistics/MonetizationStatistics'; import Statistics from './statistics/Statistics.async'; import StoryStatistics from './statistics/StoryStatistics.async'; import StickerSearch from './StickerSearch.async'; @@ -102,6 +103,7 @@ const RightColumn: FC = ({ closeEditTopicPanel, closeBoostStatistics, setShouldCloseRightColumn, + closeMonetizationStatistics, } = getActions(); const { width: windowWidth } = useWindowSize(); @@ -120,6 +122,7 @@ const RightColumn: FC = ({ const isMessageStatistics = contentKey === RightColumnContent.MessageStatistics; const isStoryStatistics = contentKey === RightColumnContent.StoryStatistics; const isBoostStatistics = contentKey === RightColumnContent.BoostStatistics; + const isMonetizationStatistics = contentKey === RightColumnContent.MonetizationStatistics; const isStickerSearch = contentKey === RightColumnContent.StickerSearch; const isGifSearch = contentKey === RightColumnContent.GifSearch; const isPollResults = contentKey === RightColumnContent.PollResults; @@ -197,6 +200,9 @@ const RightColumn: FC = ({ case RightColumnContent.BoostStatistics: closeBoostStatistics(); break; + case RightColumnContent.MonetizationStatistics: + closeMonetizationStatistics(); + break; case RightColumnContent.StickerSearch: blurSearchInput(); setStickerSearchQuery({ query: undefined }); @@ -329,6 +335,8 @@ const RightColumn: FC = ({ return ; case RightColumnContent.BoostStatistics: return ; + case RightColumnContent.MonetizationStatistics: + return ; case RightColumnContent.MessageStatistics: return ; case RightColumnContent.StoryStatistics: @@ -365,6 +373,7 @@ const RightColumn: FC = ({ isManagement={isManagement} isStatistics={isStatistics} isBoostStatistics={isBoostStatistics} + isMonetizationStatistics={isMonetizationStatistics} isMessageStatistics={isMessageStatistics} isStoryStatistics={isStoryStatistics} isStickerSearch={isStickerSearch} diff --git a/src/components/right/RightHeader.tsx b/src/components/right/RightHeader.tsx index abd7947a6..8489fc8fa 100644 --- a/src/components/right/RightHeader.tsx +++ b/src/components/right/RightHeader.tsx @@ -47,6 +47,7 @@ type OwnProps = { isStatistics?: boolean; isBoostStatistics?: boolean; isMessageStatistics?: boolean; + isMonetizationStatistics?: boolean; isStoryStatistics?: boolean; isStickerSearch?: boolean; isGifSearch?: boolean; @@ -91,6 +92,7 @@ enum HeaderContent { MessageStatistics, StoryStatistics, BoostStatistics, + MonetizationStatistics, Management, ManageInitial, ManageChannelSubscribers, @@ -130,6 +132,7 @@ const RightHeader: FC = ({ isStatistics, isMessageStatistics, isStoryStatistics, + isMonetizationStatistics, isBoostStatistics, isStickerSearch, isGifSearch, @@ -297,6 +300,8 @@ const RightHeader: FC = ({ HeaderContent.CreateTopic ) : isEditingTopic ? ( HeaderContent.EditTopic + ) : isMonetizationStatistics ? ( + HeaderContent.MonetizationStatistics ) : undefined; // When column is closed const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1; @@ -430,6 +435,8 @@ const RightHeader: FC = ({ return

{lang('Stats.StoryTitle')}

; case HeaderContent.BoostStatistics: return

{lang('Boosts')}

; + case HeaderContent.MonetizationStatistics: + return

{lang('lng_channel_earn_title')}

; case HeaderContent.SharedMedia: return

{lang('SharedMedia')}

; case HeaderContent.ManageChannelSubscribers: diff --git a/src/components/right/statistics/MonetizationStatistics.module.scss b/src/components/right/statistics/MonetizationStatistics.module.scss new file mode 100644 index 000000000..1b5dc866d --- /dev/null +++ b/src/components/right/statistics/MonetizationStatistics.module.scss @@ -0,0 +1,76 @@ +@use '../../../styles/mixins'; + +.root { + height: 100%; + overflow-x: hidden; + overflow-y: hidden; +} + +.graph { + margin-bottom: 1rem; + border-bottom: 0.0625rem solid var(--color-borders); + + opacity: 1; + transition: opacity 0.3s ease; + + &:last-of-type { + margin-bottom: 0; + border-bottom: none; + } + + &.hidden { + opacity: 0; + margin: 0; + } +} + +.ready { + overflow-y: scroll !important; +} + +.section { + display: flex; + flex-direction: column; + gap: 0.5rem; + padding: 1rem 0.75rem; + border-bottom: 0.0625rem solid var(--color-borders); +} + +.topText { + display: block; +} + +.availableReward { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 0.5rem; + line-height: 1.6875rem; +} + +.rewardValue { + font-size: 1.875rem; +} + +.decimalPart { + font-size: 1.375rem; +} + +.integer { + font-size: 1rem; +} + +.decimalUsdPart { + font-size: 0.6875rem; +} + +.toncoinIcon { + font-size: 1.5rem; + margin-inline: 0 0.5rem; + color: var(--color-primary); +} + +.textBottom { + font-size: 0.875rem; + color: var(--color-text-secondary); +} diff --git a/src/components/right/statistics/MonetizationStatistics.tsx b/src/components/right/statistics/MonetizationStatistics.tsx new file mode 100644 index 000000000..502c226b7 --- /dev/null +++ b/src/components/right/statistics/MonetizationStatistics.tsx @@ -0,0 +1,237 @@ +import React, { + memo, useEffect, useMemo, useRef, useState, +} from '../../../lib/teact/teact'; +import { getActions, withGlobal } from '../../../global'; + +import type { ApiChannelMonetizationStatistics, StatisticsGraph } from '../../../api/types'; + +import { FRAGMENT_ADS_URL } from '../../../config'; +import { selectChat, selectChatFullInfo, selectTabState } from '../../../global/selectors'; +import buildClassName from '../../../util/buildClassName'; + +import useFlag from '../../../hooks/useFlag'; +import useForceUpdate from '../../../hooks/useForceUpdate'; +import useLang from '../../../hooks/useLang'; +import useOldLang from '../../../hooks/useOldLang'; + +import AboutMonetizationModal from '../../common/AboutMonetizationModal.async'; +import Icon from '../../common/icons/Icon'; +import SafeLink from '../../common/SafeLink'; +import Button from '../../ui/Button'; +import Link from '../../ui/Link'; +import Loading from '../../ui/Loading'; +import StatisticsOverview from './StatisticsOverview'; + +import styles from './MonetizationStatistics.module.scss'; + +type ILovelyChart = { create: Function }; +let lovelyChartPromise: Promise; +let LovelyChart: ILovelyChart; + +async function ensureLovelyChart() { + if (!lovelyChartPromise) { + lovelyChartPromise = import('../../../lib/lovely-chart/LovelyChart') as Promise; + LovelyChart = await lovelyChartPromise; + } + + return lovelyChartPromise; +} + +const MONETIZATION_GRAPHS_TITLES = { + topHoursGraph: 'ChannelStats.Graph.ViewsByHours', + revenueGraph: 'lng_channel_earn_chart_revenue', +}; +const MONETIZATION_GRAPHS = Object.keys(MONETIZATION_GRAPHS_TITLES) as (keyof ApiChannelMonetizationStatistics)[]; + +type StateProps = { + chatId: string; + dcId?: number; + statistics?: ApiChannelMonetizationStatistics; + canCollect?: boolean; +}; + +const MonetizationStatistics = ({ + chatId, + dcId, + statistics, + canCollect, +}: StateProps) => { + const { loadChannelMonetizationStatistics } = getActions(); + const oldLang = useOldLang(); + const lang = useLang(); + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + const [isReady, setIsReady] = useState(false); + const loadedCharts = useRef([]); + const forceUpdate = useForceUpdate(); + const [isAboutMonetizationModalOpen, openAboutMonetizationModal, closeAboutMonetizationModal] = useFlag(false); + const hasAvailableBalance = Boolean(statistics?.balances?.availableBalance !== 0); + + useEffect(() => { + if (chatId) { + loadChannelMonetizationStatistics({ chatId }); + } + }, [chatId, loadChannelMonetizationStatistics]); + + useEffect(() => { + (async () => { + await ensureLovelyChart(); + + if (!isReady) { + setIsReady(true); + return; + } + + if (!statistics || !containerRef.current) { + return; + } + + MONETIZATION_GRAPHS.forEach((name, index: number) => { + const graph = statistics[name as keyof typeof statistics]; + const isAsync = typeof graph === 'string'; + + if (isAsync || loadedCharts.current.includes(name)) { + return; + } + + if (!graph) { + loadedCharts.current.push(name); + + return; + } + + LovelyChart.create(containerRef.current!.children[index], { + title: oldLang((MONETIZATION_GRAPHS_TITLES as Record)[name]), + ...graph as StatisticsGraph, + }); + + loadedCharts.current.push(name); + + containerRef.current!.children[index].classList.remove(styles.hidden); + }); + + forceUpdate(); + })(); + }, [isReady, statistics, oldLang, chatId, dcId, forceUpdate]); + + function renderAvailableReward() { + const availableBalance = statistics?.balances?.availableBalance; + const [integerTonPart, decimalTonPart] = availableBalance ? availableBalance.toFixed(4).split('.') : [0]; + const [integerUsdPart, decimalUsdPart] = availableBalance + && statistics?.usdRate ? (availableBalance * statistics.usdRate).toFixed(2).split('.') : [0]; + + return ( +
+
+ + + {integerTonPart}.{decimalTonPart} + +
+ {' '} + + ≈ ${integerUsdPart}.{decimalUsdPart} + +
+ ); + } + + const topText = useMemo(() => { + const linkText = oldLang('LearnMore'); + return lang( + 'ChannelEarnAbout', + { + link: ( + + {linkText} + + + ), + }, + { + withNodes: true, + }, + ); + }, [lang, oldLang]); + + const rewardsText = useMemo(() => { + const linkText = oldLang('LearnMore'); + return lang( + 'MonetizationBalanceZeroInfo', + { + link: ( + + {linkText} + + + ), + }, + { + withNodes: true, + }, + ); + }, [lang, oldLang]); + + if (!isReady || !statistics) { + return ; + } + + return ( +
+
{topText}
+ + + + {!loadedCharts.current.length && } + +
+ {MONETIZATION_GRAPHS.map((graph) => ( +
+ ))} +
+ + {hasAvailableBalance && ( +
+ {oldLang('lng_channel_earn_balance_title')} + + {renderAvailableReward()} + + + +
{rewardsText}
+
+ )} + + +
+ ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const tabState = selectTabState(global); + const monetizationStatistics = tabState.monetizationStatistics; + const chatId = monetizationStatistics && monetizationStatistics.chatId; + const chat = chatId ? selectChat(global, chatId) : undefined; + const canCollect = chat && chat.isCreator; + const dcId = selectChatFullInfo(global, chatId!)?.statisticsDcId; + const statistics = tabState.statistics.monetization; + + return { + chatId: chatId!, + dcId, + statistics, + canCollect, + }; + }, +)(MonetizationStatistics)); diff --git a/src/components/right/statistics/StatisticsOverview.module.scss b/src/components/right/statistics/StatisticsOverview.module.scss index 4c01f91fb..55076f55b 100644 --- a/src/components/right/statistics/StatisticsOverview.module.scss +++ b/src/components/right/statistics/StatisticsOverview.module.scss @@ -1,7 +1,7 @@ .root { padding: 1rem 0.75rem; margin-bottom: 1rem; - border-bottom: 1px solid var(--color-borders); + border-bottom: 0.0625rem solid var(--color-borders); } .header { @@ -13,10 +13,10 @@ } .title { - margin-right: 2em; - font-size: 16px; + margin-right: 2rem; + font-size: 1rem; color: var(--text-color); - line-height: 30px; + line-height: 1.875rem; text-transform: lowercase; &:first-letter { @@ -61,3 +61,16 @@ color: var(--color-error); } } + +.decimalPart { + font-size: 0.875rem; +} + +.decimalUsdPart { + font-size: 0.6875rem; +} + +.toncoin { + margin-inline: -0.125rem 0.3125rem; + color: var(--color-primary); +} diff --git a/src/components/right/statistics/StatisticsOverview.tsx b/src/components/right/statistics/StatisticsOverview.tsx index a64bd9a5d..72e4c9e06 100644 --- a/src/components/right/statistics/StatisticsOverview.tsx +++ b/src/components/right/statistics/StatisticsOverview.tsx @@ -2,7 +2,7 @@ import type { FC } from '../../../lib/teact/teact'; import React, { memo } from '../../../lib/teact/teact'; import type { - ApiBoostStatistics, + ApiBoostStatistics, ApiChannelMonetizationStatistics, ApiChannelStatistics, ApiGroupStatistics, ApiPostStatistics, StatisticsOverviewItem, } from '../../../api/types'; @@ -12,6 +12,8 @@ import { formatInteger, formatIntegerCompact } from '../../../util/textFormat'; import useOldLang from '../../../hooks/useOldLang'; +import Icon from '../../common/icons/Icon'; + import styles from './StatisticsOverview.module.scss'; type OverviewCell = { @@ -94,19 +96,26 @@ const BOOST_OVERVIEW: OverviewCell[][] = [ ], ]; -type StatisticsType = 'channel' | 'group' | 'message' | 'boost' | 'story'; +type StatisticsType = 'channel' | 'group' | 'message' | 'boost' | 'story' | 'monetization'; export type OwnProps = { type: StatisticsType; title?: string; className?: string; - statistics: ApiChannelStatistics | ApiGroupStatistics | ApiPostStatistics | ApiBoostStatistics; + isToncoin?: boolean; + statistics: + ApiChannelStatistics | + ApiGroupStatistics | + ApiPostStatistics | + ApiBoostStatistics | + ApiChannelMonetizationStatistics; }; const StatisticsOverview: FC = ({ title, type, statistics, + isToncoin, className, }) => { const lang = useOldLang(); @@ -131,7 +140,26 @@ const StatisticsOverview: FC = ({ ); }; + const renderBalanceCell = (balance: number, usdRate: number, text: string) => { + const [integerTonPart, decimalTonPart] = balance.toFixed(4).split('.'); + const [integerUsdPart, decimalUsdPart] = (balance * usdRate).toFixed(2).split('.'); + return ( +
+ + + {integerTonPart}.{decimalTonPart} + + {' '} + + ≈ ${integerUsdPart}.{decimalUsdPart} + +

{lang(text)}

+
+ ); + }; + const { period } = (statistics as ApiGroupStatistics); + const { balances, usdRate } = (statistics as ApiChannelMonetizationStatistics); const schema = getSchemaByType(type); @@ -152,7 +180,15 @@ const StatisticsOverview: FC = ({
- {schema.map((row) => ( + {isToncoin ? ( + + + + ) : schema.map((row) => ( {row.map((cell: OverviewCell) => { const field = (statistics as any)[cell.name]; diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx index 9ff2b3b9e..a630f6e3f 100644 --- a/src/components/ui/Button.tsx +++ b/src/components/ui/Button.tsx @@ -179,6 +179,8 @@ const Button: FC = ({ aria-controls={ariaControls} style={style} onTransitionEnd={onTransitionEnd} + target="_blank" + rel="noreferrer" > {children} {!isNotInteractive && ripple && ( diff --git a/src/config.ts b/src/config.ts index 495c39082..600db5662 100644 --- a/src/config.ts +++ b/src/config.ts @@ -319,6 +319,7 @@ export const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time'; export const FAQ_URL = 'https://telegram.org/faq'; export const PRIVACY_URL = 'https://telegram.org/privacy'; export const MINI_APP_TOS_URL = 'https://telegram.org/tos/mini-apps'; +export const FRAGMENT_ADS_URL = 'https://fragment.com/ads'; export const GENERAL_TOPIC_ID = 1; export const STORY_EXPIRE_PERIOD = 86400; // 1 day export const STORY_VIEWERS_EXPIRE_PERIOD = 86400; // 1 day diff --git a/src/global/actions/api/payments.ts b/src/global/actions/api/payments.ts index 7c52b4bda..bca39b66a 100644 --- a/src/global/actions/api/payments.ts +++ b/src/global/actions/api/payments.ts @@ -761,6 +761,20 @@ addActionHandler('openBoostStatistics', async (global, actions, payload): Promis setGlobal(global); }); +addActionHandler('openMonetizationStatistics', (global, actions, payload): ActionReturnType => { + const { chatId, tabId = getCurrentTabId() } = payload; + + const chat = selectChat(global, chatId); + if (!chat) return; + + global = updateTabState(global, { + monetizationStatistics: { + chatId, + }, + }, tabId); + setGlobal(global); +}); + addActionHandler('loadMoreBoosters', async (global, actions, payload): Promise => { const { isGifts, tabId = getCurrentTabId() } = payload || {}; let tabState = selectTabState(global, tabId); diff --git a/src/global/actions/api/statistics.ts b/src/global/actions/api/statistics.ts index 16db2a1b5..da836e7e7 100644 --- a/src/global/actions/api/statistics.ts +++ b/src/global/actions/api/statistics.ts @@ -6,6 +6,7 @@ import { addActionHandler, getGlobal, setGlobal } from '../../index'; import { addChats, addUsers, + updateChannelMonetizationStatistics, updateMessageStatistics, updateStatistics, updateStatisticsGraph, @@ -43,6 +44,28 @@ addActionHandler('loadStatistics', async (global, actions, payload): Promise => { + const { + chatId, tabId = getCurrentTabId(), + } = payload; + const chat = selectChat(global, chatId); + const fullInfo = selectChatFullInfo(global, chatId); + if (!chat || !fullInfo) { + return; + } + + const dcId = fullInfo.statisticsDcId; + const stats = await callApi('fetchChannelMonetizationStatistics', { chat, dcId }); + + if (!stats) { + return; + } + + global = getGlobal(); + global = updateChannelMonetizationStatistics(global, stats, tabId); + setGlobal(global); +}); + addActionHandler('loadMessageStatistics', async (global, actions, payload): Promise => { const { chatId, messageId, tabId = getCurrentTabId() } = payload; const chat = selectChat(global, chatId); diff --git a/src/global/actions/ui/stories.ts b/src/global/actions/ui/stories.ts index 6eb9d9931..aaa4c4282 100644 --- a/src/global/actions/ui/stories.ts +++ b/src/global/actions/ui/stories.ts @@ -430,3 +430,11 @@ addActionHandler('closeBoostStatistics', (global, actions, payload): ActionRetur boostStatistics: undefined, }, tabId); }); + +addActionHandler('closeMonetizationStatistics', (global, actions, payload): ActionReturnType => { + const { tabId = getCurrentTabId() } = payload || {}; + + return updateTabState(global, { + monetizationStatistics: undefined, + }, tabId); +}); diff --git a/src/global/reducers/statistics.ts b/src/global/reducers/statistics.ts index 284722786..7466ef276 100644 --- a/src/global/reducers/statistics.ts +++ b/src/global/reducers/statistics.ts @@ -1,4 +1,5 @@ import type { + ApiChannelMonetizationStatistics, ApiChannelStatistics, ApiGroupStatistics, ApiPostStatistics, StatisticsGraph, } from '../../api/types'; import type { GlobalState, TabArgs } from '../types'; @@ -65,3 +66,15 @@ export function updateStatisticsGraph( }, }, tabId); } + +export function updateChannelMonetizationStatistics( + global: T, statistics: ApiChannelMonetizationStatistics, + ...[tabId = getCurrentTabId()]: TabArgs +): T { + return updateTabState(global, { + statistics: { + ...selectTabState(global, tabId).statistics, + monetization: statistics, + }, + }, tabId); +} diff --git a/src/global/selectors/ui.ts b/src/global/selectors/ui.ts index 022acbfa9..da5c43219 100644 --- a/src/global/selectors/ui.ts +++ b/src/global/selectors/ui.ts @@ -47,6 +47,8 @@ export function selectRightColumnContentKey( RightColumnContent.Statistics ) : tabState.boostStatistics ? ( RightColumnContent.BoostStatistics + ) : tabState.monetizationStatistics ? ( + RightColumnContent.MonetizationStatistics ) : tabState.stickerSearch.query !== undefined ? ( RightColumnContent.StickerSearch ) : tabState.gifSearch.query !== undefined ? ( diff --git a/src/global/types.ts b/src/global/types.ts index fa51cf09b..882d11558 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -6,6 +6,7 @@ import type { ApiAvailableReaction, ApiBoost, ApiBoostsStatus, + ApiChannelMonetizationStatistics, ApiChannelStatistics, ApiChat, ApiChatAdminRights, @@ -603,6 +604,7 @@ export type TabState = { currentMessageId?: number; currentStory?: ApiPostStatistics; currentStoryId?: number; + monetization?: ApiChannelMonetizationStatistics; }; newContact?: { @@ -790,6 +792,10 @@ export type TabState = { }; }; + monetizationStatistics?: { + chatId: string; + }; + giftCodeModal?: { slug: string; message?: { @@ -1800,6 +1806,9 @@ export interface ActionPayloads { name: string; isPercentage?: boolean; } & WithTabId; + loadChannelMonetizationStatistics: { + chatId: string; + } & WithTabId; // ui dismissDialog: WithTabId | undefined; @@ -2533,6 +2542,11 @@ export interface ActionPayloads { chatId: string; } & WithTabId; + openMonetizationStatistics: { + chatId: string; + } & WithTabId; + closeMonetizationStatistics: WithTabId | undefined; + // Media Viewer & Audio Player openMediaViewer: { chatId?: string; diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js index a2f2cbe5d..8bcb08ea7 100644 --- a/src/lib/gramjs/tl/apiTl.js +++ b/src/lib/gramjs/tl/apiTl.js @@ -1665,6 +1665,7 @@ stats.getMessagePublicForwards#5f150144 channel:InputChannel msg_id:int offset:s stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats; stats.getStoryStats#374fef40 flags:# dark:flags.0?true peer:InputPeer id:int = stats.StoryStats; stats.getStoryPublicForwards#a6437ef6 peer:InputPeer id:int offset:string limit:int = stats.PublicForwards; +stats.getBroadcastRevenueStats#75dfb671 flags:# dark:flags.0?true channel:InputChannel = stats.BroadcastRevenueStats; chatlists.exportChatlistInvite#8472478e chatlist:InputChatlist title:string peers:Vector = chatlists.ExportedChatlistInvite; chatlists.deleteExportedInvite#719c5c5e chatlist:InputChatlist slug:string = Bool; chatlists.editExportedInvite#653db63d flags:# chatlist:InputChatlist slug:string title:flags.1?string peers:flags.2?Vector = ExportedChatlistInvite; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index da987f947..dc7766592 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -271,6 +271,7 @@ "help.getPeerColors", "help.getTimezonesList", "stats.getBroadcastStats", + "stats.getBroadcastRevenueStats", "stats.getMegagroupStats", "stats.getMessagePublicForwards", "stats.getMessageStats", diff --git a/src/lib/lovely-chart/Axes.js b/src/lib/lovely-chart/Axes.js index c0d354b41..07d4cdda0 100644 --- a/src/lib/lovely-chart/Axes.js +++ b/src/lib/lovely-chart/Axes.js @@ -1,5 +1,5 @@ import { GUTTER, AXES_FONT, X_AXIS_HEIGHT, X_AXIS_SHIFT_START, PLOT_TOP_PADDING } from './constants'; -import { humanize } from './format'; +import { formatCryptoValue, humanize } from './format'; import { getCssColor } from './skin'; import { applyXEdgeOpacity, applyYEdgeOpacity, xScaleLevelToStep, yScaleLevelToStep } from './formulas'; import { toPixels } from './Projection'; @@ -47,6 +47,8 @@ export function createAxes(context, data, plotSize, colors) { if (data.isPercentage) { _drawYAxisPercents(projection); + } else if (data.isCurrency) { + _drawYAxisCurrency(projection, data); } else { _drawYAxisScaled( state, @@ -169,5 +171,49 @@ export function createAxes(context, data, plotSize, colors) { context.stroke(); } + function _drawYAxisCurrency(projection, data) { + const formatValue = data.datasets[0].values.map(value => formatCryptoValue(value)); + + const total = formatValue.reduce((sum, value) => sum + value, 0); + const avg1 = total / formatValue.length; + const avg2 = total / (formatValue.length / 2); + const avg3 = total / (formatValue.length / 3); + + const averageRate1 = avg1 * data.currencyRate; + const averageRate2 = avg2 * data.currencyRate; + const averageRate3 = avg3 * data.currencyRate; + + const totalAvg = [0, avg1, avg2, avg3]; + const totalRate = [0, averageRate1, averageRate2, averageRate3]; + + const [, height] = projection.getSize(); + + context.font = AXES_FONT; + context.textAlign = 'left'; + context.textBaseline = 'bottom'; + context.lineWidth = 1; + + context.beginPath(); + + totalAvg.forEach((value, index) => { + const yPx = height - height * (value / Math.max(...formatValue)) + PLOT_TOP_PADDING; + + context.fillStyle = getCssColor(colors, 'y-axis-text', 1); + + context.fillText(`${value.toFixed(2)} TON`, GUTTER, yPx - GUTTER / 4); + + context.textAlign = 'right'; + context.fillText(`$${totalRate[index].toFixed(2)}`, plotSize.width - GUTTER, yPx - GUTTER / 4); + + context.textAlign = 'left'; + + context.moveTo(GUTTER, yPx); + context.strokeStyle = getCssColor(colors, 'grid-lines', 1); + context.lineTo(plotSize.width - GUTTER, yPx); + }); + + context.stroke(); + } + return { drawXAxis, drawYAxis }; } diff --git a/src/lib/lovely-chart/Tooltip.js b/src/lib/lovely-chart/Tooltip.js index 5cc774daf..55886b0d5 100644 --- a/src/lib/lovely-chart/Tooltip.js +++ b/src/lib/lovely-chart/Tooltip.js @@ -1,7 +1,7 @@ import { setupCanvas, clearCanvas } from './canvas'; import { BALLOON_OFFSET, X_AXIS_HEIGHT } from './constants'; import { getPieRadius } from './formulas'; -import { formatInteger, getLabelDate, getLabelTime, statsFormatDayHourFull } from './format'; +import {formatCryptoValue, formatInteger, getLabelDate, getLabelTime, statsFormatDayHourFull} from './format'; import { getCssColor } from './skin'; import { throttle, throttleWithRaf } from './utils'; import { addEventListener, createElement } from './minifiers'; @@ -353,7 +353,12 @@ export function createTooltip(container, data, plotSize, colors, onZoom, onFocus currentDataSet.setAttribute('data-present', 'true'); const valueElement = currentDataSet.querySelector(`.lovely-chart--tooltip-dataset-value.lovely-chart--color-${data.colors[key].slice(1)}:not(.lovely-chart--state-hidden)`); - valueElement.innerHTML = formatInteger(value); + + if (data.isCurrency) { + valueElement.innerHTML = formatCryptoValue(value); + } else { + valueElement.innerHTML = formatInteger(value); + } _renderPercentageValue(currentDataSet, value, totalValue); } @@ -413,6 +418,10 @@ export function createTooltip(container, data, plotSize, colors, onZoom, onFocus _renderTotal(dataSetContainer, formatInteger(totalValue)); } + if (data.isCurrency) { + _renderCurrencyRate(dataSetContainer, formatCryptoValue(totalValue)); + } + Array.from(dataSetContainer.querySelectorAll('[data-present="false"]')) .forEach((dataSet) => { dataSet.remove(); @@ -442,6 +451,28 @@ export function createTooltip(container, data, plotSize, colors, onZoom, onFocus } } + function _renderCurrencyRate(dataSetContainer, totalValue) { + const totalText = dataSetContainer.querySelector(`[data-total="true"]`); + const className = `lovely-chart--tooltip-dataset-value lovely-chart--position-right`; + + const totalUsd = (parseFloat(totalValue) * data.currencyRate).toFixed(2); + + if (!totalText) { + const newTotalText = createElement(); + newTotalText.className = 'lovely-chart--tooltip-dataset'; + newTotalText.setAttribute('data-present', 'true'); + newTotalText.setAttribute('data-total', 'true'); + newTotalText.innerHTML = `USD ≈$${totalUsd}`; + dataSetContainer.appendChild(newTotalText); + } else { + totalText.setAttribute('data-present', 'true'); + + const valueElement = totalText.querySelector(`.lovely-chart--tooltip-dataset-value:not(.lovely-chart--state-hidden)`); + valueElement.innerHTML = `$${totalUsd}`; + } + } + + function _hideBalloon() { _balloon.classList.remove('lovely-chart--state-shown'); } diff --git a/src/lib/lovely-chart/data.js b/src/lib/lovely-chart/data.js index 2e07a4c40..d61dc9ea2 100644 --- a/src/lib/lovely-chart/data.js +++ b/src/lib/lovely-chart/data.js @@ -1,8 +1,8 @@ import { getMaxMin } from './utils'; -import { statsFormatHour, statsFormatDay, statsFormatDayHour, statsFormatText, statsFormatMin } from './format'; +import { statsFormatDay, statsFormatDayHour, statsFormatText, statsFormatMin } from './format'; export function analyzeData(data) { - const { title, labelFormatter, tooltipFormatter, isStacked, isPercentage, hasSecondYAxis, onZoom, minimapRange, hideCaption, zoomOutLabel } = data; + const { title, labelFormatter, tooltipFormatter, isStacked, isPercentage, isCurrency, currencyRate, hasSecondYAxis, onZoom, minimapRange, hideCaption, zoomOutLabel } = data; const { datasets, labels } = prepareDatasets(data); const colors = {}; @@ -20,8 +20,13 @@ export function analyzeData(data) { } }); + let effectiveLabelFormatter = labelFormatter; + if (isCurrency) { + effectiveLabelFormatter = 'statsFormat(\'day\')'; + } + let xLabels; - switch (labelFormatter) { + switch (effectiveLabelFormatter) { case 'statsFormatDayHour': xLabels = statsFormatDayHour(labels); break; @@ -45,6 +50,8 @@ export function analyzeData(data) { datasets, isStacked, isPercentage, + isCurrency, + currencyRate, hasSecondYAxis, onZoom, isLines: data.type === 'line', diff --git a/src/lib/lovely-chart/format.js b/src/lib/lovely-chart/format.js index e74a4d099..d0b9611a5 100644 --- a/src/lib/lovely-chart/format.js +++ b/src/lib/lovely-chart/format.js @@ -62,6 +62,10 @@ export function formatInteger(n) { return String(n).replace(/\d(?=(\d{3})+$)/g, '$& '); } +export function formatCryptoValue(n) { + return Number(n / 10 ** 9); +} + export function getFullLabelDate(label, { isShort = false } = {}) { return getLabelDate(label, { isShort, displayWeekDay: true }); } diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 43154a8b3..2db14044e 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -67,208 +67,210 @@ $icons-map: ( "camera": "\f124", "car": "\f125", "card": "\f126", - "channel-filled": "\f127", - "channel": "\f128", - "channelviews": "\f129", - "chat-badge": "\f12a", - "chats-badge": "\f12b", - "check": "\f12c", - "clock": "\f12d", - "close-circle": "\f12e", - "close-topic": "\f12f", - "close": "\f130", - "cloud-download": "\f131", - "collapse": "\f132", - "colorize": "\f133", - "comments-sticker": "\f134", - "comments": "\f135", - "copy-media": "\f136", - "copy": "\f137", - "darkmode": "\f138", - "data": "\f139", - "delete-filled": "\f13a", - "delete-left": "\f13b", - "delete-user": "\f13c", - "delete": "\f13d", - "document": "\f13e", - "double-badge": "\f13f", - "down": "\f140", - "download": "\f141", - "eats": "\f142", - "edit": "\f143", - "email": "\f144", - "enter": "\f145", - "expand": "\f146", - "eye-closed-outline": "\f147", - "eye-closed": "\f148", - "eye-outline": "\f149", - "eye": "\f14a", - "favorite-filled": "\f14b", - "favorite": "\f14c", - "file-badge": "\f14d", - "flag": "\f14e", - "folder-badge": "\f14f", - "folder": "\f150", - "fontsize": "\f151", - "forums": "\f152", - "forward": "\f153", - "fullscreen": "\f154", - "gifs": "\f155", - "gift": "\f156", - "group-filled": "\f157", - "group": "\f158", - "grouped-disable": "\f159", - "grouped": "\f15a", - "hand-stop": "\f15b", - "hashtag": "\f15c", - "heart-outline": "\f15d", - "heart": "\f15e", - "help": "\f15f", - "info-filled": "\f160", - "info": "\f161", - "install": "\f162", - "italic": "\f163", - "key": "\f164", - "keyboard": "\f165", - "lamp": "\f166", - "language": "\f167", - "large-pause": "\f168", - "large-play": "\f169", - "link-badge": "\f16a", - "link-broken": "\f16b", - "link": "\f16c", - "location": "\f16d", - "lock-badge": "\f16e", - "lock": "\f16f", - "logout": "\f170", - "loop": "\f171", - "mention": "\f172", - "message-failed": "\f173", - "message-pending": "\f174", - "message-read": "\f175", - "message-succeeded": "\f176", - "message": "\f177", - "microphone-alt": "\f178", - "microphone": "\f179", - "monospace": "\f17a", - "more-circle": "\f17b", - "more": "\f17c", - "move-caption-down": "\f17d", - "move-caption-up": "\f17e", - "mute": "\f17f", - "muted": "\f180", - "my-notes": "\f181", - "new-chat-filled": "\f182", - "next": "\f183", - "nochannel": "\f184", - "noise-suppression": "\f185", - "non-contacts": "\f186", - "one-filled": "\f187", - "open-in-new-tab": "\f188", - "password-off": "\f189", - "pause": "\f18a", - "permissions": "\f18b", - "phone-discard-outline": "\f18c", - "phone-discard": "\f18d", - "phone": "\f18e", - "photo": "\f18f", - "pin-badge": "\f190", - "pin-list": "\f191", - "pin": "\f192", - "pinned-chat": "\f193", - "pinned-message": "\f194", - "pip": "\f195", - "play-story": "\f196", - "play": "\f197", - "poll": "\f198", - "previous": "\f199", - "privacy-policy": "\f19a", - "quote-text": "\f19b", - "quote": "\f19c", - "readchats": "\f19d", - "recent": "\f19e", - "reload": "\f19f", - "remove-quote": "\f1a0", - "remove": "\f1a1", - "reopen-topic": "\f1a2", - "replace": "\f1a3", - "replies": "\f1a4", - "reply-filled": "\f1a5", - "reply": "\f1a6", - "revenue-split": "\f1a7", - "revote": "\f1a8", - "save-story": "\f1a9", - "saved-messages": "\f1aa", - "schedule": "\f1ab", - "search": "\f1ac", - "select": "\f1ad", - "send-outline": "\f1ae", - "send": "\f1af", - "settings-filled": "\f1b0", - "settings": "\f1b1", - "share-filled": "\f1b2", - "share-screen-outlined": "\f1b3", - "share-screen-stop": "\f1b4", - "share-screen": "\f1b5", - "show-message": "\f1b6", - "sidebar": "\f1b7", - "skip-next": "\f1b8", - "skip-previous": "\f1b9", - "smallscreen": "\f1ba", - "smile": "\f1bb", - "sort": "\f1bc", - "speaker-muted-story": "\f1bd", - "speaker-outline": "\f1be", - "speaker-story": "\f1bf", - "speaker": "\f1c0", - "spoiler-disable": "\f1c1", - "spoiler": "\f1c2", - "sport": "\f1c3", - "star": "\f1c4", - "stars-lock": "\f1c5", - "stats": "\f1c6", - "stealth-future": "\f1c7", - "stealth-past": "\f1c8", - "stickers": "\f1c9", - "stop-raising-hand": "\f1ca", - "stop": "\f1cb", - "story-caption": "\f1cc", - "story-expired": "\f1cd", - "story-priority": "\f1ce", - "story-reply": "\f1cf", - "strikethrough": "\f1d0", - "tag-add": "\f1d1", - "tag-crossed": "\f1d2", - "tag-filter": "\f1d3", - "tag-name": "\f1d4", - "tag": "\f1d5", - "timer": "\f1d6", - "transcribe": "\f1d7", - "truck": "\f1d8", - "unarchive": "\f1d9", - "underlined": "\f1da", - "unlock-badge": "\f1db", - "unlock": "\f1dc", - "unmute": "\f1dd", - "unpin": "\f1de", - "unread": "\f1df", - "up": "\f1e0", - "user-filled": "\f1e1", - "user-online": "\f1e2", - "user": "\f1e3", - "video-outlined": "\f1e4", - "video-stop": "\f1e5", - "video": "\f1e6", - "view-once": "\f1e7", - "voice-chat": "\f1e8", - "volume-1": "\f1e9", - "volume-2": "\f1ea", - "volume-3": "\f1eb", - "web": "\f1ec", - "webapp": "\f1ed", - "word-wrap": "\f1ee", - "zoom-in": "\f1ef", - "zoom-out": "\f1f0", + "cash-circle": "\f127", + "channel-filled": "\f128", + "channel": "\f129", + "channelviews": "\f12a", + "chat-badge": "\f12b", + "chats-badge": "\f12c", + "check": "\f12d", + "clock": "\f12e", + "close-circle": "\f12f", + "close-topic": "\f130", + "close": "\f131", + "cloud-download": "\f132", + "collapse": "\f133", + "colorize": "\f134", + "comments-sticker": "\f135", + "comments": "\f136", + "copy-media": "\f137", + "copy": "\f138", + "darkmode": "\f139", + "data": "\f13a", + "delete-filled": "\f13b", + "delete-left": "\f13c", + "delete-user": "\f13d", + "delete": "\f13e", + "document": "\f13f", + "double-badge": "\f140", + "down": "\f141", + "download": "\f142", + "eats": "\f143", + "edit": "\f144", + "email": "\f145", + "enter": "\f146", + "expand": "\f147", + "eye-closed-outline": "\f148", + "eye-closed": "\f149", + "eye-outline": "\f14a", + "eye": "\f14b", + "favorite-filled": "\f14c", + "favorite": "\f14d", + "file-badge": "\f14e", + "flag": "\f14f", + "folder-badge": "\f150", + "folder": "\f151", + "fontsize": "\f152", + "forums": "\f153", + "forward": "\f154", + "fullscreen": "\f155", + "gifs": "\f156", + "gift": "\f157", + "group-filled": "\f158", + "group": "\f159", + "grouped-disable": "\f15a", + "grouped": "\f15b", + "hand-stop": "\f15c", + "hashtag": "\f15d", + "heart-outline": "\f15e", + "heart": "\f15f", + "help": "\f160", + "info-filled": "\f161", + "info": "\f162", + "install": "\f163", + "italic": "\f164", + "key": "\f165", + "keyboard": "\f166", + "lamp": "\f167", + "language": "\f168", + "large-pause": "\f169", + "large-play": "\f16a", + "link-badge": "\f16b", + "link-broken": "\f16c", + "link": "\f16d", + "location": "\f16e", + "lock-badge": "\f16f", + "lock": "\f170", + "logout": "\f171", + "loop": "\f172", + "mention": "\f173", + "message-failed": "\f174", + "message-pending": "\f175", + "message-read": "\f176", + "message-succeeded": "\f177", + "message": "\f178", + "microphone-alt": "\f179", + "microphone": "\f17a", + "monospace": "\f17b", + "more-circle": "\f17c", + "more": "\f17d", + "move-caption-down": "\f17e", + "move-caption-up": "\f17f", + "mute": "\f180", + "muted": "\f181", + "my-notes": "\f182", + "new-chat-filled": "\f183", + "next": "\f184", + "nochannel": "\f185", + "noise-suppression": "\f186", + "non-contacts": "\f187", + "one-filled": "\f188", + "open-in-new-tab": "\f189", + "password-off": "\f18a", + "pause": "\f18b", + "permissions": "\f18c", + "phone-discard-outline": "\f18d", + "phone-discard": "\f18e", + "phone": "\f18f", + "photo": "\f190", + "pin-badge": "\f191", + "pin-list": "\f192", + "pin": "\f193", + "pinned-chat": "\f194", + "pinned-message": "\f195", + "pip": "\f196", + "play-story": "\f197", + "play": "\f198", + "poll": "\f199", + "previous": "\f19a", + "privacy-policy": "\f19b", + "quote-text": "\f19c", + "quote": "\f19d", + "readchats": "\f19e", + "recent": "\f19f", + "reload": "\f1a0", + "remove-quote": "\f1a1", + "remove": "\f1a2", + "reopen-topic": "\f1a3", + "replace": "\f1a4", + "replies": "\f1a5", + "reply-filled": "\f1a6", + "reply": "\f1a7", + "revenue-split": "\f1a8", + "revote": "\f1a9", + "save-story": "\f1aa", + "saved-messages": "\f1ab", + "schedule": "\f1ac", + "search": "\f1ad", + "select": "\f1ae", + "send-outline": "\f1af", + "send": "\f1b0", + "settings-filled": "\f1b1", + "settings": "\f1b2", + "share-filled": "\f1b3", + "share-screen-outlined": "\f1b4", + "share-screen-stop": "\f1b5", + "share-screen": "\f1b6", + "show-message": "\f1b7", + "sidebar": "\f1b8", + "skip-next": "\f1b9", + "skip-previous": "\f1ba", + "smallscreen": "\f1bb", + "smile": "\f1bc", + "sort": "\f1bd", + "speaker-muted-story": "\f1be", + "speaker-outline": "\f1bf", + "speaker-story": "\f1c0", + "speaker": "\f1c1", + "spoiler-disable": "\f1c2", + "spoiler": "\f1c3", + "sport": "\f1c4", + "star": "\f1c5", + "stars-lock": "\f1c6", + "stats": "\f1c7", + "stealth-future": "\f1c8", + "stealth-past": "\f1c9", + "stickers": "\f1ca", + "stop-raising-hand": "\f1cb", + "stop": "\f1cc", + "story-caption": "\f1cd", + "story-expired": "\f1ce", + "story-priority": "\f1cf", + "story-reply": "\f1d0", + "strikethrough": "\f1d1", + "tag-add": "\f1d2", + "tag-crossed": "\f1d3", + "tag-filter": "\f1d4", + "tag-name": "\f1d5", + "tag": "\f1d6", + "timer": "\f1d7", + "toncoin": "\f1d8", + "transcribe": "\f1d9", + "truck": "\f1da", + "unarchive": "\f1db", + "underlined": "\f1dc", + "unlock-badge": "\f1dd", + "unlock": "\f1de", + "unmute": "\f1df", + "unpin": "\f1e0", + "unread": "\f1e1", + "up": "\f1e2", + "user-filled": "\f1e3", + "user-online": "\f1e4", + "user": "\f1e5", + "video-outlined": "\f1e6", + "video-stop": "\f1e7", + "video": "\f1e8", + "view-once": "\f1e9", + "voice-chat": "\f1ea", + "volume-1": "\f1eb", + "volume-2": "\f1ec", + "volume-3": "\f1ed", + "web": "\f1ee", + "webapp": "\f1ef", + "word-wrap": "\f1f0", + "zoom-in": "\f1f1", + "zoom-out": "\f1f2", ); .icon-active-sessions::before { @@ -385,6 +387,9 @@ $icons-map: ( .icon-card::before { content: map.get($icons-map, "card"); } +.icon-cash-circle::before { + content: map.get($icons-map, "cash-circle"); +} .icon-channel-filled::before { content: map.get($icons-map, "channel-filled"); } @@ -913,6 +918,9 @@ $icons-map: ( .icon-timer::before { content: map.get($icons-map, "timer"); } +.icon-toncoin::before { + content: map.get($icons-map, "toncoin"); +} .icon-transcribe::before { content: map.get($icons-map, "transcribe"); } diff --git a/src/styles/icons.woff b/src/styles/icons.woff index 2c8012b8a8a008c55a85431ce013faa74c5a187c..0dde4c5c1cfa676769861ea7412666acc1ac2ca3 100644 GIT binary patch delta 30117 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 YhE;=On*Jb3m4uzn+S~gd_k0Bs07V-SnE(I) delta 29924 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 diff --git a/src/styles/icons.woff2 b/src/styles/icons.woff2 index 5dc09ac3e98bac9e14e3d6d734f01146ee1ef14e..fdd2a37cb3ef525fab5c4e218ee613c38a4ae1eb 100644 GIT binary patch literal 25692 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 literal 25576 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 T9)ueVdN88EC~sW<{rC8Pk;KeK diff --git a/src/types/icons/font.ts b/src/types/icons/font.ts index 59077e6ec..dec68b118 100644 --- a/src/types/icons/font.ts +++ b/src/types/icons/font.ts @@ -37,6 +37,7 @@ export type FontIconName = | 'camera' | 'car' | 'card' + | 'cash-circle' | 'channel-filled' | 'channel' | 'channelviews' @@ -213,6 +214,7 @@ export type FontIconName = | 'tag-name' | 'tag' | 'timer' + | 'toncoin' | 'transcribe' | 'truck' | 'unarchive' diff --git a/src/types/index.ts b/src/types/index.ts index 663af499c..457c6f018 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -311,6 +311,7 @@ export enum RightColumnContent { AddingMembers, CreateTopic, EditTopic, + MonetizationStatistics, } export type MediaViewerMedia = ApiPhoto | ApiVideo | ApiDocument; diff --git a/src/types/language.d.ts b/src/types/language.d.ts index f59624cf5..8d666e12e 100644 --- a/src/types/language.d.ts +++ b/src/types/language.d.ts @@ -1512,6 +1512,16 @@ export interface LangPair { 'MenuInstallApp': undefined; 'RemoveEffect': undefined; 'ReplyInPrivateMessage': undefined; + 'MonetizationInfoTONTitle': undefined; + 'ChannelEarnLearnCoinAbout': { + 'link': string | number; + }; + 'MonetizationBalanceZeroInfo': { + 'link': string | number; + }; + 'ChannelEarnAbout': { + 'link': string | number; + }; 'AriaSearchOlderResult': undefined; 'AriaSearchNewerResult': undefined; 'CreditsBoxHistoryEntryGiftOutAbout': {
+ {renderBalanceCell(balances?.availableBalance || 0, usdRate || 0, 'lng_channel_earn_available')} + {renderBalanceCell(balances?.currentBalance || 0, usdRate || 0, 'lng_channel_earn_reward')} + {renderBalanceCell(balances?.overallRevenue || 0, usdRate || 0, 'lng_channel_earn_total')} +