From 5e679218e2dffde97f8852825581e642c6ca8c0e Mon Sep 17 00:00:00 2001 From: zubiden <19638254+zubiden@users.noreply.github.com> Date: Sat, 11 Oct 2025 19:07:54 +0200 Subject: [PATCH] Profile: GIFs & Main Tab (#6336) --- .fantasticonrc.cjs | 2 +- src/@types/global.d.ts | 2 + src/api/gramjs/apiBuilders/chats.ts | 7 +- src/api/gramjs/apiBuilders/common.ts | 17 -- src/api/gramjs/apiBuilders/misc.ts | 63 +------ src/api/gramjs/apiBuilders/peers.ts | 109 +++++++++++- src/api/gramjs/apiBuilders/statistics.ts | 4 +- src/api/gramjs/apiBuilders/users.ts | 14 +- src/api/gramjs/gramjsBuilders/index.ts | 26 +++ src/api/gramjs/methods/account.ts | 18 +- src/api/gramjs/methods/chats.ts | 24 ++- src/api/gramjs/methods/messages.ts | 3 + src/api/gramjs/methods/settings.ts | 10 +- src/api/gramjs/updates/mtpUpdateHandler.ts | 8 +- src/api/types/chats.ts | 35 ++-- src/api/types/index.ts | 1 + src/api/types/messages.ts | 5 +- src/api/types/misc.ts | 36 +--- src/api/types/peers.ts | 84 ++++++++++ src/api/types/updates.ts | 4 +- src/api/types/users.ts | 35 +--- src/assets/font-icons/group-filled.svg | 2 +- src/assets/font-icons/one-filled.svg | 2 +- src/assets/localization/fallback.strings | 3 + src/components/common/AnimatedTabList.tsx | 3 +- src/components/common/Media.tsx | 46 +++-- src/components/common/profile/ChatExtra.tsx | 23 ++- src/components/mediaViewer/MediaViewer.tsx | 24 +-- .../mediaViewer/MediaViewerActions.tsx | 2 +- .../mediaViewer/MediaViewerContent.tsx | 2 +- .../mediaViewer/helpers/getViewableMedia.ts | 15 +- .../mediaViewer/hooks/useMediaProps.ts | 6 +- src/components/right/Profile.scss | 3 + src/components/right/Profile.tsx | 157 ++++++++++++------ .../right/hooks/useProfileViewportIds.ts | 9 + .../right/hooks/useTransitionFixes.ts | 28 +--- src/components/ui/Tab.tsx | 11 +- src/components/ui/TabList.tsx | 14 +- src/global/actions/api/chats.ts | 27 +++ src/global/actions/api/middleSearch.ts | 4 +- src/global/helpers/messageMedia.ts | 13 +- src/global/selectors/peers.ts | 11 +- src/global/types/actions.ts | 5 + src/global/types/tabState.ts | 2 +- src/hooks/animations/useViewTransition.ts | 4 +- src/lib/gramjs/tl/apiTl.ts | 2 + src/lib/gramjs/tl/static/api.json | 2 + src/styles/icons.woff | Bin 37216 -> 37228 bytes src/styles/icons.woff2 | Bin 31072 -> 31080 bytes src/types/index.ts | 3 +- src/types/language.d.ts | 3 + 51 files changed, 603 insertions(+), 330 deletions(-) create mode 100644 src/api/types/peers.ts diff --git a/.fantasticonrc.cjs b/.fantasticonrc.cjs index d95a56152..02192ffda 100644 --- a/.fantasticonrc.cjs +++ b/.fantasticonrc.cjs @@ -5,7 +5,7 @@ module.exports = { fontTypes: ['woff2', 'woff'], assetTypes: ['scss', 'ts'], tag: '', - // Use a custom Handlebars template + normalize: true, templates: { scss: './dev/icons.scss.hbs', }, diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index b1e0e496e..bf8f03605 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -48,6 +48,8 @@ type AnyToVoidFunction = (...args: any[]) => void; type BooleanToVoidFunction = (value: boolean) => void; type NoneToVoidFunction = () => void; +type StringAutocomplete = T | (string & {}); + type Complete = { [P in keyof Required]: Pick extends Required> ? T[P] : (T[P] | undefined); }; diff --git a/src/api/gramjs/apiBuilders/chats.ts b/src/api/gramjs/apiBuilders/chats.ts index 56ee53bcd..696248622 100644 --- a/src/api/gramjs/apiBuilders/chats.ts +++ b/src/api/gramjs/apiBuilders/chats.ts @@ -29,14 +29,17 @@ import { getServerTimeOffset } from '../../../util/serverTime'; import { addPhotoToLocalDb, addUserToLocalDb } from '../helpers/localDb'; import { serializeBytes } from '../helpers/misc'; import { - buildApiBotVerification, buildApiFormattedText, buildApiPhoto, buildApiUsernames, buildAvatarPhotoId, + buildApiFormattedText, buildApiPhoto, buildApiUsernames, } from './common'; import { omitVirtualClassFields } from './helpers'; -import { buildApiPeerNotifySettings, buildApiRestrictionReasons } from './misc'; +import { buildApiRestrictionReasons } from './misc'; import { + buildApiBotVerification, buildApiEmojiStatus, buildApiPeerColor, buildApiPeerId, + buildApiPeerNotifySettings, + buildAvatarPhotoId, getApiChatIdFromMtpPeer, isMtpPeerChat, isMtpPeerUser, diff --git a/src/api/gramjs/apiBuilders/common.ts b/src/api/gramjs/apiBuilders/common.ts index 01005b0b4..fe5a77c53 100644 --- a/src/api/gramjs/apiBuilders/common.ts +++ b/src/api/gramjs/apiBuilders/common.ts @@ -3,7 +3,6 @@ import type { Entity } from '../../../lib/gramjs/types'; import { strippedPhotoToJpg } from '../../../lib/gramjs/Utils'; import type { - ApiBotVerification, ApiFormattedText, ApiMessageEntity, ApiMessageEntityDefault, @@ -293,19 +292,3 @@ export function buildApiMessageEntity(entity: GramJs.TypeMessageEntity): ApiMess length, }; } - -export function buildAvatarPhotoId(photo: GramJs.TypeUserProfilePhoto | GramJs.TypeChatPhoto) { - if ('photoId' in photo) { - return photo.photoId.toString(); - } - - return undefined; -} - -export function buildApiBotVerification(botVerification: GramJs.BotVerification): ApiBotVerification { - return { - botId: buildApiPeerId(botVerification.botId, 'user'), - iconId: botVerification.icon.toString(), - description: botVerification.description, - }; -} diff --git a/src/api/gramjs/apiBuilders/misc.ts b/src/api/gramjs/apiBuilders/misc.ts index aeb817de9..751952f15 100644 --- a/src/api/gramjs/apiBuilders/misc.ts +++ b/src/api/gramjs/apiBuilders/misc.ts @@ -7,9 +7,6 @@ import type { ApiCountry, ApiLanguage, ApiOldLangString, - ApiPeerColors, - ApiPeerNotifySettings, - ApiPeerProfileColorSet, ApiPrivacyKey, ApiRestrictionReason, ApiSession, @@ -20,9 +17,8 @@ import type { LangPackStringValue, } from '../../types'; -import { numberToHexColor } from '../../../util/colors'; import { - buildCollectionByCallback, omit, omitUndefined, pick, + omit, omitUndefined, pick, } from '../../../util/iteratees'; import { toJSNumber } from '../../../util/numbers'; import { addUserToLocalDb } from '../helpers/localDb'; @@ -111,23 +107,6 @@ export function buildPrivacyKey(key: GramJs.TypePrivacyKey): ApiPrivacyKey | und return undefined; } -export function buildApiPeerNotifySettings( - notifySettings: GramJs.TypePeerNotifySettings, -): ApiPeerNotifySettings { - const { - silent, muteUntil, showPreviews, otherSound, - } = notifySettings; - - const hasSound = !(otherSound instanceof GramJs.NotificationSoundNone); - - return { - hasSound, - isSilentPosting: silent, - mutedUntil: muteUntil, - shouldShowPreviews: showPreviews, - }; -} - function buildApiCountry(country: GramJs.help.Country, code: GramJs.help.CountryCode) { const { hidden, iso2, defaultName, name, @@ -295,46 +274,6 @@ export function buildApiLanguage(lang: GramJs.TypeLangPackLanguage): ApiLanguage }; } -function buildApiPeerColorSet(colorSet: GramJs.help.PeerColorSet) { - return colorSet.colors.map((color) => numberToHexColor(color)); -} - -function buildApiPeerProfileColorSet(colorSet: GramJs.help.PeerColorProfileSet): ApiPeerProfileColorSet { - return { - paletteColors: colorSet.paletteColors.map((color) => numberToHexColor(color)), - bgColors: colorSet.bgColors.map((color) => numberToHexColor(color)), - storyColors: colorSet.storyColors.map((color) => numberToHexColor(color)), - }; -} - -export function buildApiPeerColors(wrapper: GramJs.help.TypePeerColors): ApiPeerColors['general'] | undefined { - if (!(wrapper instanceof GramJs.help.PeerColors)) return undefined; - - return buildCollectionByCallback(wrapper.colors, (color) => { - return [color.colorId, { - isHidden: color.hidden, - colors: color.colors instanceof GramJs.help.PeerColorSet - ? buildApiPeerColorSet(color.colors) : undefined, - darkColors: color.darkColors instanceof GramJs.help.PeerColorSet - ? buildApiPeerColorSet(color.darkColors) : undefined, - }]; - }); -} - -export function buildApiPeerProfileColors(wrapper: GramJs.help.TypePeerColors): ApiPeerColors['profile'] | undefined { - if (!(wrapper instanceof GramJs.help.PeerColors)) return undefined; - - return buildCollectionByCallback(wrapper.colors, (color) => { - return [color.colorId, { - isHidden: color.hidden, - colors: color.colors instanceof GramJs.help.PeerColorProfileSet - ? buildApiPeerProfileColorSet(color.colors) : undefined, - darkColors: color.darkColors instanceof GramJs.help.PeerColorProfileSet - ? buildApiPeerProfileColorSet(color.darkColors) : undefined, - }]; - }); -} - export function buildApiTimezone(timezone: GramJs.TypeTimezone): ApiTimezone { const { id, name, utcOffset } = timezone; return { diff --git a/src/api/gramjs/apiBuilders/peers.ts b/src/api/gramjs/apiBuilders/peers.ts index 26384b464..cec9bf525 100644 --- a/src/api/gramjs/apiBuilders/peers.ts +++ b/src/api/gramjs/apiBuilders/peers.ts @@ -1,9 +1,18 @@ import { Api as GramJs } from '../../../lib/gramjs'; -import type { ApiEmojiStatusType, ApiPeerColor } from '../../types'; +import type { + ApiBotVerification, + ApiEmojiStatusType, + ApiPeerColor, + ApiPeerColors, + ApiPeerNotifySettings, + ApiPeerProfileColorSet, + ApiProfileTab, +} from '../../types'; import { CHANNEL_ID_BASE } from '../../../config'; import { numberToHexColor } from '../../../util/colors'; +import { buildCollectionByCallback } from '../../../util/iteratees'; type TypePeerOrInput = GramJs.TypePeer | GramJs.TypeInputPeer | GramJs.TypeInputUser | GramJs.TypeInputChannel; @@ -49,6 +58,46 @@ export function buildApiPeerColor(peerColor: GramJs.TypePeerColor): ApiPeerColor }; } +function buildApiPeerColorSet(colorSet: GramJs.help.PeerColorSet) { + return colorSet.colors.map((color) => numberToHexColor(color)); +} + +function buildApiPeerProfileColorSet(colorSet: GramJs.help.PeerColorProfileSet): ApiPeerProfileColorSet { + return { + paletteColors: colorSet.paletteColors.map((color) => numberToHexColor(color)), + bgColors: colorSet.bgColors.map((color) => numberToHexColor(color)), + storyColors: colorSet.storyColors.map((color) => numberToHexColor(color)), + }; +} + +export function buildApiPeerColors(wrapper: GramJs.help.TypePeerColors): ApiPeerColors['general'] | undefined { + if (!(wrapper instanceof GramJs.help.PeerColors)) return undefined; + + return buildCollectionByCallback(wrapper.colors, (color) => { + return [color.colorId, { + isHidden: color.hidden, + colors: color.colors instanceof GramJs.help.PeerColorSet + ? buildApiPeerColorSet(color.colors) : undefined, + darkColors: color.darkColors instanceof GramJs.help.PeerColorSet + ? buildApiPeerColorSet(color.darkColors) : undefined, + }]; + }); +} + +export function buildApiPeerProfileColors(wrapper: GramJs.help.TypePeerColors): ApiPeerColors['profile'] | undefined { + if (!(wrapper instanceof GramJs.help.PeerColors)) return undefined; + + return buildCollectionByCallback(wrapper.colors, (color) => { + return [color.colorId, { + isHidden: color.hidden, + colors: color.colors instanceof GramJs.help.PeerColorProfileSet + ? buildApiPeerProfileColorSet(color.colors) : undefined, + darkColors: color.darkColors instanceof GramJs.help.PeerColorProfileSet + ? buildApiPeerProfileColorSet(color.darkColors) : undefined, + }]; + }); +} + export function buildApiEmojiStatus(mtpEmojiStatus: GramJs.TypeEmojiStatus): ApiEmojiStatusType | undefined { if (mtpEmojiStatus instanceof GramJs.EmojiStatus) { @@ -77,3 +126,61 @@ ApiEmojiStatusType | undefined { return undefined; } + +export function buildAvatarPhotoId(photo: GramJs.TypeUserProfilePhoto | GramJs.TypeChatPhoto) { + if ('photoId' in photo) { + return photo.photoId.toString(); + } + + return undefined; +} + +export function buildApiBotVerification(botVerification: GramJs.BotVerification): ApiBotVerification { + return { + botId: buildApiPeerId(botVerification.botId, 'user'), + iconId: botVerification.icon.toString(), + description: botVerification.description, + }; +} + +export function buildApiPeerNotifySettings( + notifySettings: GramJs.TypePeerNotifySettings, +): ApiPeerNotifySettings { + const { + silent, muteUntil, showPreviews, otherSound, + } = notifySettings; + + const hasSound = !(otherSound instanceof GramJs.NotificationSoundNone); + + return { + hasSound, + isSilentPosting: silent, + mutedUntil: muteUntil, + shouldShowPreviews: showPreviews, + }; +} + +export function buildApiProfileTab(profileTab: GramJs.TypeProfileTab): ApiProfileTab { + switch (profileTab.className) { + case 'ProfileTabPosts': + return 'stories'; + case 'ProfileTabGifts': + return 'gifts'; + case 'ProfileTabMedia': + return 'media'; + case 'ProfileTabFiles': + return 'documents'; + case 'ProfileTabMusic': + return 'audio'; + case 'ProfileTabVoice': + return 'voice'; + case 'ProfileTabLinks': + return 'links'; + case 'ProfileTabGifs': + return 'gif'; + default: { + const _exhaustiveCheck: never = profileTab; + return _exhaustiveCheck; + } + } +} diff --git a/src/api/gramjs/apiBuilders/statistics.ts b/src/api/gramjs/apiBuilders/statistics.ts index a3038257b..f0af93198 100644 --- a/src/api/gramjs/apiBuilders/statistics.ts +++ b/src/api/gramjs/apiBuilders/statistics.ts @@ -16,9 +16,9 @@ import type { TypeStatisticsGraph, } from '../../types'; -import { buildApiUsernames, buildAvatarPhotoId } from './common'; +import { buildApiUsernames } from './common'; import { buildApiCurrencyAmount } from './payments'; -import { buildApiPeerId, getApiChatIdFromMtpPeer } from './peers'; +import { buildApiPeerId, buildAvatarPhotoId, getApiChatIdFromMtpPeer } from './peers'; export function buildChannelStatistics(stats: GramJs.stats.BroadcastStats): ApiChannelStatistics { return { diff --git a/src/api/gramjs/apiBuilders/users.ts b/src/api/gramjs/apiBuilders/users.ts index 4befffb21..66092ffbe 100644 --- a/src/api/gramjs/apiBuilders/users.ts +++ b/src/api/gramjs/apiBuilders/users.ts @@ -14,11 +14,18 @@ import { toJSNumber } from '../../../util/numbers'; import { buildApiBotInfo } from './bots'; import { buildApiBusinessIntro, buildApiBusinessLocation, buildApiBusinessWorkHours } from './business'; import { - buildApiBotVerification, buildApiPhoto, buildApiUsernames, buildAvatarPhotoId, + buildApiPhoto, buildApiUsernames, } from './common'; import { buildApiDisallowedGiftsSettings } from './gifts'; import { omitVirtualClassFields } from './helpers'; -import { buildApiEmojiStatus, buildApiPeerColor, buildApiPeerId } from './peers'; +import { + buildApiBotVerification, + buildApiEmojiStatus, + buildApiPeerColor, + buildApiPeerId, + buildApiProfileTab, + buildAvatarPhotoId, +} from './peers'; export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUserFullInfo { const { @@ -29,7 +36,7 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse contactRequirePremium, businessWorkHours, businessLocation, businessIntro, birthday, personalChannelId, personalChannelMessage, sponsoredEnabled, stargiftsCount, botVerification, botCanManageEmojiStatus, settings, sendPaidMessagesStars, displayGiftsButton, disallowedGifts, - starsRating, starsMyPendingRating, starsMyPendingRatingDate, + starsRating, starsMyPendingRating, starsMyPendingRatingDate, mainTab, }, users, } = mtpUserFull; @@ -68,6 +75,7 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse hasScheduledMessages: hasScheduled, paidMessagesStars: toJSNumber(sendPaidMessagesStars), settings: buildApiPeerSettings(settings), + mainTab: mainTab && buildApiProfileTab(mainTab), }; } diff --git a/src/api/gramjs/gramjsBuilders/index.ts b/src/api/gramjs/gramjsBuilders/index.ts index d1855ddab..fcf227868 100644 --- a/src/api/gramjs/gramjsBuilders/index.ts +++ b/src/api/gramjs/gramjsBuilders/index.ts @@ -23,6 +23,7 @@ import type { ApiPoll, ApiPremiumGiftCodeOption, ApiPrivacyKey, + ApiProfileTab, ApiReactionWithPaid, ApiReportReason, ApiRequestInputInvoice, @@ -980,3 +981,28 @@ export function buildInputSavedStarGift(inputGift: ApiRequestInputSavedStarGift) savedId: BigInt(inputGift.savedId), }); } + +export function buildInputProfileTab(profileTab: ApiProfileTab) { + switch (profileTab) { + case 'stories': + return new GramJs.ProfileTabPosts(); + case 'gifts': + return new GramJs.ProfileTabGifts(); + case 'media': + return new GramJs.ProfileTabMedia(); + case 'documents': + return new GramJs.ProfileTabFiles(); + case 'audio': + return new GramJs.ProfileTabMusic(); + case 'voice': + return new GramJs.ProfileTabVoice(); + case 'links': + return new GramJs.ProfileTabLinks(); + case 'gif': + return new GramJs.ProfileTabGifs(); + default: { + const _exhaustiveCheck: never = profileTab; + return _exhaustiveCheck; + } + } +} diff --git a/src/api/gramjs/methods/account.ts b/src/api/gramjs/methods/account.ts index ae7f28f6c..fbba9e3ce 100644 --- a/src/api/gramjs/methods/account.ts +++ b/src/api/gramjs/methods/account.ts @@ -1,11 +1,17 @@ import { Api as GramJs } from '../../../lib/gramjs'; import type { - ApiPeer, ApiPhoto, ApiReportReason, + ApiPeer, ApiPhoto, ApiProfileTab, ApiReportReason, } from '../../types'; import { buildApiChatLink } from '../apiBuilders/misc'; -import { buildInputPeer, buildInputPhoto, buildInputReportReason, DEFAULT_PRIMITIVES } from '../gramjsBuilders'; +import { + buildInputPeer, + buildInputPhoto, + buildInputProfileTab, + buildInputReportReason, + DEFAULT_PRIMITIVES, +} from '../gramjsBuilders'; import { invokeRequest } from './client'; export async function reportPeer({ @@ -124,3 +130,11 @@ export function setAccountTTL({ days }: { days: number }) { shouldReturnTrue: true, }); } + +export function setAccountMainProfileTab({ tab }: { tab: ApiProfileTab }) { + return invokeRequest(new GramJs.account.SetMainProfileTab({ + tab: buildInputProfileTab(tab), + }), { + shouldReturnTrue: true, + }); +} diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index 3421b86ca..bbc0941cc 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -17,6 +17,7 @@ import type { ApiPeer, ApiPeerNotifySettings, ApiPhoto, + ApiProfileTab, ApiTopic, ApiUser, ApiUserStatus, @@ -51,10 +52,15 @@ import { buildChatMembers, getPeerKey, } from '../apiBuilders/chats'; -import { buildApiBotVerification, buildApiPhoto } from '../apiBuilders/common'; +import { buildApiPhoto } from '../apiBuilders/common'; import { buildApiMessage, buildMessageDraft } from '../apiBuilders/messages'; -import { buildApiPeerNotifySettings } from '../apiBuilders/misc'; -import { buildApiPeerId, getApiChatIdFromMtpPeer } from '../apiBuilders/peers'; +import { + buildApiBotVerification, + buildApiPeerId, + buildApiPeerNotifySettings, + buildApiProfileTab, + getApiChatIdFromMtpPeer, +} from '../apiBuilders/peers'; import { buildStickerSet } from '../apiBuilders/symbols'; import { buildApiPeerSettings, buildApiUser, buildApiUserStatuses } from '../apiBuilders/users'; import { @@ -66,6 +72,7 @@ import { buildInputChatReactions, buildInputPeer, buildInputPhoto, + buildInputProfileTab, buildInputReplyTo, buildInputSuggestedPost, buildInputUser, @@ -654,6 +661,7 @@ async function getFullChannelInfo( stargiftsCount, stargiftsAvailable, paidMessagesAvailable, + mainTab, } = result.fullChat; if (chatPhoto) { @@ -753,6 +761,7 @@ async function getFullChannelInfo( starGiftCount: stargiftsCount, areStarGiftsAvailable: Boolean(stargiftsAvailable), arePaidMessagesAvailable: paidMessagesAvailable, + mainTab: mainTab && buildApiProfileTab(mainTab), }, chats, userStatusesById: statusesById, @@ -2092,3 +2101,12 @@ export function toggleAutoTranslation({ shouldReturnTrue: true, }); } + +export function setChannelMainProfileTab({ chat, tab }: { chat: ApiChat; tab: ApiProfileTab }) { + return invokeRequest(new GramJs.channels.SetMainProfileTab({ + channel: buildInputChannel(chat.id, chat.accessHash), + tab: buildInputProfileTab(tab), + }), { + shouldReturnTrue: true, + }); +} diff --git a/src/api/gramjs/methods/messages.ts b/src/api/gramjs/methods/messages.ts index 6865023b6..dd3e1aeb4 100644 --- a/src/api/gramjs/methods/messages.ts +++ b/src/api/gramjs/methods/messages.ts @@ -1494,6 +1494,9 @@ export async function searchMessagesInChat({ case 'profilePhoto': filter = new GramJs.InputMessagesFilterChatPhotos(); break; + case 'gif': + filter = new GramJs.InputMessagesFilterGif(); + break; case 'text': default: { filter = new GramJs.InputMessagesFilterEmpty(); diff --git a/src/api/gramjs/methods/settings.ts b/src/api/gramjs/methods/settings.ts index 7ed4b5684..482a8fff4 100644 --- a/src/api/gramjs/methods/settings.ts +++ b/src/api/gramjs/methods/settings.ts @@ -31,9 +31,6 @@ import { buildApiConfig, buildApiCountryList, buildApiLanguage, - buildApiPeerColors, - buildApiPeerNotifySettings, - buildApiPeerProfileColors, buildApiSession, buildApiTimezone, buildApiWallpaper, @@ -41,7 +38,12 @@ import { buildLangStrings, oldBuildLangPack, } from '../apiBuilders/misc'; -import { getApiChatIdFromMtpPeer } from '../apiBuilders/peers'; +import { + buildApiPeerColors, + buildApiPeerNotifySettings, + buildApiPeerProfileColors, + getApiChatIdFromMtpPeer, +} from '../apiBuilders/peers'; import { buildDisallowedGiftsSettings, buildInputChannel, diff --git a/src/api/gramjs/updates/mtpUpdateHandler.ts b/src/api/gramjs/updates/mtpUpdateHandler.ts index 61666135d..4127fa23e 100644 --- a/src/api/gramjs/updates/mtpUpdateHandler.ts +++ b/src/api/gramjs/updates/mtpUpdateHandler.ts @@ -49,12 +49,16 @@ import { buildMessageDraft, } from '../apiBuilders/messages'; import { - buildApiPeerNotifySettings, buildLangStrings, buildPrivacyKey, } from '../apiBuilders/misc'; import { buildApiCurrencyAmount } from '../apiBuilders/payments'; -import { buildApiEmojiStatus, buildApiPeerId, getApiChatIdFromMtpPeer } from '../apiBuilders/peers'; +import { + buildApiEmojiStatus, + buildApiPeerId, + buildApiPeerNotifySettings, + getApiChatIdFromMtpPeer, +} from '../apiBuilders/peers'; import { buildApiPaidReactionPrivacy, buildApiReaction, diff --git a/src/api/types/chats.ts b/src/api/types/chats.ts index 246ca1f99..788b2df7f 100644 --- a/src/api/types/chats.ts +++ b/src/api/types/chats.ts @@ -2,9 +2,17 @@ import type { ApiBotCommand } from './bots'; import type { ApiChatReactions, ApiFormattedText, ApiInputMessageReplyInfo, ApiInputSuggestedPostInfo, ApiPhoto, ApiStickerSet, } from './messages'; -import type { ApiBotVerification, ApiChatInviteImporter, ApiPeerNotifySettings, ApiRestrictionReason } from './misc'; +import type { ApiChatInviteImporter, ApiPeerNotifySettings, ApiRestrictionReason } from './misc'; import type { - ApiEmojiStatusType, ApiFakeType, ApiUser, ApiUsername, + ApiBotVerification, + ApiEmojiStatusType, + ApiFakeType, + ApiPeerColor, + ApiProfileTab, + ApiSendAsPeerId, +} from './peers'; +import type { + ApiUser, ApiUsername, } from './users'; type ApiChatType = ( @@ -156,6 +164,7 @@ export interface ApiChatFullInfo { boostsApplied?: number; boostsToUnrestrict?: number; botVerification?: ApiBotVerification; + mainTab?: ApiProfileTab; } export interface ApiChatMember { @@ -235,23 +244,6 @@ export interface ApiChatFolder { hasMyInvites?: true; } -export interface ApiPeerSettings { - isAutoArchived?: boolean; - canReportSpam?: boolean; - canAddContact?: boolean; - canBlockContact?: boolean; - chargedPaidMessageStars?: number; - registrationMonth?: string; - phoneCountry?: string; - nameChangeDate?: number; - photoChangeDate?: number; -} - -export interface ApiSendAsPeerId { - id: string; - isPremium?: boolean; -} - export interface ApiTopic { id: number; isClosed?: boolean; @@ -296,11 +288,6 @@ export interface ApiChatlistExportedInvite { peerIds: string[]; } -export interface ApiPeerColor { - color?: number; - backgroundEmojiId?: string; -} - export interface ApiMissingInvitedUser { id: string; isRequiringPremiumToInvite?: boolean; diff --git a/src/api/types/index.ts b/src/api/types/index.ts index f810a25a3..9fe4a0530 100644 --- a/src/api/types/index.ts +++ b/src/api/types/index.ts @@ -12,3 +12,4 @@ export * from './statistics'; export * from './stories'; export * from './business'; export * from './stars'; +export * from './peers'; diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts index 439469361..7f659da96 100644 --- a/src/api/types/messages.ts +++ b/src/api/types/messages.ts @@ -4,12 +4,12 @@ import type { ApiBotInlineResult, ApiWebDocument, } from './bots'; -import type { ApiPeerColor } from './chats'; import type { ApiMessageAction } from './messageActions'; import type { ApiRestrictionReason } from './misc'; import type { ApiLabeledPrice, } from './payments'; +import type { ApiPeerColor } from './peers'; import type { ApiStarGiftUnique, ApiTypeCurrencyAmount } from './stars'; import type { ApiMessageStoryData, ApiStory, ApiWebPageStickerData, ApiWebPageStoryData, @@ -957,7 +957,8 @@ export type ApiTranscription = { transcriptionId: string; }; -export type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'profilePhoto'; +export type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'gif' + | 'profilePhoto'; export type ApiGlobalMessageSearchType = 'text' | 'channels' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'publicPosts'; export type ApiMessageSearchContext = 'all' | 'users' | 'groups' | 'channels'; diff --git a/src/api/types/misc.ts b/src/api/types/misc.ts index 81d2d320c..c30fb3fe9 100644 --- a/src/api/types/misc.ts +++ b/src/api/types/misc.ts @@ -5,6 +5,7 @@ import type { IconName } from '../../types/icons'; import type { RegularLangFnParameters } from '../../util/localization'; import type { ApiDocument, ApiPhoto, ApiReaction } from './messages'; import type { ApiPremiumSection } from './payments'; +import type { ApiBotVerification } from './peers'; import type { ApiStarsSubscriptionPricing } from './stars'; import type { ApiUser } from './users'; @@ -287,26 +288,6 @@ export interface ApiConfig { maxForwardedCount: number; } -export type ApiPeerColorSet = string[]; -export type ApiPeerProfileColorSet = { - paletteColors: string[]; - bgColors: string[]; - storyColors: string[]; -}; - -export type ApiPeerColorOption = { - isHidden?: true; - colors?: T; - darkColors?: T; -}; - -export interface ApiPeerColors { - general: Record>; - generalHash?: number; - profile: Record>; - profileHash?: number; -} - export interface ApiTimezone { id: string; name: string; @@ -352,21 +333,6 @@ export interface ApiCollectibleInfo { url: string; } -export interface ApiPeerPhotos { - fallbackPhoto?: ApiPhoto; - personalPhoto?: ApiPhoto; - photos: ApiPhoto[]; - count: number; - nextOffset?: number; - isLoading?: boolean; -} - -export interface ApiBotVerification { - botId: string; - iconId: string; - description: string; -} - export type ApiLimitType = | 'uploadMaxFileparts' | 'stickersFaved' diff --git a/src/api/types/peers.ts b/src/api/types/peers.ts new file mode 100644 index 000000000..9735dc615 --- /dev/null +++ b/src/api/types/peers.ts @@ -0,0 +1,84 @@ +import type { ApiPhoto } from './messages'; + +export interface ApiPeerPhotos { + fallbackPhoto?: ApiPhoto; + personalPhoto?: ApiPhoto; + photos: ApiPhoto[]; + count: number; + nextOffset?: number; + isLoading?: boolean; +} + +export type ApiFakeType = 'fake' | 'scam'; + +export interface ApiBotVerification { + botId: string; + iconId: string; + description: string; +} + +export type ApiEmojiStatusType = ApiEmojiStatus | ApiEmojiStatusCollectible; + +export interface ApiEmojiStatus { + type: 'regular'; + documentId: string; + until?: number; +} + +export interface ApiEmojiStatusCollectible { + type: 'collectible'; + collectibleId: string; + documentId: string; + title: string; + slug: string; + patternDocumentId: string; + centerColor: string; + edgeColor: string; + patternColor: string; + textColor: string; + until?: number; +} + +export interface ApiPeerSettings { + isAutoArchived?: boolean; + canReportSpam?: boolean; + canAddContact?: boolean; + canBlockContact?: boolean; + chargedPaidMessageStars?: number; + registrationMonth?: string; + phoneCountry?: string; + nameChangeDate?: number; + photoChangeDate?: number; +} + +export interface ApiSendAsPeerId { + id: string; + isPremium?: boolean; +} + +export interface ApiPeerColor { + color?: number; + backgroundEmojiId?: string; +} + +export type ApiPeerColorSet = string[]; +export type ApiPeerProfileColorSet = { + paletteColors: string[]; + bgColors: string[]; + storyColors: string[]; +}; + +export type ApiPeerColorOption = { + isHidden?: true; + colors?: T; + darkColors?: T; +}; + +export interface ApiPeerColors { + general: Record>; + generalHash?: number; + profile: Record>; + profileHash?: number; +} + +export type ApiProfileTab = 'stories' | 'gifts' | 'media' | 'documents' | 'audio' | 'voice' | 'links' | 'gif'; diff --git a/src/api/types/updates.ts b/src/api/types/updates.ts index e999465eb..980dc2144 100644 --- a/src/api/types/updates.ts +++ b/src/api/types/updates.ts @@ -18,7 +18,6 @@ import type { ApiChatFullInfo, ApiChatMember, ApiDraft, - ApiPeerSettings, ApiTypingStatus, } from './chats'; import type { @@ -43,11 +42,12 @@ import type { ApiPeerNotifySettings, ApiSessionData, } from './misc'; +import type { ApiEmojiStatusType, ApiPeerSettings } from './peers'; import type { ApiPrivacyKey, LangPackStringValue, PrivacyVisibility } from './settings'; import type { ApiTypeCurrencyAmount } from './stars'; import type { ApiStealthMode, ApiStory, ApiStorySkipped } from './stories'; import type { - ApiEmojiStatusType, ApiUser, ApiUserFullInfo, ApiUserStatus, + ApiUser, ApiUserFullInfo, ApiUserStatus, } from './users'; export type ApiUpdateReady = { diff --git a/src/api/types/users.ts b/src/api/types/users.ts index 885b736a5..3811032da 100644 --- a/src/api/types/users.ts +++ b/src/api/types/users.ts @@ -1,9 +1,15 @@ import type { API_CHAT_TYPES } from '../../config'; import type { ApiBotInfo } from './bots'; import type { ApiBusinessIntro, ApiBusinessLocation, ApiBusinessWorkHours } from './business'; -import type { ApiPeerColor, ApiPeerSettings } from './chats'; import type { ApiDocument, ApiPhoto } from './messages'; -import type { ApiBotVerification } from './misc'; +import type { + ApiBotVerification, + ApiEmojiStatusType, + ApiFakeType, + ApiPeerColor, + ApiPeerSettings, + ApiProfileTab, +} from './peers'; import type { ApiSavedStarGift, ApiStarsRating } from './stars'; export interface ApiUser { @@ -75,10 +81,9 @@ export interface ApiUserFullInfo { botVerification?: ApiBotVerification; paidMessagesStars?: number; settings?: ApiPeerSettings; + mainTab?: ApiProfileTab; } -export type ApiFakeType = 'fake' | 'scam'; - export type ApiUserType = 'userTypeBot' | 'userTypeRegular' | 'userTypeDeleted' | 'userTypeUnknown'; export interface ApiUserStatus { @@ -136,28 +141,6 @@ export interface ApiAttachBotIcon { document: ApiDocument; } -export type ApiEmojiStatusType = ApiEmojiStatus | ApiEmojiStatusCollectible; - -export interface ApiEmojiStatus { - type: 'regular'; - documentId: string; - until?: number; -} - -export interface ApiEmojiStatusCollectible { - type: 'collectible'; - collectibleId: string; - documentId: string; - title: string; - slug: string; - patternDocumentId: string; - centerColor: string; - edgeColor: string; - patternColor: string; - textColor: string; - until?: number; -} - export interface ApiBirthday { day: number; month: number; diff --git a/src/assets/font-icons/group-filled.svg b/src/assets/font-icons/group-filled.svg index a5e34eca2..e9909b8ae 100644 --- a/src/assets/font-icons/group-filled.svg +++ b/src/assets/font-icons/group-filled.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/src/assets/font-icons/one-filled.svg b/src/assets/font-icons/one-filled.svg index 88076a85b..b388b19d7 100644 --- a/src/assets/font-icons/one-filled.svg +++ b/src/assets/font-icons/one-filled.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/localization/fallback.strings b/src/assets/localization/fallback.strings index aec7e6233..bc0be526b 100644 --- a/src/assets/localization/fallback.strings +++ b/src/assets/localization/fallback.strings @@ -1434,6 +1434,8 @@ "ProfileBirthdayValueYear" = "{date} ({age} years old)"; "ProfileBirthdayTodayValue" = "🎂 {date}"; "ProfileBirthdayTodayValueYear" = "🎂 {date} ({age} years old)"; +"ProfileMenuSetMainTab" = "Set as Main Tab"; +"ProfileItemSubscribers" = "Subscribers"; "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}"; @@ -1710,6 +1712,7 @@ "ProfileTabLinks" = "Links"; "ProfileTabMusic" = "Music"; "ProfileTabVoice" = "Voice"; +"ProfileTabGifs" = "GIF"; "ProfileTabSharedGroups" = "Groups"; "ProfileTabSimilarChannels" = "Similar Channels"; "ProfileTabSimilarBots" = "Similar Bots"; diff --git a/src/components/common/AnimatedTabList.tsx b/src/components/common/AnimatedTabList.tsx index d1833cd7a..283b3f751 100644 --- a/src/components/common/AnimatedTabList.tsx +++ b/src/components/common/AnimatedTabList.tsx @@ -3,6 +3,7 @@ import { memo, useEffect, useRef, useState } from '../../lib/teact/teact'; import type { ApiSticker } from '../../api/types'; import type { AnimationLevel } from '../../types'; +import { ANIMATION_LEVEL_MIN } from '../../config'; import buildClassName from '../../util/buildClassName'; import useHorizontalScroll from '../../hooks/useHorizontalScroll'; @@ -38,7 +39,7 @@ const AnimatedTabList = ({ const clipPathContainerRef = useRef(); const selectedIndex = items.findIndex((item) => item.id === selectedItemId) || 0; const [clipPath, setClipPath] = useState(''); - const shouldAnimate = animationLevel > 0; + const shouldAnimate = animationLevel > ANIMATION_LEVEL_MIN; useHorizontalScroll(containerRef, !items.length, true); diff --git a/src/components/common/Media.tsx b/src/components/common/Media.tsx index 3e98e002b..6d56b30d9 100644 --- a/src/components/common/Media.tsx +++ b/src/components/common/Media.tsx @@ -1,4 +1,3 @@ -import type { FC } from '../../lib/teact/teact'; import { memo, useRef } from '../../lib/teact/teact'; import type { ApiMessage } from '../../api/types'; @@ -8,7 +7,9 @@ import { getMessageHtmlId, getMessageIsSpoiler, getMessageVideo, + getVideoMediaHash, } from '../../global/helpers'; +import { IS_TOUCH_ENV } from '../../util/browser/windowEnvironment'; import buildClassName from '../../util/buildClassName'; import { formatMediaDuration } from '../../util/dates/dateFormat'; import stopEvent from '../../util/stopEvent'; @@ -21,6 +22,7 @@ import useLastCallback from '../../hooks/useLastCallback'; import useMedia from '../../hooks/useMedia'; import useMediaTransitionDeprecated from '../../hooks/useMediaTransitionDeprecated'; +import OptimizedVideo from '../ui/OptimizedVideo'; import MediaSpoiler from './MediaSpoiler'; import './Media.scss'; @@ -29,26 +31,32 @@ type OwnProps = { message: ApiMessage; idPrefix?: string; isProtected?: boolean; + canAutoPlay?: boolean; observeIntersection?: ObserveFn; onClick?: (messageId: number, chatId: string) => void; }; -const Media: FC = ({ +const Media = ({ message, idPrefix = 'shared-media', isProtected, + canAutoPlay, observeIntersection, onClick, -}) => { +}: OwnProps) => { const ref = useRef(); const isIntersecting = useIsIntersecting(ref, observeIntersection); + const [isHovering, markMouseOver, markMouseOut] = useFlag(); + const thumbDataUri = useThumbnail(message); const mediaHash = useMessageMediaHash(message, 'pictogram'); const mediaBlobUrl = useMedia(mediaHash, !isIntersecting); const transitionClassNames = useMediaTransitionDeprecated(mediaBlobUrl); const video = getMessageVideo(message); + const fullGiftHash = video?.isGif ? getVideoMediaHash(video, 'full') : undefined; + const fullGifBlobUrl = useMedia(fullGiftHash, !isIntersecting); const hasSpoiler = getMessageIsSpoiler(message); const [isSpoilerShown, , hideSpoiler] = useFlag(hasSpoiler); @@ -64,6 +72,8 @@ const Media: FC = ({ id={`${idPrefix}${getMessageHtmlId(message.id)}`} className="Media scroll-item" onClick={onClick ? handleClick : undefined} + onMouseOver={!IS_TOUCH_ENV ? markMouseOver : undefined} + onMouseOut={!IS_TOUCH_ENV ? markMouseOut : undefined} > = ({ decoding="async" onContextMenu={isProtected ? stopEvent : undefined} /> - + {fullGifBlobUrl ? ( + + ) : ( + + )} {hasSpoiler && ( = ({ +const ChatExtra = ({ chatOrUserId, user, chat, @@ -124,7 +125,8 @@ const ChatExtra: FC = ({ className, style, isInSettings, -}) => { + canViewSubscribers, +}: OwnProps & StateProps) => { const { showNotification, updateChatMutedState, @@ -136,6 +138,7 @@ const ChatExtra: FC = ({ requestMainWebView, toggleUserEmojiStatusPermission, toggleUserLocationPermission, + requestNextManagementScreen, } = getActions(); const { @@ -261,6 +264,10 @@ const ChatExtra: FC = ({ copy(formatUsername(username.username, isChat), oldLang(isChat ? 'Link' : 'Username')); }); + const handleOpenSubscribers = useLastCallback(() => { + requestNextManagementScreen({ screen: ManagementScreens.ChannelSubscribers }); + }); + const handleOpenApp = useLastCallback(() => { const botId = user?.id; if (!botId) { @@ -476,6 +483,12 @@ const ChatExtra: FC = ({ /> )} + {canViewSubscribers && ( + +
{lang('ProfileItemSubscribers')}
+ {lang.number(chat?.membersCount || 0)} +
+ )} {botVerification && (
( const chatInviteLink = chatFullInfo?.inviteLink; const description = userFullInfo?.bio || chatFullInfo?.about; + const canViewSubscribers = chat && isChatChannel(chat) && isChatAdmin(chat); const canInviteUsers = chat && !user && ( (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers')) || getHasAdminRight(chat, 'inviteUsers') @@ -542,6 +556,7 @@ export default memo(withGlobal( hasMainMiniApp, isBotCanManageEmojiStatus: userFullInfo?.isBotCanManageEmojiStatus, botVerification, + canViewSubscribers, }; }, )(ChatExtra)); diff --git a/src/components/mediaViewer/MediaViewer.tsx b/src/components/mediaViewer/MediaViewer.tsx index f1dbff135..9f3c8bc2d 100644 --- a/src/components/mediaViewer/MediaViewer.tsx +++ b/src/components/mediaViewer/MediaViewer.tsx @@ -18,7 +18,8 @@ import { type MediaViewerMedia, MediaViewerOrigin, type ThreadId } from '../../t import { ANIMATION_END_DELAY } from '../../config'; import { requestMutation } from '../../lib/fasterdom/fasterdom'; import { - getChatMediaMessageIds, getMessagePaidMedia, isChatAdmin, + getMessageContentIds, + getMessagePaidMedia, isChatAdmin, } from '../../global/helpers'; import { selectChatMessage, @@ -156,7 +157,7 @@ const MediaViewer = ({ bestData, dimensions, isGif, - isFromSharedMedia, + contentType, } = useMediaProps({ media, isAvatar: Boolean(avatarOwner), origin, delay: isGhostAnimation && ANIMATION_DURATION, }); @@ -173,8 +174,8 @@ const MediaViewer = ({ const messageMediaIds = useMemo(() => { return withDynamicLoading ? collectedMessageIds - : getChatMediaMessageIds(chatMessages || {}, collectedMessageIds || [], isFromSharedMedia); - }, [chatMessages, collectedMessageIds, isFromSharedMedia, withDynamicLoading]); + : getMessageContentIds(chatMessages || {}, collectedMessageIds || [], contentType); + }, [chatMessages, collectedMessageIds, contentType, withDynamicLoading]); if (isOpen && (!prevSenderId || prevSenderId !== senderId || animationKey.current === undefined)) { animationKey.current = isSingle ? 0 : (messageId || mediaIndex); @@ -520,7 +521,7 @@ export default memo(withGlobal( const currentItem = getMediaViewerItem({ avatarOwner, standaloneMedia, profilePhotos, mediaIndex, }); - const viewableMedia = selectViewableMedia(global, currentItem); + const viewableMedia = selectViewableMedia(global, origin, currentItem); return { profilePhotos, @@ -565,6 +566,11 @@ export default memo(withGlobal( } } + const currentItem = getMediaViewerItem({ + message, standaloneMedia, mediaIndex, sponsoredMessage, + }); + const viewableMedia = selectViewableMedia(global, origin, currentItem); + let chatMessages: Record | undefined; if (chatId) { @@ -588,7 +594,8 @@ export default memo(withGlobal( collectedMessageIds = foundIds; } else if (origin === MediaViewerOrigin.SharedMedia) { const currentSearch = selectCurrentSharedMediaSearch(global); - const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {}; + const resultsByType = currentSearch?.resultsByType; + const { foundIds } = (viewableMedia?.isGif ? resultsByType?.gif : resultsByType?.media) || {}; collectedMessageIds = foundIds; } else if (isOriginInline || isOriginAlbum) { const outlyingList = selectOutlyingListByMessageId(global, chatId, threadId, messageId); @@ -596,11 +603,6 @@ export default memo(withGlobal( } } - const currentItem = getMediaViewerItem({ - message, standaloneMedia, mediaIndex, sponsoredMessage, - }); - const viewableMedia = selectViewableMedia(global, currentItem); - return { chatId, threadId, diff --git a/src/components/mediaViewer/MediaViewerActions.tsx b/src/components/mediaViewer/MediaViewerActions.tsx index e6e6d4906..1929bd33e 100644 --- a/src/components/mediaViewer/MediaViewerActions.tsx +++ b/src/components/mediaViewer/MediaViewerActions.tsx @@ -413,7 +413,7 @@ export default memo(withGlobal( const canDelete = canDeleteMessage || canDeleteAvatar; const canUpdate = canUpdateMedia && Boolean(avatarPhoto) && !isCurrentAvatar; const messageListType = currentMessageList?.type; - const viewableMedia = selectViewableMedia(global, item); + const viewableMedia = selectViewableMedia(global, origin, item); return { activeDownloads, diff --git a/src/components/mediaViewer/MediaViewerContent.tsx b/src/components/mediaViewer/MediaViewerContent.tsx index abccc3ad7..70d5bc6c4 100644 --- a/src/components/mediaViewer/MediaViewerContent.tsx +++ b/src/components/mediaViewer/MediaViewerContent.tsx @@ -257,7 +257,7 @@ export default memo(withGlobal( const message = item.type === 'message' ? item.message : undefined; const sponsoredMessage = item.type === 'sponsoredMessage' ? item.message : undefined; const textMessage = message || sponsoredMessage; - const viewableMedia = selectViewableMedia(global, item); + const viewableMedia = selectViewableMedia(global, origin, item); const maxTimestamp = message && selectMessageTimestampableDuration(global, message, true); diff --git a/src/components/mediaViewer/helpers/getViewableMedia.ts b/src/components/mediaViewer/helpers/getViewableMedia.ts index 79765ab51..ac4fc26b8 100644 --- a/src/components/mediaViewer/helpers/getViewableMedia.ts +++ b/src/components/mediaViewer/helpers/getViewableMedia.ts @@ -2,7 +2,7 @@ import type { ApiMessage, ApiPeer, ApiPeerPhotos, ApiSponsoredMessage, } from '../../../api/types'; import type { GlobalState } from '../../../global/types'; -import type { MediaViewerMedia } from '../../../types'; +import { type MediaViewerMedia, MediaViewerOrigin } from '../../../types'; import { getMessageContent, isDocumentPhoto, isDocumentVideo } from '../../../global/helpers'; import { selectWebPageFromMessage } from '../../../global/selectors'; @@ -28,6 +28,7 @@ export type MediaViewerItem = { export type ViewableMedia = { media: MediaViewerMedia; + isGif?: boolean; isSingle?: boolean; }; @@ -77,12 +78,16 @@ export function getMediaViewerItem({ return undefined; } -export default function selectViewableMedia(global: GlobalState, params?: MediaViewerItem): ViewableMedia | undefined { +export default function selectViewableMedia( + global: GlobalState, origin?: MediaViewerOrigin, params?: MediaViewerItem, +): ViewableMedia | undefined { if (!params) return undefined; if (params.type === 'standalone') { + const media = params.media[params.mediaIndex]; return { - media: params.media[params.mediaIndex], + media, + isGif: media.mediaType === 'video' && media.isGif, isSingle: params.media.length === 1, }; } @@ -134,6 +139,7 @@ export default function selectViewableMedia(global: GlobalState, params?: MediaV const { photo: extendedPhoto, video: extendedVideo } = extendedMedia; return { media: (extendedPhoto || extendedVideo)!, + isGif: extendedVideo?.isGif, }; } } @@ -143,7 +149,8 @@ export default function selectViewableMedia(global: GlobalState, params?: MediaV if (media) { return { media, - isSingle: video?.isGif, + isGif: video?.isGif, + isSingle: video?.isGif && origin !== MediaViewerOrigin.SharedMedia, }; } diff --git a/src/components/mediaViewer/hooks/useMediaProps.ts b/src/components/mediaViewer/hooks/useMediaProps.ts index 9aac2b976..158c046af 100644 --- a/src/components/mediaViewer/hooks/useMediaProps.ts +++ b/src/components/mediaViewer/hooks/useMediaProps.ts @@ -1,7 +1,7 @@ import { useMemo } from '../../../lib/teact/teact'; import type { MediaViewerMedia } from '../../../types'; -import { ApiMediaFormat } from '../../../api/types'; +import { ApiMediaFormat, type ApiMessageSearchType } from '../../../api/types'; import { MediaViewerOrigin } from '../../../types'; import { @@ -46,6 +46,8 @@ export const useMediaProps = ({ const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia; const isFromSearch = origin === MediaViewerOrigin.SearchResult; + const contentType: ApiMessageSearchType = isGif ? 'gif' : 'media'; + const getMediaOrAvatarHash = useMemo(() => (isFull?: boolean) => { if (!media) return undefined; @@ -133,7 +135,7 @@ export const useMediaProps = ({ bestImageData, bestData, dimensions, - isFromSharedMedia, + contentType, isVideoAvatar, isLocal, loadProgress, diff --git a/src/components/right/Profile.scss b/src/components/right/Profile.scss index 5857a1b22..e14b4feb5 100644 --- a/src/components/right/Profile.scss +++ b/src/components/right/Profile.scss @@ -1,6 +1,8 @@ @use '../../styles/mixins'; .Profile { + scrollbar-gutter: stable; + overflow-x: hidden; overflow-y: scroll; display: flex; @@ -134,6 +136,7 @@ &.storiesArchive-list, &.stories-list, &.media-list, + &.gif-list, &.previewMedia-list, &.gifts-list { display: grid; diff --git a/src/components/right/Profile.tsx b/src/components/right/Profile.tsx index e1b4ed879..cb23d6a75 100644 --- a/src/components/right/Profile.tsx +++ b/src/components/right/Profile.tsx @@ -6,6 +6,7 @@ import type { ApiChat, ApiChatMember, ApiMessage, + ApiProfileTab, ApiSavedStarGift, ApiStarGiftCollection, ApiStoryAlbum, @@ -29,7 +30,6 @@ import { getIsDownloading, getIsSavedDialog, getMessageDocument, - isChatAdmin, isChatChannel, isChatGroup, isUserBot, @@ -38,6 +38,7 @@ import { import { getSavedGiftKey } from '../../global/helpers/stars'; import { selectActiveDownloads, + selectCanUpdateMainTab, selectChat, selectChatFullInfo, selectChatMessages, @@ -47,6 +48,7 @@ import { selectIsRightColumnShown, selectMonoforumChannel, selectPeerStories, + selectPerformanceSettingsValue, selectSimilarBotsIds, selectSimilarChannelIds, selectTabState, @@ -86,6 +88,7 @@ import useLang from '../../hooks/useLang'; import useLastCallback from '../../hooks/useLastCallback'; import useOldLang from '../../hooks/useOldLang'; import useSyncEffect from '../../hooks/useSyncEffect'; +import useSyncEffectWithPrevDeps from '../../hooks/useSyncEffectWithPrevDeps.ts'; import useAsyncRendering from './hooks/useAsyncRendering'; import useProfileState from './hooks/useProfileState'; import useProfileViewportIds from './hooks/useProfileViewportIds'; @@ -112,7 +115,7 @@ import InfiniteScroll from '../ui/InfiniteScroll'; import Link from '../ui/Link'; import ListItem, { type MenuItemContextAction } from '../ui/ListItem'; import Spinner from '../ui/Spinner'; -import TabList from '../ui/TabList'; +import TabList, { type TabWithProperties } from '../ui/TabList'; import Transition from '../ui/Transition'; import DeleteMemberModal from './DeleteMemberModal'; import StarGiftCollectionList from './gifts/StarGiftCollectionList'; @@ -179,24 +182,40 @@ type StateProps = { isSavedMessages?: boolean; isSynced?: boolean; hasAvatar?: boolean; + mainTab?: ApiProfileTab; + canUpdateMainTab?: boolean; + canAutoPlayGifs?: boolean; }; -type TabProps = { +type LocalTabProps = { type: ProfileTabType; key: RegularLangKey; }; -const TABS: TabProps[] = [ +type TabWithPropertiesAndType = TabWithProperties & { + type: ProfileTabType; +}; + +const TABS: LocalTabProps[] = [ { type: 'media', key: 'ProfileTabMedia' }, { type: 'documents', key: 'ProfileTabFiles' }, { type: 'links', key: 'ProfileTabLinks' }, { type: 'audio', key: 'ProfileTabMusic' }, + { type: 'gif', key: 'ProfileTabGifs' }, ]; const HIDDEN_RENDER_DELAY = 1000; const INTERSECTION_THROTTLE = 500; -const SHARED_MEDIA_TYPES = new Set(['media', 'documents', 'links', 'audio', 'voice']); +const VALID_CHANNEL_MAIN_TAB_TYPES = new Set>([ + 'stories', 'gifts', 'media', 'documents', 'audio', 'voice', 'links', 'gif', +]); +const VALID_USER_MAIN_TAB_TYPES = new Set>([ + 'stories', 'gifts', +]); +const SHARED_MEDIA_TYPES = new Set>([ + 'media', 'documents', 'links', 'audio', 'voice', 'gif', +]); const Profile = ({ chatId, @@ -252,6 +271,9 @@ const Profile = ({ isSavedMessages, isSynced, hasAvatar, + mainTab, + canUpdateMainTab, + canAutoPlayGifs, onProfileStateChange, }: OwnProps & StateProps) => { const { @@ -276,11 +298,14 @@ const Profile = ({ loadStoryAlbums, resetSelectedStoryAlbum, changeProfileTab, + setMainProfileTab, } = getActions(); const containerRef = useRef(); const transitionRef = useRef(); + const shouldSkipTransitionRef = useRef(false); + const oldLang = useOldLang(); const lang = useLang(); @@ -296,8 +321,11 @@ const Profile = ({ const [restoreContentHeightKey, setRestoreContentHeightKey] = useState(0); + const isUser = isUserId(chatId); + const validMainTabTypes = isUser ? VALID_USER_MAIN_TAB_TYPES : VALID_CHANNEL_MAIN_TAB_TYPES; + const tabs = useMemo(() => { - const arr: TabProps[] = []; + const arr: LocalTabProps[] = []; if (isGeneralSavedMessages) { arr.push({ type: 'dialogs', key: 'ProfileTabSavedDialogs' }); } @@ -306,16 +334,16 @@ const Profile = ({ arr.push({ type: 'stories', key: 'ProfileTabStories' }); } - if (hasStoriesTab && isOwnProfile) { - arr.push({ type: 'storiesArchive', key: 'ProfileTabStoriesArchive' }); - } - if (hasGiftsTab) { arr.push({ type: 'gifts', key: 'ProfileTabGifts' }); } + if (hasStoriesTab && isOwnProfile) { + arr.push({ type: 'storiesArchive', key: 'ProfileTabStoriesArchive' }); + } + if (hasMembersTab && !isOwnProfile) { - arr.push({ type: 'members', key: isChannel ? 'ProfileTabSubscribers' : 'ProfileTabMembers' }); + arr.push({ type: 'members', key: 'ProfileTabMembers' }); } if (hasPreviewMediaTab && !isOwnProfile) { @@ -349,13 +377,35 @@ const Profile = ({ arr.push(TABS[0]); } - return arr.map((tab) => ({ - type: tab.type, - title: lang(tab.key), - })); + if (mainTab) { + const mainTabIndex = arr.findIndex((tab) => tab.type === mainTab); + if (mainTabIndex !== -1) { + const newFirstTab = arr[mainTabIndex]; + arr.splice(mainTabIndex, 1); + arr.unshift(newFirstTab); + } + } + + return arr.map((tab) => { + const contextActions: MenuItemContextAction[] | undefined = canUpdateMainTab && mainTab !== tab.type + && validMainTabTypes.has(tab.type) ? [{ + title: lang('ProfileMenuSetMainTab'), + icon: 'replace', + handler: () => { + setMainProfileTab({ chatId, tab: tab.type as ApiProfileTab }); + }, + }] : undefined; + + return { + type: tab.type, + title: lang(tab.key), + contextActions, + } satisfies TabWithPropertiesAndType; + }); }, [ isGeneralSavedMessages, hasStoriesTab, hasGiftsTab, hasMembersTab, hasPreviewMediaTab, isTopicInfo, hasCommonChatsTab, isChannel, isBot, similarChannels?.length, similarBots?.length, lang, isOwnProfile, + mainTab, chatId, canUpdateMainTab, validMainTabTypes, ]); const [allowAutoScrollToTabs, startAutoScrollToTabsIfNeeded, stopAutoScrollToTabs] = useFlag(false); @@ -377,6 +427,11 @@ const Profile = ({ setActiveTab(tabs[0].type); // Set default tab }, [isClosed, profileTab, tabs]); + useEffectWithPrevDeps(([prevMainTab]) => { + if (prevMainTab || !mainTab) return; + setActiveTab(mainTab); // Only focus when loading full info + }, [mainTab]); + const handleSwitchTab = useCallback((index: number) => { startAutoScrollToTabsIfNeeded(); setActiveTab(tabs[index].type); @@ -430,6 +485,17 @@ const Profile = ({ return index === -1 ? 0 : index; }, [profileTab, tabs]); + // Reset skip transition flag from previous render + if (shouldSkipTransitionRef.current) { + shouldSkipTransitionRef.current = false; + } + + useSyncEffectWithPrevDeps(([prevProfileTab, prevActiveTabIndex]) => { + if (prevProfileTab === profileTab && prevActiveTabIndex !== activeTabIndex) { + shouldSkipTransitionRef.current = true; + } + }, [profileTab, activeTabIndex]); + const tabType = tabs[activeTabIndex].type; const handleLoadCommonChats = useCallback(() => { loadCommonChats({ userId: chatId }); @@ -498,10 +564,7 @@ const Profile = ({ const shouldRenderProfileInfo = !noProfileInfo && !isSavedMessages; - const isFirstTab = (isGeneralSavedMessages && resultType === 'dialogs') - || (hasStoriesTab && resultType === 'stories') - || resultType === 'members' - || (!hasMembersTab && resultType === 'media'); + const isFirstTab = tabs[0].type === resultType; const activeKey = tabs.findIndex(({ type }) => type === resultType); const [isGiftCollectionsShowed, markGiftCollectionsShowed, unmarkGiftCollectionsShowed] = useFlag(false); @@ -561,7 +624,7 @@ const Profile = ({ handleStopAutoScrollToTabs, }); - const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef); + useTransitionFixes(containerRef); const [cacheBuster, resetCacheBuster] = useCacheBuster(); @@ -570,11 +633,6 @@ const Profile = ({ throttleMs: INTERSECTION_THROTTLE, }); - const handleTransitionStop = useLastCallback(() => { - releaseTransitionFix(); - resetCacheBuster(); - }); - const handleNewMemberDialogOpen = useLastCallback(() => { setNewChatMembersDialogState({ newChatMembersProgress: NewChatMembersProgress.InProgress }); }); @@ -613,16 +671,6 @@ const Profile = ({ setDeletingUserId(undefined); }); - useEffectWithPrevDeps(([prevHasMemberTabs]) => { - if (prevHasMemberTabs === undefined || activeTabIndex === 0 || prevHasMemberTabs === hasMembersTab) { - return; - } - - const newActiveTab = Math.min(activeTabIndex + (hasMembersTab ? 1 : -1), tabs.length - 1); - - setActiveTab(tabs[newActiveTab].type); - }, [hasMembersTab, activeTabIndex, tabs]); - const handleResetGiftsFilter = useLastCallback(() => { resetGiftProfileFilter({ peerId: chatId }); }); @@ -800,6 +848,9 @@ const Profile = ({ case 'storiesArchive': text = oldLang('StoryList.ArchivedEmptyState.Title'); break; + case 'gif': + text = oldLang('lng_media_gif_empty'); + break; default: text = oldLang('SharedMedia.EmptyTitle'); } @@ -825,15 +876,16 @@ const Profile = ({ shouldShowContentPanel && 'showContentPanel', noTransition && 'noTransition', )} - dir={oldLang.isRtl && resultType === 'media' ? 'rtl' : undefined} + dir={lang.isRtl && (resultType === 'media' || resultType === 'gif') ? 'rtl' : undefined} teactFastList > - {resultType === 'media' ? ( + {resultType === 'media' || resultType === 'gif' ? ( (viewportIds as number[]).map((id) => messagesById[id] && ( @@ -988,17 +1040,10 @@ const Profile = ({ onClick={() => openChat({ id: userId })} > - {isUserId(userId) ? ( - - ) : ( - - )} + ))} {!isCurrentUserPremium && ( @@ -1081,7 +1126,7 @@ const Profile = ({ .Transition_slide-active > .Transition > .Transition_slide-active > .content' @@ -1218,8 +1263,7 @@ export default memo(withGlobal( const isGroup = chat && isChatGroup(chat); const isChannel = chat && isChatChannel(chat); const isBot = user && isUserBot(user); - const hasMembersTab = !isTopicInfo && !isSavedDialog - && (isGroup || (isChannel && isChatAdmin(chat))) && !chat?.isMonoforum; + const hasMembersTab = !isTopicInfo && !isSavedDialog && isGroup && !chat?.isMonoforum; const members = chatFullInfo?.members; const adminMembersById = chatFullInfo?.adminMembersById; const areMembersHidden = hasMembersTab && chat @@ -1265,6 +1309,8 @@ export default memo(withGlobal( const isRestricted = chat && selectIsChatRestricted(global, chat.id); const hasAvatar = Boolean(peer?.avatarPhotoId); + const canAutoPlayGifs = selectPerformanceSettingsValue(global, 'autoplayGifs'); + return { theme: selectTheme(global), isChannel, @@ -1315,6 +1361,9 @@ export default memo(withGlobal( commonChatIds: commonChats?.ids, monoforumChannel, hasAvatar, + mainTab: peerFullInfo?.mainTab, + canUpdateMainTab: selectCanUpdateMainTab(global, chatId), + canAutoPlayGifs, }; }, )(Profile)); diff --git a/src/components/right/hooks/useProfileViewportIds.ts b/src/components/right/hooks/useProfileViewportIds.ts index f2dd55093..92239b8ef 100644 --- a/src/components/right/hooks/useProfileViewportIds.ts +++ b/src/components/right/hooks/useProfileViewportIds.ts @@ -89,6 +89,10 @@ export default function useProfileViewportIds({ 'media', resultType, searchMessages, chatMessages, foundIds, threadId, ); + const [gifViewportIds, getMoreGifs, noProfileInfoForGifs] = useInfiniteScrollForSharedMedia( + 'gif', resultType, searchMessages, chatMessages, foundIds, threadId, + ); + const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia( 'documents', resultType, searchMessages, chatMessages, foundIds, threadId, ); @@ -153,6 +157,11 @@ export default function useProfileViewportIds({ getMore = getMoreMedia; noProfileInfo = noProfileInfoForMedia; break; + case 'gif': + viewportIds = gifViewportIds; + getMore = getMoreGifs; + noProfileInfo = noProfileInfoForGifs; + break; case 'documents': viewportIds = documentViewportIds; getMore = getMoreDocuments; diff --git a/src/components/right/hooks/useTransitionFixes.ts b/src/components/right/hooks/useTransitionFixes.ts index b514001e4..7748265ff 100644 --- a/src/components/right/hooks/useTransitionFixes.ts +++ b/src/components/right/hooks/useTransitionFixes.ts @@ -1,9 +1,7 @@ import type { ElementRef } from '../../../lib/teact/teact'; import { useEffect } from '../../../lib/teact/teact'; -import { requestMeasure, requestMutation } from '../../../lib/fasterdom/fasterdom'; - -import useLastCallback from '../../../hooks/useLastCallback'; +import { requestMutation } from '../../../lib/fasterdom/fasterdom'; export default function useTransitionFixes( containerRef: ElementRef, @@ -32,28 +30,4 @@ export default function useTransitionFixes( window.removeEventListener('resize', setMinHeight, false); }; }, [containerRef, transitionElSelector]); - - // Workaround for scrollable content flickering during animation. - const applyTransitionFix = useLastCallback(() => { - // This callback is called from `Transition.onStart` which is "mutate" phase - requestMeasure(() => { - const container = containerRef.current!; - if (container.style.overflowY === 'hidden') return; - - const scrollBarWidth = container.offsetWidth - container.clientWidth; - - requestMutation(() => { - container.style.overflowY = 'hidden'; - container.style.paddingRight = `${scrollBarWidth}px`; - }); - }); - }); - - const releaseTransitionFix = useLastCallback(() => { - const container = containerRef.current!; - container.style.overflowY = 'scroll'; - container.style.paddingRight = '0'; - }); - - return { applyTransitionFix, releaseTransitionFix }; } diff --git a/src/components/ui/Tab.tsx b/src/components/ui/Tab.tsx index 778b78995..0079f2252 100644 --- a/src/components/ui/Tab.tsx +++ b/src/components/ui/Tab.tsx @@ -1,5 +1,4 @@ -import type { FC, TeactNode } from '../../lib/teact/teact'; -import type React from '../../lib/teact/teact'; +import type { TeactNode } from '../../lib/teact/teact'; import { useEffect, useLayoutEffect, useRef } from '../../lib/teact/teact'; import type { MenuItemContextAction } from './ListItem'; @@ -40,7 +39,7 @@ const classNames = { badgeActive: 'Tab__badge--active', }; -const Tab: FC = ({ +const Tab = ({ className, title, isActive, @@ -48,11 +47,11 @@ const Tab: FC = ({ badgeCount, isBadgeActive, previousActiveTab, - onClick, - clickArg, contextActions, contextRootElementSelector, -}) => { + clickArg, + onClick, +}: OwnProps) => { const tabRef = useRef(); useLayoutEffect(() => { diff --git a/src/components/ui/TabList.tsx b/src/components/ui/TabList.tsx index b44e91698..8dc939ab2 100644 --- a/src/components/ui/TabList.tsx +++ b/src/components/ui/TabList.tsx @@ -1,4 +1,4 @@ -import type { FC, TeactNode } from '../../lib/teact/teact'; +import type { TeactNode } from '../../lib/teact/teact'; import { memo, useEffect, useRef } from '../../lib/teact/teact'; import type { MenuItemContextAction } from './ListItem'; @@ -37,10 +37,14 @@ const TAB_SCROLL_THRESHOLD_PX = 16; // Should match duration from `--slide-transition` CSS variable const SCROLL_DURATION = IS_IOS ? 450 : IS_ANDROID ? 400 : 300; -const TabList: FC = ({ - tabs, activeTab, onSwitchTab, - contextRootElementSelector, className, tabClassName, -}) => { +const TabList = ({ + tabs, + activeTab, + className, + tabClassName, + contextRootElementSelector, + onSwitchTab, +}: OwnProps) => { const containerRef = useRef(); const previousActiveTab = usePreviousDeprecated(activeTab); diff --git a/src/global/actions/api/chats.ts b/src/global/actions/api/chats.ts index ab54a6991..345191d15 100644 --- a/src/global/actions/api/chats.ts +++ b/src/global/actions/api/chats.ts @@ -118,6 +118,7 @@ import { selectIsCurrentUserFrozen, selectLastServiceNotification, selectPeer, + selectPeerFullInfo, selectSimilarChannelIds, selectStickerSet, selectSupportChat, @@ -3061,6 +3062,32 @@ addActionHandler('toggleAutoTranslation', async (global, actions, payload): Prom setGlobal(global); }); +addActionHandler('setMainProfileTab', async (global, actions, payload): Promise => { + const { chatId, tab } = payload; + const chat = selectChat(global, chatId); + if (!chat) return; + + const peerFullInfo = selectPeerFullInfo(global, chatId); + const oldMainTab = peerFullInfo?.mainTab; + if (oldMainTab === tab) return; + + global = updatePeerFullInfo(global, chatId, { mainTab: tab }); + setGlobal(global); + + let result; + if (chatId === global.currentUserId) { + result = await callApi('setAccountMainProfileTab', { tab }); + } else { + result = await callApi('setChannelMainProfileTab', { chat, tab }); + } + + if (!result) { + global = getGlobal(); + global = updatePeerFullInfo(global, chatId, { mainTab: oldMainTab }); + setGlobal(global); + } +}); + addActionHandler('resolveBusinessChatLink', async (global, actions, payload): Promise => { const { slug, tabId = getCurrentTabId() } = payload; const result = await callApi('resolveBusinessChatLink', { slug }); diff --git a/src/global/actions/api/middleSearch.ts b/src/global/actions/api/middleSearch.ts index 470ecc4f5..144e875c5 100644 --- a/src/global/actions/api/middleSearch.ts +++ b/src/global/actions/api/middleSearch.ts @@ -12,7 +12,7 @@ import { getCurrentTabId } from '../../../util/establishMultitabRole'; import { buildCollectionByKey, isInsideSortedArrayRange } from '../../../util/iteratees'; import { getSearchResultKey } from '../../../util/keys/searchResultKey'; import { callApi } from '../../../api/gramjs'; -import { getChatMediaMessageIds, getIsSavedDialog, isSameReaction } from '../../helpers'; +import { getIsSavedDialog, getMessageContentIds, isSameReaction } from '../../helpers'; import { addActionHandler, getGlobal, setGlobal, } from '../../index'; @@ -479,7 +479,7 @@ async function searchChatMedia( const loadingState = calcLoadingState(direction, limit, newFoundIds.length, currentSegment); - const filteredIds = getChatMediaMessageIds(byId, newFoundIds, false); + const filteredIds = getMessageContentIds(byId, newFoundIds, 'inlineMedia'); currentSegment = mergeWithChatMediaSearchSegment( filteredIds, loadingState, diff --git a/src/global/helpers/messageMedia.ts b/src/global/helpers/messageMedia.ts index 1b80d72ba..c73ae45cb 100644 --- a/src/global/helpers/messageMedia.ts +++ b/src/global/helpers/messageMedia.ts @@ -429,12 +429,6 @@ export function hasMediaLocalBlobUrl(media: ApiPhoto | ApiVideo | ApiDocument) { return false; } -export function getChatMediaMessageIds( - messages: Record, listedIds: number[], isFromSharedMedia = false, -) { - return getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia'); -} - export function getPhotoFullDimensions(photo: Pick): ApiDimensions | undefined { return ( photo.sizes.find((size) => size.type === 'w') @@ -488,6 +482,13 @@ export function getMessageContentIds( validator = getMessageDocument; break; + case 'gif': + validator = (message: ApiMessage) => { + const video = getMessageVideo(message); + return video?.isGif; + }; + break; + case 'links': validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message); break; diff --git a/src/global/selectors/peers.ts b/src/global/selectors/peers.ts index 7d3dad997..13edd8746 100644 --- a/src/global/selectors/peers.ts +++ b/src/global/selectors/peers.ts @@ -4,7 +4,7 @@ import type { GlobalState, TabArgs } from '../types'; import { SERVICE_NOTIFICATIONS_USER_ID } from '../../config'; import { isUserId } from '../../util/entities/ids'; import { getCurrentTabId } from '../../util/establishMultitabRole'; -import { isChatAdmin, isDeletedUser } from '../helpers'; +import { getHasAdminRight, isChatAdmin, isChatChannel, isDeletedUser } from '../helpers'; import { selectChat, selectChatFullInfo } from './chats'; import { type ProfileCollectionKey } from './payments'; import { selectTabState } from './tabs'; @@ -74,3 +74,12 @@ export function selectPeerHasProfileBackground(global: T, const peer = selectPeer(global, peerId); return Boolean(peer?.profileColor || peer?.emojiStatus?.type === 'collectible'); } + +export function selectCanUpdateMainTab(global: T, peerId: string) { + if (global.currentUserId === peerId) { + return true; + } + + const chat = selectChat(global, peerId); + return Boolean(chat && isChatChannel(chat) && getHasAdminRight(chat, 'postMessages')); +} diff --git a/src/global/types/actions.ts b/src/global/types/actions.ts index 307a8847b..2339ab50d 100644 --- a/src/global/types/actions.ts +++ b/src/global/types/actions.ts @@ -37,6 +37,7 @@ import type { ApiPreparedInlineMessage, ApiPrivacyKey, ApiPrivacySettings, + ApiProfileTab, ApiReaction, ApiReactionWithPaid, ApiReportReason, @@ -1142,6 +1143,10 @@ export interface ActionPayloads { chatId: string; isEnabled: boolean; } & WithTabId; + setMainProfileTab: { + chatId: string; + tab: ApiProfileTab; + }; updateChat: { chatId: string; diff --git a/src/global/types/tabState.ts b/src/global/types/tabState.ts index a438bbdef..a8861b2ea 100644 --- a/src/global/types/tabState.ts +++ b/src/global/types/tabState.ts @@ -10,6 +10,7 @@ import type { ApiCheckedGiftCode, ApiCollectibleInfo, ApiContact, + ApiEmojiStatusCollectible, ApiError, ApiFormattedText, ApiGeoPoint, @@ -54,7 +55,6 @@ import type { ApiUser, ApiVideo, } from '../../api/types'; -import type { ApiEmojiStatusCollectible } from '../../api/types/users'; import type { FoldersActions } from '../../hooks/reducers/useFoldersReducer'; import type { ReducerAction } from '../../hooks/useReducer'; import type { diff --git a/src/hooks/animations/useViewTransition.ts b/src/hooks/animations/useViewTransition.ts index 5e02ca6ab..9b9cfd8cc 100644 --- a/src/hooks/animations/useViewTransition.ts +++ b/src/hooks/animations/useViewTransition.ts @@ -9,7 +9,7 @@ import { getGlobal } from '../../global'; import type { AnimationLevel } from '../../types'; import type { VTTypes } from '../../util/animations/viewTransitionTypes'; -import { VT_CLASS_NAME, VT_TYPE_CLASS_PREFIX } from '../../config'; +import { ANIMATION_LEVEL_MED, VT_CLASS_NAME, VT_TYPE_CLASS_PREFIX } from '../../config'; import { requestMutation, requestNextMutation } from '../../lib/fasterdom/fasterdom'; import { selectSharedSettings } from '../../global/selectors/sharedState'; import { IS_VIEW_TRANSITION_SUPPORTED } from '../../util/browser/windowEnvironment'; @@ -98,7 +98,7 @@ export function useViewTransition(): ViewTransitionController { function startViewTransition( types: VTTypes, updateCallback?: TransitionFunction, - minimumAnimationLevel: AnimationLevel = 1, + minimumAnimationLevel: AnimationLevel = ANIMATION_LEVEL_MED, ): PromiseLike | void { const global = getGlobal(); const { animationLevel } = selectSharedSettings(global); diff --git a/src/lib/gramjs/tl/apiTl.ts b/src/lib/gramjs/tl/apiTl.ts index 1b98bb515..0b8eeea30 100644 --- a/src/lib/gramjs/tl/apiTl.ts +++ b/src/lib/gramjs/tl/apiTl.ts @@ -1537,6 +1537,7 @@ account.toggleSponsoredMessages#b9d9a38d enabled:Bool = Bool; account.getCollectibleEmojiStatuses#2e7b4543 hash:long = account.EmojiStatuses; account.getPaidMessagesRevenue#19ba4a67 flags:# parent_peer:flags.0?InputPeer user_id:InputUser = account.PaidMessagesRevenue; account.toggleNoPaidMessagesException#fe2eda76 flags:# refund_charged:flags.0?true require_payment:flags.2?true parent_peer:flags.1?InputPeer user_id:InputUser = Bool; +account.setMainProfileTab#5dee78b0 tab:ProfileTab = Bool; users.getUsers#d91a548 id:Vector = Vector; users.getFullUser#b60f5918 id:InputUser = users.UserFull; contacts.getContacts#5dd69e12 hash:long = contacts.Contacts; @@ -1770,6 +1771,7 @@ channels.searchPosts#f2c4f24d flags:# hashtag:flags.0?string query:flags.1?strin channels.updatePaidMessagesPrice#4b12327b flags:# broadcast_messages_allowed:flags.0?true channel:InputChannel send_paid_messages_stars:long = Updates; channels.toggleAutotranslation#167fc0a1 channel:InputChannel enabled:Bool = Updates; channels.checkSearchPostsFlood#22567115 flags:# query:flags.0?string = SearchPostsFlood; +channels.setMainProfileTab#3583fcb1 channel:InputChannel tab:ProfileTab = Bool; bots.setBotInfo#10cf3123 flags:# bot:flags.2?InputUser lang_code:string name:flags.3?string about:flags.0?string description:flags.1?string = Bool; bots.canSendMessage#1359f4e6 bot:InputUser = Bool; bots.allowSendMessage#f132e3ef bot:InputUser = Updates; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index 5e1949382..f9e2d8517 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -66,6 +66,7 @@ "account.getPaidMessagesRevenue", "account.getAccountTTL", "account.setAccountTTL", + "account.setMainProfileTab", "users.getUsers", "users.getFullUser", "contacts.getContacts", @@ -288,6 +289,7 @@ "channels.updatePaidMessagesPrice", "channels.checkSearchPostsFlood", "channels.toggleAutotranslation", + "channels.setMainProfileTab", "bots.getBotRecommendations", "bots.canSendMessage", "bots.allowSendMessage", diff --git a/src/styles/icons.woff b/src/styles/icons.woff index e737216573e22e1c2beb715da7a04b36cd6c6154..6a17863714c29c68015100f63040e0c738a85699 100644 GIT binary patch delta 31645 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 delta 31687 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 literal 31072 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 diff --git a/src/types/index.ts b/src/types/index.ts index d574cb237..61daad7b1 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -394,13 +394,14 @@ export type ProfileTabType = | 'links' | 'audio' | 'voice' + | 'gif' | 'stories' | 'storiesArchive' | 'similarChannels' | 'similarBots' | 'dialogs' | 'gifts'; -export type SharedMediaType = 'media' | 'documents' | 'links' | 'audio' | 'voice'; +export type SharedMediaType = 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'gif'; export type MiddleSearchType = 'chat' | 'myChats' | 'channels'; export type MiddleSearchParams = { requestedQuery?: string; diff --git a/src/types/language.d.ts b/src/types/language.d.ts index 9341ad68e..bf31fb57c 100644 --- a/src/types/language.d.ts +++ b/src/types/language.d.ts @@ -1222,6 +1222,8 @@ export interface LangPair { 'ProfileBotOpenAppInfoLink': undefined; 'ProfileBirthday': undefined; 'ProfileBirthdayToday': undefined; + 'ProfileMenuSetMainTab': undefined; + 'ProfileItemSubscribers': undefined; 'MonetizationInfoTONTitle': undefined; 'AriaSearchOlderResult': undefined; 'AriaSearchNewerResult': undefined; @@ -1395,6 +1397,7 @@ export interface LangPair { 'ProfileTabLinks': undefined; 'ProfileTabMusic': undefined; 'ProfileTabVoice': undefined; + 'ProfileTabGifs': undefined; 'ProfileTabSharedGroups': undefined; 'ProfileTabSimilarChannels': undefined; 'ProfileTabSimilarBots': undefined;