From b254b08b2cdb74ebce10d2ed1245c94934b5e703 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Tue, 10 Oct 2023 13:35:19 +0200 Subject: [PATCH] Introduce Boosts (#3909) --- src/api/gramjs/apiBuilders/statistics.ts | 2 +- src/api/gramjs/apiBuilders/stories.ts | 59 ++- src/api/gramjs/methods/stories.ts | 68 +++ src/api/types/stories.ts | 31 ++ src/assets/font-icons/boost.svg | 1 + src/assets/font-icons/boostcircle.svg | 1 + src/bundles/extra.ts | 1 + src/components/common/Picker.tsx | 4 +- src/components/common/PickerSelectedItem.scss | 4 + src/components/common/PickerSelectedItem.tsx | 15 +- .../common/PremiumProgress.module.scss | 123 ++++++ src/components/common/PremiumProgress.tsx | 79 ++++ src/components/common/helpers/boostInfo.ts | 24 ++ src/components/left/main/LeftMainHeader.tsx | 2 +- src/components/left/search/ChatResults.tsx | 2 +- .../folders/SettingsFoldersChatsPicker.tsx | 2 +- src/components/main/Main.tsx | 6 + .../middle/message/helpers/webpageType.ts | 4 +- .../modals/boost/BoostModal.async.tsx | 18 + .../modals/boost/BoostModal.module.scss | 69 +++ src/components/modals/boost/BoostModal.tsx | 311 ++++++++++++++ src/components/ui/Button.scss | 3 +- src/components/ui/ConfirmDialog.tsx | 4 +- src/components/ui/Loading.tsx | 7 +- src/global/actions/api/chats.ts | 70 ++- src/global/actions/api/stories.ts | 92 +++- src/global/actions/ui/stories.ts | 8 + src/global/helpers/chats.ts | 4 + src/global/types.ts | 20 + src/lib/gramjs/tl/api.d.ts | 20 +- src/lib/gramjs/tl/apiTl.js | 11 +- src/lib/gramjs/tl/static/api.json | 6 +- src/styles/_variables.scss | 2 + src/styles/icons.scss | 400 +++++++++--------- src/styles/icons.woff | Bin 27392 -> 27528 bytes src/styles/icons.woff2 | Bin 22976 -> 23048 bytes src/types/icons/font.ts | 2 + src/util/dateFormat.ts | 25 ++ src/util/deeplink.ts | 21 +- 39 files changed, 1289 insertions(+), 232 deletions(-) create mode 100644 src/assets/font-icons/boost.svg create mode 100644 src/assets/font-icons/boostcircle.svg create mode 100644 src/components/common/PremiumProgress.module.scss create mode 100644 src/components/common/PremiumProgress.tsx create mode 100644 src/components/common/helpers/boostInfo.ts create mode 100644 src/components/modals/boost/BoostModal.async.tsx create mode 100644 src/components/modals/boost/BoostModal.module.scss create mode 100644 src/components/modals/boost/BoostModal.tsx diff --git a/src/api/gramjs/apiBuilders/statistics.ts b/src/api/gramjs/apiBuilders/statistics.ts index e80c59a94..cccbae6a9 100644 --- a/src/api/gramjs/apiBuilders/statistics.ts +++ b/src/api/gramjs/apiBuilders/statistics.ts @@ -161,7 +161,7 @@ function buildStatisticsOverview({ current, previous }: GramJs.StatsAbsValueAndP }; } -function buildStatisticsPercentage(data: GramJs.StatsPercentValue): StatisticsOverviewPercentage { +export function buildStatisticsPercentage(data: GramJs.StatsPercentValue): StatisticsOverviewPercentage { return { percentage: ((data.part / data.total) * 100).toFixed(2), }; diff --git a/src/api/gramjs/apiBuilders/stories.ts b/src/api/gramjs/apiBuilders/stories.ts index 1f264c501..157bc2f82 100644 --- a/src/api/gramjs/apiBuilders/stories.ts +++ b/src/api/gramjs/apiBuilders/stories.ts @@ -1,14 +1,18 @@ -import { Api as GramJs } from '../../../lib/gramjs'; +import { Api as GramJs, errors } from '../../../lib/gramjs'; import type { + ApiApplyBoostInfo, + ApiBoostsStatus, ApiMediaArea, ApiMediaAreaCoordinates, ApiMessage, ApiStealthMode, ApiStoryView, ApiTypeStory, } from '../../types'; import { buildCollectionByCallback } from '../../../util/iteratees'; +import { getServerTime } from '../../../util/serverTime'; import { buildPrivacyRules } from './common'; import { buildGeoPoint, buildMessageMediaContent, buildMessageTextContent } from './messageContent'; import { buildApiPeerId, getApiChatIdFromMtpPeer } from './peers'; import { buildApiReaction, buildReactionCount } from './reactions'; +import { buildStatisticsPercentage } from './statistics'; export function buildApiStory(peerId: string, story: GramJs.TypeStoryItem): ApiTypeStory { if (story instanceof GramJs.StoryItemDeleted) { @@ -161,3 +165,56 @@ export function buildApiPeerStories(peerStories: GramJs.PeerStories) { return buildCollectionByCallback(peerStories.stories, (story) => [story.id, buildApiStory(peerId, story)]); } + +export function buildApiApplyBoostInfo( + applyBoostInfo: GramJs.stories.TypeCanApplyBoostResult, +): ApiApplyBoostInfo | undefined { + if (applyBoostInfo instanceof GramJs.stories.CanApplyBoostOk) { + return { type: 'ok' }; + } + + if (applyBoostInfo instanceof GramJs.stories.CanApplyBoostReplace) { + return { + type: 'replace', + boostedChatId: getApiChatIdFromMtpPeer(applyBoostInfo.currentBoost), + }; + } + + return undefined; +} + +export function buildApiApplyBoostInfoFromError( + error: unknown, +): ApiApplyBoostInfo | undefined { + if (error instanceof errors.FloodWaitError) { + return { + type: 'wait', + waitUntil: getServerTime() + error.seconds, + }; + } + + if (error instanceof Error) { + if (error.message === 'BOOST_NOT_MODIFIED') { + return { + type: 'already', + }; + } + } + + return undefined; +} + +export function buildApiBoostsStatus(boostStatus: GramJs.stories.BoostsStatus): ApiBoostsStatus { + const { + level, boostUrl, boosts, myBoost, currentLevelBoosts, nextLevelBoosts, premiumAudience, + } = boostStatus; + return { + level, + currentLevelBoosts, + boosts, + hasMyBoost: Boolean(myBoost), + boostUrl, + nextLevelBoosts, + ...(premiumAudience && { premiumAudience: buildStatisticsPercentage(premiumAudience) }), + }; +} diff --git a/src/api/gramjs/methods/stories.ts b/src/api/gramjs/methods/stories.ts index 89f7e6023..b05ae9963 100644 --- a/src/api/gramjs/methods/stories.ts +++ b/src/api/gramjs/methods/stories.ts @@ -17,6 +17,9 @@ import { buildCollectionByCallback } from '../../../util/iteratees'; import { buildApiChatFromPreview } from '../apiBuilders/chats'; import { getApiChatIdFromMtpPeer } from '../apiBuilders/peers'; import { + buildApiApplyBoostInfo, + buildApiApplyBoostInfoFromError, + buildApiBoostsStatus, buildApiPeerStories, buildApiStealthMode, buildApiStory, @@ -426,3 +429,68 @@ export function activateStealthMode({ shouldReturnTrue: true, }); } + +export async function fetchCanApplyBoost({ + chat, +} : { + chat: ApiChat; +}) { + let result: GramJs.stories.TypeCanApplyBoostResult | undefined; + try { + result = await invokeRequest(new GramJs.stories.CanApplyBoost({ + peer: buildInputPeer(chat.id, chat.accessHash), + }), { + shouldThrow: true, + }); + } catch (error) { + const info = buildApiApplyBoostInfoFromError(error); + if (!info) return undefined; + return { + info, + chats: [], + }; + } + + if (!result) { + return undefined; + } + + const mtpChats = 'chats' in result ? result.chats : []; + addEntitiesToLocalDb(mtpChats); + + const chats = mtpChats.map((c) => buildApiChatFromPreview(c)).filter(Boolean); + const info = buildApiApplyBoostInfo(result); + + return { + info, + chats, + }; +} + +export function applyBoost({ + chat, +} : { + chat: ApiChat; +}) { + return invokeRequest(new GramJs.stories.ApplyBoost({ + peer: buildInputPeer(chat.id, chat.accessHash), + }), { + shouldReturnTrue: true, + }); +} + +export async function fetchBoostsStatus({ + chat, +}: { + chat: ApiChat; +}) { + const result = await invokeRequest(new GramJs.stories.GetBoostsStatus({ + peer: buildInputPeer(chat.id, chat.accessHash), + })); + + if (!result) { + return undefined; + } + + return buildApiBoostsStatus(result); +} diff --git a/src/api/types/stories.ts b/src/api/types/stories.ts index 24d94335e..6a8ab6d5b 100644 --- a/src/api/types/stories.ts +++ b/src/api/types/stories.ts @@ -2,6 +2,7 @@ import type { ApiPrivacySettings } from '../../types'; import type { ApiGeoPoint, ApiMessage, ApiReaction, ApiReactionCount, } from './messages'; +import type { StatisticsOverviewPercentage } from './statistics'; export interface ApiStory { '@type'?: 'story'; @@ -108,3 +109,33 @@ export type ApiMediaAreaSuggestedReaction = { }; export type ApiMediaArea = ApiMediaAreaVenue | ApiMediaAreaGeoPoint | ApiMediaAreaSuggestedReaction; + +export type ApiApplyBoostOk = { + type: 'ok'; +}; + +export type ApiApplyBoostReplace = { + type: 'replace'; + boostedChatId: string; +}; + +export type ApiApplyBoostWait = { + type: 'wait'; + waitUntil: number; +}; + +export type ApiApplyBoostAlready = { + type: 'already'; +}; + +export type ApiApplyBoostInfo = ApiApplyBoostOk | ApiApplyBoostReplace | ApiApplyBoostWait | ApiApplyBoostAlready; + +export type ApiBoostsStatus = { + level: number; + currentLevelBoosts: number; + boosts: number; + nextLevelBoosts?: number; + hasMyBoost?: boolean; + boostUrl: string; + premiumAudience?: StatisticsOverviewPercentage; +}; diff --git a/src/assets/font-icons/boost.svg b/src/assets/font-icons/boost.svg new file mode 100644 index 000000000..062c8e599 --- /dev/null +++ b/src/assets/font-icons/boost.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/boostcircle.svg b/src/assets/font-icons/boostcircle.svg new file mode 100644 index 000000000..035186155 --- /dev/null +++ b/src/assets/font-icons/boostcircle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/bundles/extra.ts b/src/bundles/extra.ts index e6dffc9a5..61a0dd27a 100644 --- a/src/bundles/extra.ts +++ b/src/bundles/extra.ts @@ -19,6 +19,7 @@ export { default as PremiumMainModal } from '../components/main/premium/PremiumM export { default as GiftPremiumModal } from '../components/main/premium/GiftPremiumModal'; export { default as PremiumLimitReachedModal } from '../components/main/premium/common/PremiumLimitReachedModal'; export { default as StatusPickerMenu } from '../components/left/main/StatusPickerMenu'; +export { default as BoostModal } from '../components/modals/boost/BoostModal'; export { default as ChatlistModal } from '../components/modals/chatlist/ChatlistModal'; diff --git a/src/components/common/Picker.tsx b/src/components/common/Picker.tsx index 704bdf66b..70d806f76 100644 --- a/src/components/common/Picker.tsx +++ b/src/components/common/Picker.tsx @@ -132,7 +132,7 @@ const Picker: FC = ({
{lockedSelectedIds.map((id, i) => ( = ({ ))} {unlockedSelectedIds.map((id, i) => ( void; }; @@ -38,6 +39,7 @@ const PickerSelectedItem: FC = ({ icon, title, isMinimized, + isStandalone, canClose, clickArg, chat, @@ -81,6 +83,7 @@ const PickerSelectedItem: FC = ({ chat?.isForum && 'forum-avatar', isMinimized && 'minimized', canClose && 'closeable', + isStandalone && 'standalone', ); return ( @@ -106,13 +109,13 @@ const PickerSelectedItem: FC = ({ }; export default memo(withGlobal( - (global, { chatOrUserId, forceShowSelf }): StateProps => { - if (!chatOrUserId) { + (global, { peerId, forceShowSelf }): StateProps => { + if (!peerId) { return {}; } - const chat = selectChat(global, chatOrUserId); - const user = selectUser(global, chatOrUserId); + const chat = selectChat(global, peerId); + const user = selectUser(global, peerId); const isSavedMessages = !forceShowSelf && user && user.isSelf; return { diff --git a/src/components/common/PremiumProgress.module.scss b/src/components/common/PremiumProgress.module.scss new file mode 100644 index 000000000..f148f236f --- /dev/null +++ b/src/components/common/PremiumProgress.module.scss @@ -0,0 +1,123 @@ +.root { + --percent: calc(var(--progress, 0.5) * 100%); + display: flex; + position: relative; + height: 2rem; + background: #F1F3F5; + border-radius: 0.625rem; + color: black; +} + +.withBadge { + margin-top: 2rem; +} + +.badgeContainer { + --shift-x: calc(clamp(10%, var(--percent), 90%) - 50%); + display: flex; + justify-content: center; + position: absolute; + top: -1.5rem; + left: 0; + right: 0; + transform: translate(var(--shift-x), -20px); + + transition: transform 0.2s ease-in-out; + animation: slide-in 0.5s ease-in-out; +} + +@keyframes slide-in { + from { + transform: translate(-50%, -20px); + } + + to { + transform: translate(var(--shift-x), -20px); + } +} + +.floating-badge { + display: flex; + align-items: center; + justify-content: center; + color: #ffffff; + position: relative; + padding: 0.25rem 0.75rem; + border-radius: 1rem; + background-color: #7E85FF; + animation: rotate-in 0.5s ease-in-out; +} + +@keyframes rotate-in { + 0% { + transform: rotate(0deg); + } + + 50% { + // Rotate more if progress is higher + transform: rotate(calc(-20deg * var(--progress))); + } + + 100% { + transform: rotate(0deg); + } +} + +.floating-badge-triangle { + position: absolute; + bottom: -15px; +} + +.floating-badge-icon { + font-size: 1.25rem; + margin-right: 0.25rem; +} + +.floating-badge-value { + font-size: 16px; + font-weight: 500; +} + +.left, .right { + position: absolute; + top: 0; + bottom: 0; + display: flex; + align-items: center; + font-weight: 500; +} + +.left { + left: 0.75rem; +} + +.right { + right: 0.75rem; +} + +.progress { + --multiplier: calc(1 / var(--progress) - 1); + overflow: hidden; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: var(--percent); + border-top-left-radius: 0.625rem; + border-bottom-left-radius: 0.625rem; + background-image: var(--premium-gradient); + background-size: calc(1 / var(--progress) * 100%) 100%; + + .left, .right { + color: white; + white-space: nowrap; + } + + .right { + right: calc(-100% * var(--multiplier) + 0.75rem); + } +} + +.fullProgress { + border-radius: 0.625rem; +} diff --git a/src/components/common/PremiumProgress.tsx b/src/components/common/PremiumProgress.tsx new file mode 100644 index 000000000..47e0f985b --- /dev/null +++ b/src/components/common/PremiumProgress.tsx @@ -0,0 +1,79 @@ +import type { FC } from '../../lib/teact/teact'; +import React, { memo } from '../../lib/teact/teact'; + +import type { IconName } from '../../types/icons'; + +import buildClassName from '../../util/buildClassName'; +import buildStyle from '../../util/buildStyle'; + +import useLang from '../../hooks/useLang'; + +import Icon from './Icon'; + +import styles from './PremiumProgress.module.scss'; + +type OwnProps = { + leftText?: string; + rightText?: string; + floatingBadgeIcon?: IconName; + floatingBadgeText?: string; + progress?: number; + className?: string; +}; + +const LimitPreview: FC = ({ + leftText, + rightText, + floatingBadgeText, + floatingBadgeIcon, + progress, + className, +}) => { + const lang = useLang(); + + const hasFloatingBadge = Boolean(floatingBadgeIcon || floatingBadgeText); + const isProgressFull = Boolean(progress) && progress > 0.99; + + return ( +
+ {hasFloatingBadge && ( +
+
+ {floatingBadgeIcon && } + {floatingBadgeText && ( +
{floatingBadgeText}
+ )} +
+ + + +
+
+
+ )} +
+ {leftText} +
+
+ {rightText} +
+
+
+ {leftText} +
+
+ {rightText} +
+
+
+ ); +}; + +export default memo(LimitPreview); diff --git a/src/components/common/helpers/boostInfo.ts b/src/components/common/helpers/boostInfo.ts new file mode 100644 index 000000000..328fc1628 --- /dev/null +++ b/src/components/common/helpers/boostInfo.ts @@ -0,0 +1,24 @@ +import type { ApiBoostsStatus } from '../../../api/types'; + +export function getBoostProgressInfo(boostInfo: ApiBoostsStatus) { + const { + level, boosts, currentLevelBoosts, nextLevelBoosts, hasMyBoost, + } = boostInfo; + + const currentLevel = level; + const hasNextLevel = Boolean(nextLevelBoosts); + + const isJustUpgraded = boosts === currentLevelBoosts && hasMyBoost; + + const levelProgress = (!nextLevelBoosts || isJustUpgraded) ? 1 + : (boosts - currentLevelBoosts) / (nextLevelBoosts - currentLevelBoosts); + const remainingBoosts = nextLevelBoosts ? nextLevelBoosts - boosts : 0; + + return { + currentLevel, + hasNextLevel, + boosts, + levelProgress, + remainingBoosts, + }; +} diff --git a/src/components/left/main/LeftMainHeader.tsx b/src/components/left/main/LeftMainHeader.tsx index a5d46b377..616d9c8f0 100644 --- a/src/components/left/main/LeftMainHeader.tsx +++ b/src/components/left/main/LeftMainHeader.tsx @@ -229,7 +229,7 @@ const LeftMainHeader: FC = ({ )} {globalSearchChatId && ( = ({ > {localResults.map((id) => ( diff --git a/src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx b/src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx index e004992f9..1e3bf22bb 100644 --- a/src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx +++ b/src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx @@ -196,7 +196,7 @@ const SettingsFoldersChatsPicker: FC = ({ {selectedChatTypes.map(renderSelectedChatType)} {selectedIds.map((id, i) => ( = ({ deleteFolderDialog, isMasterTab, chatlistModal, + boostModal, noRightColumnAnimation, isSynced, }) => { @@ -554,6 +557,7 @@ const Main: FC = ({ userId={newContactUserId} isByPhoneNumber={newContactByPhoneNumber} /> + @@ -616,6 +620,7 @@ export default memo(withGlobal( limitReachedModal, deleteFolderDialogModal, chatlistModal, + boostModal, } = selectTabState(global); const { chatId: audioChatId, messageId: audioMessageId } = audioPlayer; @@ -678,6 +683,7 @@ export default memo(withGlobal( isMasterTab, requestedDraft, chatlistModal, + boostModal, noRightColumnAnimation, isSynced: global.isSynced, }; diff --git a/src/components/middle/message/helpers/webpageType.ts b/src/components/middle/message/helpers/webpageType.ts index b5f7c3d20..6cc06711c 100644 --- a/src/components/middle/message/helpers/webpageType.ts +++ b/src/components/middle/message/helpers/webpageType.ts @@ -25,7 +25,9 @@ export function getWebpageButtonText(type?: string) { case 'telegram_chatlist': return 'ViewChatList'; case 'telegram_story': - return 'ViewStory'; + return 'lng_view_button_story'; + case 'telegram_channel_boost': + return 'lng_view_button_boost'; default: return undefined; } diff --git a/src/components/modals/boost/BoostModal.async.tsx b/src/components/modals/boost/BoostModal.async.tsx new file mode 100644 index 000000000..c6027accc --- /dev/null +++ b/src/components/modals/boost/BoostModal.async.tsx @@ -0,0 +1,18 @@ +import type { FC } from '../../../lib/teact/teact'; +import React from '../../../lib/teact/teact'; + +import type { OwnProps } from './BoostModal'; + +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const BoostModalAsync: FC = (props) => { + const { info } = props; + const BoostModal = useModuleLoader(Bundles.Extra, 'BoostModal', !info); + + // eslint-disable-next-line react/jsx-props-no-spreading + return BoostModal ? : undefined; +}; + +export default BoostModalAsync; diff --git a/src/components/modals/boost/BoostModal.module.scss b/src/components/modals/boost/BoostModal.module.scss new file mode 100644 index 000000000..5f313d5b3 --- /dev/null +++ b/src/components/modals/boost/BoostModal.module.scss @@ -0,0 +1,69 @@ +.content { + display: flex; + flex-direction: column; + gap: 1rem; + padding-top: 0 !important; + min-height: 14rem; + overflow: hidden; +} + +.loading { + margin-block: auto; +} + +.text-center { + text-align: center; + text-wrap: balance +} + +.description { + padding: 0 0.75rem; +} + +.chip { + align-self: center; +} + +.replaceModal :global(.modal-dialog) { + max-width: 22rem; +} + +.replaceModalContent { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.avatarContainer { + display: flex; + align-self: center; + gap: 0.25rem; + align-items: center; + margin-bottom: 0.5rem; +} + +.arrow { + font-size: 2rem; + color: var(--color-text-secondary); +} + +.boostedWrapper { + position: relative; +} + +.boostedMark { + position: absolute; + bottom: -0.125rem; + right: -0.125rem; + font-size: 1.25rem; + background-color: var(--color-background); + padding: 0.125rem; + border-radius: 50%; + z-index: 10; + + &::before { + background-image: var(--premium-gradient); + background-clip: text; + -webkit-text-fill-color: transparent; + } +} diff --git a/src/components/modals/boost/BoostModal.tsx b/src/components/modals/boost/BoostModal.tsx new file mode 100644 index 000000000..6245bafca --- /dev/null +++ b/src/components/modals/boost/BoostModal.tsx @@ -0,0 +1,311 @@ +import React, { memo, useMemo } from '../../../lib/teact/teact'; +import { getActions, withGlobal } from '../../../global'; + +import type { ApiApplyBoostInfo, ApiChat } from '../../../api/types'; +import type { TabState } from '../../../global/types'; + +import { getChatTitle } from '../../../global/helpers'; +import { selectChat } from '../../../global/selectors'; +import buildClassName from '../../../util/buildClassName'; +import { formatDateInFuture } from '../../../util/dateFormat'; +import { getServerTime } from '../../../util/serverTime'; +import { getBoostProgressInfo } from '../../common/helpers/boostInfo'; +import renderText from '../../common/helpers/renderText'; + +import useFlag from '../../../hooks/useFlag'; +import useLang from '../../../hooks/useLang'; +import useLastCallback from '../../../hooks/useLastCallback'; + +import Avatar from '../../common/Avatar'; +import Icon from '../../common/Icon'; +import PickerSelectedItem from '../../common/PickerSelectedItem'; +import PremiumProgress from '../../common/PremiumProgress'; +import Button from '../../ui/Button'; +import ConfirmDialog from '../../ui/ConfirmDialog'; +import Loading from '../../ui/Loading'; +import Modal from '../../ui/Modal'; + +import styles from './BoostModal.module.scss'; + +type LoadedParams = { + applyInfo?: ApiApplyBoostInfo; + leftText: string; + rightText?: string; + value: string; + progress: number; + descriptionText: string; + isBoosted?: boolean; +}; + +type BoostInfo = ({ + isStatusLoaded: false; + title: string; +} & Undefined) | ({ + isStatusLoaded: true; + title: string; +} & LoadedParams); + +export type OwnProps = { + info: TabState['boostModal']; +}; + +type StateProps = { + chat?: ApiChat; + boostedChat?: ApiChat; +}; + +const BoostModal = ({ + info, + chat, + boostedChat, +}: OwnProps & StateProps) => { + const { + openChat, + applyBoost, + closeBoostModal, + requestConfetti, + } = getActions(); + + const [isReplaceModalOpen, openReplaceModal, closeReplaceModal] = useFlag(); + const [isWaitDialogOpen, openWaitDialog, closeWaitDialog] = useFlag(); + + const isOpen = Boolean(info); + + const lang = useLang(); + + const chatTitle = useMemo(() => { + if (!chat) { + return undefined; + } + + return getChatTitle(lang, chat); + }, [chat, lang]); + + const boostedChatTitle = useMemo(() => { + if (!boostedChat) { + return undefined; + } + + return getChatTitle(lang, boostedChat); + }, [boostedChat, lang]); + + const { + isStatusLoaded, + isBoosted, + applyInfo, + title, + leftText, + rightText, + value, + progress, + descriptionText, + }: BoostInfo = useMemo(() => { + if (!info?.boostStatus || !chat) { + return { + isStatusLoaded: false, + title: lang('Loading'), + }; + } + + const { + level, currentLevelBoosts, hasMyBoost, + } = info.boostStatus; + + const { + boosts, + currentLevel, + hasNextLevel, + levelProgress, + remainingBoosts, + } = getBoostProgressInfo(info.boostStatus); + + const hasBoost = hasMyBoost || info.applyInfo?.type === 'already'; + const isJustUpgraded = boosts === currentLevelBoosts && hasBoost; + + const left = lang('BoostsLevel', currentLevel); + const right = hasNextLevel ? lang('BoostsLevel', currentLevel + 1) : undefined; + + const moreBoosts = lang('ChannelBoost.MoreBoosts', remainingBoosts); + const currentStoriesPerDay = lang('ChannelBoost.StoriesPerDay', level); + const nextLevelStoriesPerDay = lang('ChannelBoost.StoriesPerDay', level + 1); + + const modalTitle = hasBoost ? lang('ChannelBoost.YouBoostedOtherChannel') + : level === 0 ? lang('lng_boost_channel_title_first') : lang('lng_boost_channel_title_more'); + + let description: string | undefined; + if (level === 0) { + if (!hasBoost) { + description = lang('ChannelBoost.EnableStoriesForChannelText', [chatTitle, moreBoosts]); + } else { + description = lang('ChannelBoost.EnableStoriesMoreRequired', moreBoosts); + } + } else if (isJustUpgraded) { + if (level === 1) { + description = lang('ChannelBoost.EnabledStoriesForChannelText'); + } else { + description = lang('ChannelBoost.BoostedChannelReachedLevel', [level, currentStoriesPerDay]); + } + } else { + description = lang('ChannelBoost.HelpUpgradeChannelText', [chatTitle, moreBoosts, nextLevelStoriesPerDay]); + } + + return { + isStatusLoaded: true, + title: modalTitle, + leftText: left, + rightText: right, + value: boosts.toString(), + progress: levelProgress, + remainingBoosts, + descriptionText: description, + applyInfo: info.applyInfo, + isBoosted: hasBoost, + }; + }, [chat, chatTitle, info, lang]); + + const handleOpenChat = useLastCallback(() => { + openChat({ id: chat!.id }); + closeBoostModal(); + }); + + const handleApplyBoost = useLastCallback(() => { + closeReplaceModal(); + applyBoost({ chatId: chat!.id }); + requestConfetti(); + }); + + const handleButtonClick = useLastCallback(() => { + if (applyInfo?.type === 'ok') { + handleApplyBoost(); + } + + if (applyInfo?.type === 'replace') { + openReplaceModal(); + } + + if (applyInfo?.type === 'wait') { + openWaitDialog(); + } + + if (isBoosted) { + closeBoostModal(); + } + }); + + function renderContent() { + if (!isStatusLoaded) { + return ; + } + + return ( + <> + {chat && ( + + )} + +
+ {renderText(descriptionText, ['simple_markdown', 'emoji'])} +
+ + + ); + } + + return ( + + {renderContent()} + {applyInfo?.type === 'replace' && boostedChatTitle && ( + +
+
+ + +
+ + +
+
+ {renderText(lang('ChannelBoost.ReplaceBoost', [boostedChatTitle, chatTitle]), ['simple_markdown', 'emoji'])} +
+
+ + +
+
+ )} + {applyInfo?.type === 'wait' && ( + + {renderText( + lang( + 'ChannelBoost.Error.BoostTooOftenText', + formatDateInFuture(lang, getServerTime(), applyInfo.waitUntil), + ), + ['simple_markdown', 'emoji'], + )} + + )} +
+ ); +}; + +export default memo(withGlobal( + (global, { info }): StateProps => { + const chat = info && selectChat(global, info?.chatId); + const boostedChat = info?.applyInfo?.type === 'replace' + ? selectChat(global, info.applyInfo.boostedChatId) : undefined; + + return { + chat, + boostedChat, + }; + }, +)(BoostModal)); diff --git a/src/components/ui/Button.scss b/src/components/ui/Button.scss index b2a06039f..1ddbaf9d2 100644 --- a/src/components/ui/Button.scss +++ b/src/components/ui/Button.scss @@ -359,7 +359,8 @@ .Spinner { position: absolute; right: 0.875rem; - top: 0.875rem; + top: 50%; + transform: translateY(-50%); --spinner-size: 1.8125rem; } diff --git a/src/components/ui/ConfirmDialog.tsx b/src/components/ui/ConfirmDialog.tsx index 114bb395f..1cdf38a61 100644 --- a/src/components/ui/ConfirmDialog.tsx +++ b/src/components/ui/ConfirmDialog.tsx @@ -20,6 +20,7 @@ type OwnProps = { confirmLabel?: string; confirmIsDestructive?: boolean; isConfirmDisabled?: boolean; + isOnlyConfirm?: boolean; areButtonsInColumn?: boolean; className?: string; children?: React.ReactNode; @@ -37,6 +38,7 @@ const ConfirmDialog: FC = ({ confirmLabel = 'Confirm', confirmIsDestructive, isConfirmDisabled, + isOnlyConfirm, areButtonsInColumn, className, children, @@ -82,7 +84,7 @@ const ConfirmDialog: FC = ({ > {confirmLabel} - + {!isOnlyConfirm && }
); diff --git a/src/components/ui/Loading.tsx b/src/components/ui/Loading.tsx index 44536c7d8..f5b7dea53 100644 --- a/src/components/ui/Loading.tsx +++ b/src/components/ui/Loading.tsx @@ -9,12 +9,15 @@ import './Loading.scss'; type OwnProps = { color?: 'blue' | 'white' | 'black' | 'yellow'; backgroundColor?: 'light' | 'dark'; + className?: string; onClick?: NoneToVoidFunction; }; -const Loading = ({ color = 'blue', backgroundColor, onClick }: OwnProps) => { +const Loading = ({ + color = 'blue', backgroundColor, className, onClick, +}: OwnProps) => { return ( -
+
); diff --git a/src/global/actions/api/chats.ts b/src/global/actions/api/chats.ts index 9d61b5472..2e3ea3217 100644 --- a/src/global/actions/api/chats.ts +++ b/src/global/actions/api/chats.ts @@ -42,6 +42,7 @@ import { isChatSummaryOnly, isChatSuperGroup, isUserBot, + toChannelId, } from '../../helpers'; import { addActionHandler, getGlobal, setGlobal, @@ -973,6 +974,7 @@ addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnTyp checkChatlistInvite, openChatByUsername: openChatByUsernameAction, openStoryViewerByUsername, + processBoostParameters, } = actions; if (url.match(RE_TG_LINK)) { @@ -1002,6 +1004,7 @@ addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnTyp const hasStartApp = params.hasOwnProperty('startapp'); const choose = parseChooseParameter(params.choose); const storyId = part2 === 's' && (Number(part3) || undefined); + const hasBoost = params.hasOwnProperty('boost'); if (part1.match(/^\+([0-9]+)(\?|$)/)) { openChatByPhoneNumber({ @@ -1064,19 +1067,39 @@ addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnTyp inviteHash: params.voicechat || params.livestream, tabId, }); + } else if (part1 === 'boost') { + const username = part2; + const id = params.c; + + const isPrivate = !username && Boolean(id); + + processBoostParameters({ + usernameOrId: username || id, + isPrivate, + tabId, + }); + } else if (hasBoost) { + const isPrivate = part1 === 'c' && Boolean(chatOrChannelPostId); + processBoostParameters({ + usernameOrId: chatOrChannelPostId || part1, + isPrivate, + tabId, + }); } else if (part1 === 'c' && chatOrChannelPostId && messageId) { - const chatId = `-100${chatOrChannelPostId}`; + const chatId = toChannelId(chatOrChannelPostId); const chat = selectChat(global, chatId); if (!chat) { showNotification({ message: 'Chat does not exist', tabId }); return; } - focusMessage({ - chatId: chat.id, - messageId, - tabId, - }); + if (messageId) { + focusMessage({ + chatId: chat.id, + messageId, + tabId, + }); + } } else if (part1.startsWith('$')) { openInvoice({ slug: part1.substring(1), @@ -1110,6 +1133,37 @@ addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnTyp } }); +addActionHandler('processBoostParameters', async (global, actions, payload): Promise => { + const { usernameOrId, isPrivate, tabId = getCurrentTabId() } = payload; + + let chat: ApiChat | undefined; + + if (isPrivate) { + const chatId = toChannelId(usernameOrId); + chat = selectChat(global, chatId); + if (!chat) { + actions.showNotification({ message: 'Chat does not exist', tabId }); + return; + } + } else { + chat = await fetchChatByUsername(global, usernameOrId); + if (!chat) { + actions.showNotification({ message: 'User does not exist', tabId }); + return; + } + } + + if (!isChatChannel(chat)) { + actions.openChat({ id: chat.id, tabId }); + return; + } + + actions.openBoostModal({ + chatId: chat.id, + tabId, + }); +}); + addActionHandler('acceptInviteConfirmation', async (global, actions, payload): Promise => { const { hash, tabId = getCurrentTabId() } = payload!; const result = await callApi('importChatInvite', { hash }); @@ -1139,7 +1193,9 @@ addActionHandler('openChatByUsername', async (global, actions, payload): Promise return; } if (!isWebApp) { - await openChatByUsername(global, actions, username, threadId, messageId, startParam, startAttach, attach, tabId); + await openChatByUsername( + global, actions, username, threadId, messageId, startParam, startAttach, attach, tabId, + ); return; } } diff --git a/src/global/actions/api/stories.ts b/src/global/actions/api/stories.ts index bcb31a0db..d1d514ed8 100644 --- a/src/global/actions/api/stories.ts +++ b/src/global/actions/api/stories.ts @@ -6,7 +6,7 @@ import { buildCollectionByKey } from '../../../util/iteratees'; import { translate } from '../../../util/langProvider'; import { getServerTime } from '../../../util/serverTime'; import { callApi } from '../../../api/gramjs'; -import { buildApiInputPrivacyRules } from '../../helpers'; +import { buildApiInputPrivacyRules, isChatChannel } from '../../helpers'; import { addActionHandler, getGlobal, setGlobal } from '../../index'; import { addChats, @@ -26,8 +26,10 @@ import { updateStoryViews, updateStoryViewsLoading, } from '../../reducers'; +import { updateTabState } from '../../reducers/tabs'; import { - selectPeer, selectPeerStories, selectPeerStory, + selectChat, + selectPeer, selectPeerStories, selectPeerStory, selectTabState, } from '../../selectors'; const INFINITE_LOOP_MARKER = 100; @@ -502,3 +504,89 @@ addActionHandler('activateStealthMode', (global, actions, payload): ActionReturn callApi('activateStealthMode', { isForPast: isForPast || true, isForFuture: isForFuture || true }); }); + +addActionHandler('openBoostModal', async (global, actions, payload): Promise => { + const { chatId, tabId = getCurrentTabId() } = payload; + const chat = selectChat(global, chatId); + if (!chat || !isChatChannel(chat)) return; + + global = updateTabState(global, { + boostModal: { + chatId, + }, + }, tabId); + setGlobal(global); + + const result = await callApi('fetchBoostsStatus', { + chat, + }); + + if (!result) { + actions.closeBoostModal({ tabId }); + return; + } + + global = getGlobal(); + global = updateTabState(global, { + boostModal: { + chatId, + boostStatus: result, + }, + }, tabId); + setGlobal(global); + + const applyInfoResult = await callApi('fetchCanApplyBoost', { + chat, + }); + + if (!applyInfoResult?.info) return; + + const applyInfo = applyInfoResult.info; + + global = getGlobal(); + const tabState = selectTabState(global, tabId); + if (!tabState.boostModal) return; + + global = addChats(global, buildCollectionByKey(applyInfoResult.chats, 'id')); + global = updateTabState(global, { + boostModal: { + ...tabState.boostModal, + applyInfo, + }, + }, tabId); + setGlobal(global); +}); + +addActionHandler('applyBoost', async (global, actions, payload): Promise => { + const { chatId, tabId = getCurrentTabId() } = payload; + + const chat = selectChat(global, chatId); + if (!chat) return; + + const result = await callApi('applyBoost', { + chat, + }); + + if (!result) { + return; + } + + const newStatusResult = await callApi('fetchBoostsStatus', { + chat, + }); + + if (!newStatusResult) { + return; + } + + global = getGlobal(); + const tabState = selectTabState(global, tabId); + if (!tabState.boostModal?.boostStatus) return; + global = updateTabState(global, { + boostModal: { + ...tabState.boostModal, + boostStatus: newStatusResult, + }, + }, tabId); + setGlobal(global); +}); diff --git a/src/global/actions/ui/stories.ts b/src/global/actions/ui/stories.ts index fe2f06cbc..9024b7cd9 100644 --- a/src/global/actions/ui/stories.ts +++ b/src/global/actions/ui/stories.ts @@ -411,3 +411,11 @@ addActionHandler('updateStoryView', (global, actions, payload): ActionReturnType }, }, tabId); }); + +addActionHandler('closeBoostModal', (global, actions, payload): ActionReturnType => { + const { tabId = getCurrentTabId() } = payload || {}; + + return updateTabState(global, { + boostModal: undefined, + }, tabId); +}); diff --git a/src/global/helpers/chats.ts b/src/global/helpers/chats.ts index e4676c132..74edd5e4d 100644 --- a/src/global/helpers/chats.ts +++ b/src/global/helpers/chats.ts @@ -35,6 +35,10 @@ export function isChannelId(entityId: string) { return entityId.length === CHANNEL_ID_LENGTH && entityId.startsWith('-100'); } +export function toChannelId(mtpId: string) { + return `-100${mtpId}`; +} + export function isChatGroup(chat: ApiChat) { return isChatBasicGroup(chat) || isChatSuperGroup(chat); } diff --git a/src/global/types.ts b/src/global/types.ts index 27be0ee0e..32ebaf39e 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -1,8 +1,10 @@ import type { ApiAppConfig, + ApiApplyBoostInfo, ApiAttachBot, ApiAttachment, ApiAvailableReaction, + ApiBoostsStatus, ApiChannelStatistics, ApiChat, ApiChatAdminRights, @@ -617,6 +619,12 @@ export type TabState = { suggestedPeerIds?: string[]; }; }; + + boostModal?: { + chatId: string; + boostStatus?: ApiBoostsStatus; + applyInfo?: ApiApplyBoostInfo; + }; }; export type GlobalState = { @@ -1358,6 +1366,10 @@ export interface ActionPayloads { startApp?: string; originalParts?: string[]; } & WithTabId; + processBoostParameters: { + usernameOrId: string; + isPrivate?: boolean; + } & WithTabId; requestThreadInfoUpdate: { chatId: string; threadId: number; @@ -2068,6 +2080,14 @@ export interface ActionPayloads { isForFuture?: boolean; } | undefined; + openBoostModal: { + chatId: string; + } & WithTabId; + closeBoostModal: WithTabId | undefined; + applyBoost: { + chatId: string; + } & WithTabId; + // Media Viewer & Audio Player openMediaViewer: { chatId?: string; diff --git a/src/lib/gramjs/tl/api.d.ts b/src/lib/gramjs/tl/api.d.ts index b78211038..3b087cc2a 100644 --- a/src/lib/gramjs/tl/api.d.ts +++ b/src/lib/gramjs/tl/api.d.ts @@ -348,7 +348,7 @@ namespace Api { export type TypeAccessPointRule = AccessPointRule; export type TypeTlsClientHello = TlsClientHello; export type TypeTlsBlock = TlsBlockString | TlsBlockRandom | TlsBlockZero | TlsBlockDomain | TlsBlockGrease | TlsBlockScope; - + export namespace storage { export type TypeFileType = storage.FileUnknown | storage.FilePartial | storage.FileJpeg | storage.FileGif | storage.FilePng | storage.FilePdf | storage.FileMp3 | storage.FileMov | storage.FileMp4 | storage.FileWebp; @@ -423,6 +423,7 @@ namespace Api { export type TypeEmojiGroups = messages.EmojiGroupsNotModified | messages.EmojiGroups; export type TypeTranslatedText = messages.TranslateResult; export type TypeBotApp = messages.BotApp; + export type TypeWebPage = messages.WebPage; } export namespace updates { @@ -8915,7 +8916,7 @@ namespace Api { }> { entries: Api.TypeTlsBlock[]; }; - + export namespace storage { export class FileUnknown extends VirtualClass {}; @@ -9753,6 +9754,15 @@ namespace Api { hasSettings?: true; app: Api.TypeBotApp; }; + export class WebPage extends VirtualClass<{ + webpage: Api.TypeWebPage; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + webpage: Api.TypeWebPage; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; } export namespace updates { @@ -10807,6 +10817,7 @@ namespace Api { boosts: int; nextLevelBoosts?: int; premiumAudience?: Api.TypeStatsPercentValue; + boostUrl: string; }> { // flags: undefined; myBoost?: true; @@ -10815,6 +10826,7 @@ namespace Api { boosts: int; nextLevelBoosts?: int; premiumAudience?: Api.TypeStatsPercentValue; + boostUrl: string; }; export class CanApplyBoostOk extends VirtualClass {}; export class CanApplyBoostReplace extends VirtualClass<{ @@ -10971,7 +10983,7 @@ namespace Api { }>, Api.TypeDestroySessionRes> { sessionId: long; }; - + export namespace auth { export class SendCode extends Request, Api.TypeWebPage> { + }>, messages.TypeWebPage> { url: string; hash: int; }; diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js index 2121fac43..26a7e1948 100644 --- a/src/lib/gramjs/tl/apiTl.js +++ b/src/lib/gramjs/tl/apiTl.js @@ -1148,11 +1148,12 @@ mediaAreaGeoPoint#df8b3b22 coordinates:MediaAreaCoordinates geo:GeoPoint = Media mediaAreaSuggestedReaction#14455871 flags:# dark:flags.0?true flipped:flags.1?true coordinates:MediaAreaCoordinates reaction:Reaction = MediaArea; peerStories#9a35e999 flags:# peer:Peer max_read_id:flags.0?int stories:Vector = PeerStories; stories.peerStories#cae68768 stories:PeerStories chats:Vector users:Vector = stories.PeerStories; -stories.boostsStatus#66ea1fef flags:# my_boost:flags.2?true level:int current_level_boosts:int boosts:int next_level_boosts:flags.0?int premium_audience:flags.1?StatsPercentValue = stories.BoostsStatus; +stories.boostsStatus#e5c1aa5c flags:# my_boost:flags.2?true level:int current_level_boosts:int boosts:int next_level_boosts:flags.0?int premium_audience:flags.1?StatsPercentValue boost_url:string = stories.BoostsStatus; stories.canApplyBoostOk#c3173587 = stories.CanApplyBoostResult; stories.canApplyBoostReplace#712c4655 current_boost:Peer chats:Vector = stories.CanApplyBoostResult; booster#e9e6380 user_id:long expires:int = Booster; stories.boostersList#f3dd3d1d flags:# count:int boosters:Vector next_offset:flags.0?string users:Vector = stories.BoostersList; +messages.webPage#fd5e12bd webpage:WebPage chats:Vector users:Vector = messages.WebPage; ---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; @@ -1279,7 +1280,7 @@ messages.getRecentStickers#9da9403b flags:# attached:flags.0?true hash:long = me messages.saveRecentSticker#392718f8 flags:# attached:flags.0?true id:InputDocument unsave:Bool = Bool; messages.clearRecentStickers#8999602d flags:# attached:flags.0?true = Bool; messages.getCommonChats#e40ca104 user_id:InputUser max_id:long limit:int = messages.Chats; -messages.getWebPage#32ca8f91 url:string hash:int = WebPage; +messages.getWebPage#8d9692a3 url:string hash:int = messages.WebPage; messages.toggleDialogPin#a731e257 flags:# pinned:flags.0?true peer:InputDialogPeer = Bool; messages.getPinnedDialogs#d6b94df2 folder_id:int = messages.PeerDialogs; messages.uploadMedia#519bc2b1 peer:InputPeer media:InputMedia = MessageMedia; @@ -1468,4 +1469,8 @@ stories.activateStealthMode#57bbd166 flags:# past:flags.0?true future:flags.1?tr stories.sendReaction#7fd736b2 flags:# add_to_recent:flags.0?true peer:InputPeer story_id:int reaction:Reaction = Updates; stories.getPeerStories#2c4ada50 peer:InputPeer = stories.PeerStories; stories.getPeerMaxIDs#535983c3 id:Vector = Vector; -stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool;`; \ No newline at end of file +stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool; +stories.getBoostsStatus#4c449472 peer:InputPeer = stories.BoostsStatus; +stories.getBoostersList#337ef980 peer:InputPeer offset:string limit:int = stories.BoostersList; +stories.canApplyBoost#db05c1bd peer:InputPeer = stories.CanApplyBoostResult; +stories.applyBoost#f29d7c2b peer:InputPeer = Bool;`; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index f528dde15..3ff857756 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -314,5 +314,9 @@ "stories.sendReaction", "stories.getPeerMaxIDs", "stories.togglePeerStoriesHidden", - "stories.getPeerStories" + "stories.getPeerStories", + "stories.getBoostsStatus", + "stories.getBoostersList", + "stories.canApplyBoost", + "stories.applyBoost" ] diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index 1fa995831..e5c4a04e8 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -288,6 +288,8 @@ $color-message-story-mention-to: #74bcff; --drag-target-border: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%23DDDFE0' stroke-width='4' stroke-dasharray='9.1%2c 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3e%3c/svg%3e"); --drag-target-border-hovered: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%2363A2E3' stroke-width='4' stroke-dasharray='9.1%2c 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3e%3c/svg%3e"); + --premium-gradient: linear-gradient(84.4deg, #6C93FF -4.85%, #976FFF 51.72%, #DF69D1 110.7%); + --layer-blackout-opacity: 0.3; --layer-transition: 300ms cubic-bezier(0.33, 1, 0.68, 1); diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 0386ae6eb..456b0e0f9 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -3,8 +3,8 @@ $icons-font: "icons"; @font-face { font-family: $icons-font; - src: url("./icons.woff2?2e8e2fec4b27141c4d298083615a0665") format("woff2"), -url("./icons.woff?2e8e2fec4b27141c4d298083615a0665") format("woff"); + src: url("./icons.woff2?aa9c231863df4bab22759fc9f141c077") format("woff2"), +url("./icons.woff?aa9c231863df4bab22759fc9f141c077") format("woff"); font-weight: normal; font-style: normal; font-display: block; @@ -58,200 +58,202 @@ $icons-map: ( "avatar-deleted-account": "\f115", "avatar-saved-messages": "\f116", "bold": "\f117", - "bot-command": "\f118", - "bot-commands-filled": "\f119", - "bots": "\f11a", - "bug": "\f11b", - "calendar-filter": "\f11c", - "calendar": "\f11d", - "camera-add": "\f11e", - "camera": "\f11f", - "car": "\f120", - "card": "\f121", - "channel-filled": "\f122", - "channel": "\f123", - "channelviews": "\f124", - "chat-badge": "\f125", - "chats-badge": "\f126", - "check": "\f127", - "close-circle": "\f128", - "close-topic": "\f129", - "close": "\f12a", - "cloud-download": "\f12b", - "collapse": "\f12c", - "colorize": "\f12d", - "comments-sticker": "\f12e", - "comments": "\f12f", - "copy-media": "\f130", - "copy": "\f131", - "darkmode": "\f132", - "data": "\f133", - "delete-filled": "\f134", - "delete-left": "\f135", - "delete-user": "\f136", - "delete": "\f137", - "document": "\f138", - "double-badge": "\f139", - "down": "\f13a", - "download": "\f13b", - "eats": "\f13c", - "edit": "\f13d", - "email": "\f13e", - "enter": "\f13f", - "expand": "\f140", - "eye-closed-outline": "\f141", - "eye-closed": "\f142", - "eye-outline": "\f143", - "eye": "\f144", - "favorite-filled": "\f145", - "favorite": "\f146", - "file-badge": "\f147", - "flag": "\f148", - "folder-badge": "\f149", - "folder": "\f14a", - "fontsize": "\f14b", - "forums": "\f14c", - "forward": "\f14d", - "fullscreen": "\f14e", - "gifs": "\f14f", - "gift": "\f150", - "group-filled": "\f151", - "group": "\f152", - "grouped-disable": "\f153", - "grouped": "\f154", - "hand-stop": "\f155", - "hashtag": "\f156", - "heart-outline": "\f157", - "heart": "\f158", - "help": "\f159", - "info-filled": "\f15a", - "info": "\f15b", - "install": "\f15c", - "italic": "\f15d", - "key": "\f15e", - "keyboard": "\f15f", - "lamp": "\f160", - "language": "\f161", - "large-pause": "\f162", - "large-play": "\f163", - "link-badge": "\f164", - "link-broken": "\f165", - "link": "\f166", - "location": "\f167", - "lock-badge": "\f168", - "lock": "\f169", - "logout": "\f16a", - "loop": "\f16b", - "mention": "\f16c", - "message-failed": "\f16d", - "message-pending": "\f16e", - "message-read": "\f16f", - "message-succeeded": "\f170", - "message": "\f171", - "microphone-alt": "\f172", - "microphone": "\f173", - "monospace": "\f174", - "more-circle": "\f175", - "more": "\f176", - "mute": "\f177", - "muted": "\f178", - "new-chat-filled": "\f179", - "next": "\f17a", - "noise-suppression": "\f17b", - "non-contacts": "\f17c", - "open-in-new-tab": "\f17d", - "password-off": "\f17e", - "pause": "\f17f", - "permissions": "\f180", - "phone-discard-outline": "\f181", - "phone-discard": "\f182", - "phone": "\f183", - "photo": "\f184", - "pin-badge": "\f185", - "pin-list": "\f186", - "pin": "\f187", - "pinned-chat": "\f188", - "pinned-message": "\f189", - "pip": "\f18a", - "play-story": "\f18b", - "play": "\f18c", - "poll": "\f18d", - "premium": "\f18e", - "previous": "\f18f", - "privacy-policy": "\f190", - "readchats": "\f191", - "recent": "\f192", - "reload": "\f193", - "remove": "\f194", - "reopen-topic": "\f195", - "replace": "\f196", - "replies": "\f197", - "reply-filled": "\f198", - "reply": "\f199", - "revote": "\f19a", - "save-story": "\f19b", - "saved-messages": "\f19c", - "schedule": "\f19d", - "search": "\f19e", - "select": "\f19f", - "send-outline": "\f1a0", - "send": "\f1a1", - "settings-filled": "\f1a2", - "settings": "\f1a3", - "share-filled": "\f1a4", - "share-screen-outlined": "\f1a5", - "share-screen-stop": "\f1a6", - "share-screen": "\f1a7", - "sidebar": "\f1a8", - "skip-next": "\f1a9", - "skip-previous": "\f1aa", - "smallscreen": "\f1ab", - "smile": "\f1ac", - "sort": "\f1ad", - "speaker-muted-story": "\f1ae", - "speaker-outline": "\f1af", - "speaker-story": "\f1b0", - "speaker": "\f1b1", - "spoiler-disable": "\f1b2", - "spoiler": "\f1b3", - "sport": "\f1b4", - "stats": "\f1b5", - "stealth-future": "\f1b6", - "stealth-past": "\f1b7", - "stickers": "\f1b8", - "stop-raising-hand": "\f1b9", - "stop": "\f1ba", - "story-caption": "\f1bb", - "story-expired": "\f1bc", - "story-priority": "\f1bd", - "story-reply": "\f1be", - "strikethrough": "\f1bf", - "timer": "\f1c0", - "transcribe": "\f1c1", - "truck": "\f1c2", - "unarchive": "\f1c3", - "underlined": "\f1c4", - "unlock-badge": "\f1c5", - "unlock": "\f1c6", - "unmute": "\f1c7", - "unpin": "\f1c8", - "unread": "\f1c9", - "up": "\f1ca", - "user-filled": "\f1cb", - "user-online": "\f1cc", - "user": "\f1cd", - "video-outlined": "\f1ce", - "video-stop": "\f1cf", - "video": "\f1d0", - "voice-chat": "\f1d1", - "volume-1": "\f1d2", - "volume-2": "\f1d3", - "volume-3": "\f1d4", - "web": "\f1d5", - "webapp": "\f1d6", - "word-wrap": "\f1d7", - "zoom-in": "\f1d8", - "zoom-out": "\f1d9", + "boost": "\f118", + "boostcircle": "\f119", + "bot-command": "\f11a", + "bot-commands-filled": "\f11b", + "bots": "\f11c", + "bug": "\f11d", + "calendar-filter": "\f11e", + "calendar": "\f11f", + "camera-add": "\f120", + "camera": "\f121", + "car": "\f122", + "card": "\f123", + "channel-filled": "\f124", + "channel": "\f125", + "channelviews": "\f126", + "chat-badge": "\f127", + "chats-badge": "\f128", + "check": "\f129", + "close-circle": "\f12a", + "close-topic": "\f12b", + "close": "\f12c", + "cloud-download": "\f12d", + "collapse": "\f12e", + "colorize": "\f12f", + "comments-sticker": "\f130", + "comments": "\f131", + "copy-media": "\f132", + "copy": "\f133", + "darkmode": "\f134", + "data": "\f135", + "delete-filled": "\f136", + "delete-left": "\f137", + "delete-user": "\f138", + "delete": "\f139", + "document": "\f13a", + "double-badge": "\f13b", + "down": "\f13c", + "download": "\f13d", + "eats": "\f13e", + "edit": "\f13f", + "email": "\f140", + "enter": "\f141", + "expand": "\f142", + "eye-closed-outline": "\f143", + "eye-closed": "\f144", + "eye-outline": "\f145", + "eye": "\f146", + "favorite-filled": "\f147", + "favorite": "\f148", + "file-badge": "\f149", + "flag": "\f14a", + "folder-badge": "\f14b", + "folder": "\f14c", + "fontsize": "\f14d", + "forums": "\f14e", + "forward": "\f14f", + "fullscreen": "\f150", + "gifs": "\f151", + "gift": "\f152", + "group-filled": "\f153", + "group": "\f154", + "grouped-disable": "\f155", + "grouped": "\f156", + "hand-stop": "\f157", + "hashtag": "\f158", + "heart-outline": "\f159", + "heart": "\f15a", + "help": "\f15b", + "info-filled": "\f15c", + "info": "\f15d", + "install": "\f15e", + "italic": "\f15f", + "key": "\f160", + "keyboard": "\f161", + "lamp": "\f162", + "language": "\f163", + "large-pause": "\f164", + "large-play": "\f165", + "link-badge": "\f166", + "link-broken": "\f167", + "link": "\f168", + "location": "\f169", + "lock-badge": "\f16a", + "lock": "\f16b", + "logout": "\f16c", + "loop": "\f16d", + "mention": "\f16e", + "message-failed": "\f16f", + "message-pending": "\f170", + "message-read": "\f171", + "message-succeeded": "\f172", + "message": "\f173", + "microphone-alt": "\f174", + "microphone": "\f175", + "monospace": "\f176", + "more-circle": "\f177", + "more": "\f178", + "mute": "\f179", + "muted": "\f17a", + "new-chat-filled": "\f17b", + "next": "\f17c", + "noise-suppression": "\f17d", + "non-contacts": "\f17e", + "open-in-new-tab": "\f17f", + "password-off": "\f180", + "pause": "\f181", + "permissions": "\f182", + "phone-discard-outline": "\f183", + "phone-discard": "\f184", + "phone": "\f185", + "photo": "\f186", + "pin-badge": "\f187", + "pin-list": "\f188", + "pin": "\f189", + "pinned-chat": "\f18a", + "pinned-message": "\f18b", + "pip": "\f18c", + "play-story": "\f18d", + "play": "\f18e", + "poll": "\f18f", + "premium": "\f190", + "previous": "\f191", + "privacy-policy": "\f192", + "readchats": "\f193", + "recent": "\f194", + "reload": "\f195", + "remove": "\f196", + "reopen-topic": "\f197", + "replace": "\f198", + "replies": "\f199", + "reply-filled": "\f19a", + "reply": "\f19b", + "revote": "\f19c", + "save-story": "\f19d", + "saved-messages": "\f19e", + "schedule": "\f19f", + "search": "\f1a0", + "select": "\f1a1", + "send-outline": "\f1a2", + "send": "\f1a3", + "settings-filled": "\f1a4", + "settings": "\f1a5", + "share-filled": "\f1a6", + "share-screen-outlined": "\f1a7", + "share-screen-stop": "\f1a8", + "share-screen": "\f1a9", + "sidebar": "\f1aa", + "skip-next": "\f1ab", + "skip-previous": "\f1ac", + "smallscreen": "\f1ad", + "smile": "\f1ae", + "sort": "\f1af", + "speaker-muted-story": "\f1b0", + "speaker-outline": "\f1b1", + "speaker-story": "\f1b2", + "speaker": "\f1b3", + "spoiler-disable": "\f1b4", + "spoiler": "\f1b5", + "sport": "\f1b6", + "stats": "\f1b7", + "stealth-future": "\f1b8", + "stealth-past": "\f1b9", + "stickers": "\f1ba", + "stop-raising-hand": "\f1bb", + "stop": "\f1bc", + "story-caption": "\f1bd", + "story-expired": "\f1be", + "story-priority": "\f1bf", + "story-reply": "\f1c0", + "strikethrough": "\f1c1", + "timer": "\f1c2", + "transcribe": "\f1c3", + "truck": "\f1c4", + "unarchive": "\f1c5", + "underlined": "\f1c6", + "unlock-badge": "\f1c7", + "unlock": "\f1c8", + "unmute": "\f1c9", + "unpin": "\f1ca", + "unread": "\f1cb", + "up": "\f1cc", + "user-filled": "\f1cd", + "user-online": "\f1ce", + "user": "\f1cf", + "video-outlined": "\f1d0", + "video-stop": "\f1d1", + "video": "\f1d2", + "voice-chat": "\f1d3", + "volume-1": "\f1d4", + "volume-2": "\f1d5", + "volume-3": "\f1d6", + "web": "\f1d7", + "webapp": "\f1d8", + "word-wrap": "\f1d9", + "zoom-in": "\f1da", + "zoom-out": "\f1db", ); .icon-active-sessions::before { @@ -323,6 +325,12 @@ $icons-map: ( .icon-bold::before { content: map.get($icons-map, "bold"); } +.icon-boost::before { + content: map.get($icons-map, "boost"); +} +.icon-boostcircle::before { + content: map.get($icons-map, "boostcircle"); +} .icon-bot-command::before { content: map.get($icons-map, "bot-command"); } diff --git a/src/styles/icons.woff b/src/styles/icons.woff index ee339644747aac42f41375f5ddce0d4862dd2507..c0d7eefc63ee455295190e6df0c37e11058f8991 100644 GIT binary patch delta 26311 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 QoyD0>*xUObcdL!(0Cm+h&;S4c diff --git a/src/styles/icons.woff2 b/src/styles/icons.woff2 index 76cbad0bffedb62184cb1d89adb43e9bd5629937..93587410a8e23d3c3a61ebc93bf8361686c8dde5 100644 GIT binary patch literal 23048 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 literal 22976 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 H_y+(0OTV~a diff --git a/src/types/icons/font.ts b/src/types/icons/font.ts index 55b6f4ba1..affc52798 100644 --- a/src/types/icons/font.ts +++ b/src/types/icons/font.ts @@ -22,6 +22,8 @@ export type FontIconName = | 'avatar-deleted-account' | 'avatar-saved-messages' | 'bold' + | 'boost' + | 'boostcircle' | 'bot-command' | 'bot-commands-filled' | 'bots' diff --git a/src/util/dateFormat.ts b/src/util/dateFormat.ts index a6749856b..2ad7f67bd 100644 --- a/src/util/dateFormat.ts +++ b/src/util/dateFormat.ts @@ -363,6 +363,31 @@ export function formatDateAtTime( return lang('formatDateAtTime', [formattedDate, time]); } +export function formatDateInFuture( + lang: LangFn, + currentTime: number, + datetime: number, +) { + const diff = Math.ceil(datetime - currentTime); + if (diff < 0) { + return lang('RightNow'); + } + + if (diff < 60) { + return lang('Seconds', diff); + } + + if (diff < 60 * 60) { + return lang('Minutes', Math.ceil(diff / 60)); + } + + if (diff < 60 * 60 * 24) { + return lang('Hours', Math.ceil(diff / (60 * 60))); + } + + return lang('Days', Math.ceil(diff / (60 * 60 * 24))); +} + function isValidDate(day: number, month: number, year = 2021): boolean { if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) { return false; diff --git a/src/util/deeplink.ts b/src/util/deeplink.ts index bbf37a3dd..9b8e8a433 100644 --- a/src/util/deeplink.ts +++ b/src/util/deeplink.ts @@ -7,7 +7,7 @@ import { IS_SAFARI } from './windowEnvironment'; type DeepLinkMethod = 'resolve' | 'login' | 'passport' | 'settings' | 'join' | 'addstickers' | 'addemoji' | 'setlanguage' | 'addtheme' | 'confirmphone' | 'socks' | 'proxy' | 'privatepost' | 'bg' | 'share' | 'msg' | 'msg_url' | -'invoice' | 'addlist'; +'invoice' | 'addlist' | 'boost'; export const processDeepLink = (url: string) => { const { @@ -28,6 +28,7 @@ export const processDeepLink = (url: string) => { openChatWithDraft, checkChatlistInvite, openStoryViewerByUsername, + processBoostParameters, } = getActions(); // Safari thinks the path in tg://path links is hostname for some reason @@ -43,6 +44,7 @@ export const processDeepLink = (url: string) => { const hasStartAttach = params.hasOwnProperty('startattach'); const hasStartApp = params.hasOwnProperty('startapp'); + const hasBoost = params.hasOwnProperty('boost'); const choose = parseChooseParameter(params.choose); const threadId = Number(thread) || Number(topic) || undefined; @@ -64,6 +66,8 @@ export const processDeepLink = (url: string) => { username: domain, inviteHash: voicechat || livestream, }); + } else if (hasBoost) { + processBoostParameters({ usernameOrId: domain }); } else if (phone) { openChatByPhoneNumber({ phoneNumber: phone, startAttach: startattach, attach }); } else if (story) { @@ -87,6 +91,13 @@ export const processDeepLink = (url: string) => { post, channel, } = params; + const hasBoost = params.hasOwnProperty('boost'); + + if (hasBoost) { + processBoostParameters({ usernameOrId: channel, isPrivate: true }); + return; + } + focusMessage({ chatId: `-${channel}`, messageId: Number(post), @@ -138,6 +149,14 @@ export const processDeepLink = (url: string) => { openInvoice({ slug }); break; } + + case 'boost': { + const { channel, domain } = params; + const isPrivate = Boolean(channel); + + processBoostParameters({ usernameOrId: channel || domain, isPrivate }); + break; + } default: // Unsupported deeplink