diff --git a/src/util/deepLinkParser.ts b/src/util/deepLinkParser.ts index a8b2db38f..b36f40e2a 100644 --- a/src/util/deepLinkParser.ts +++ b/src/util/deepLinkParser.ts @@ -10,7 +10,7 @@ import { isUsernameValid } from './username'; export type DeepLinkMethod = 'resolve' | 'login' | 'passport' | 'settings' | 'join' | 'addstickers' | 'addemoji' | 'setlanguage' | 'addtheme' | 'confirmphone' | 'socks' | 'proxy' | 'privatepost' | 'bg' | 'share' | 'msg' | 'msg_url' | 'invoice' | 'addlist' | 'boost' | 'giftcode' | 'message' | 'premium_offer' | 'premium_multigift' | 'stars_topup' -| 'nft' | 'stars'; +| 'nft' | 'stars' | 'settings'; interface PublicMessageLink { type: 'publicMessageLink'; @@ -107,6 +107,11 @@ interface StarsModalLink { type: 'stars'; } +interface SettingsScreenLink { + type: 'settings'; + screen?: 'devices' | 'folders' | 'language' | 'privacy' | 'editProfile' | 'theme'; +} + type DeepLink = TelegramPassportLink | LoginCodeLink | @@ -121,7 +126,8 @@ type DeepLink = PremiumMultigiftLink | ChatBoostLink | GiftUniqueLink | - StarsModalLink; + StarsModalLink | + SettingsScreenLink; type BuilderParams = Record, string | undefined>; type BuilderReturnType = T | undefined; @@ -254,6 +260,8 @@ function parseTgLink(url: URL) { return buildGiftUniqueLink({ slug: queryParams.slug }); case 'stars': return { type: 'stars' } satisfies StarsModalLink; + case 'settings': + return buildSettingsScreenLink({ screen: pathParams.length === 1 ? pathParams[0] : undefined }); default: break; } @@ -461,6 +469,9 @@ function getTgDeepLinkType( return 'giftUniqueLink'; case 'stars': return 'stars'; + case 'settings': { + return 'settings'; + } default: break; } @@ -681,6 +692,37 @@ function buildGiftUniqueLink(params: BuilderParams): BuilderRetu }; } +function buildSettingsScreen(screenParam: string) { + switch (screenParam) { + case 'devices': + return 'devices'; + case 'folders': + return 'folders'; + case 'language': + return 'language'; + case 'privacy': + return 'privacy'; + case 'edit_profile': + return 'editProfile'; + case 'theme': + return 'theme'; + default: + break; + } + return undefined; +} + +function buildSettingsScreenLink(params: BuilderParams): BuilderReturnType { + const { + screen, + } = params; + + return { + type: 'settings', + screen: screen ? buildSettingsScreen(screen) : undefined, + }; +} + function buildPremiumReferrerLink(params: BuilderParams): BuilderReturnType { const { referrer, diff --git a/src/util/deeplink.ts b/src/util/deeplink.ts index cd432d249..5d102a224 100644 --- a/src/util/deeplink.ts +++ b/src/util/deeplink.ts @@ -2,6 +2,7 @@ import { getActions } from '../global'; import type { ApiChatType, ApiFormattedText } from '../api/types'; import type { DeepLinkMethod } from './deepLinkParser'; +import { LeftColumnContent, SettingsScreens } from '../types'; import { API_CHAT_TYPES, RE_TG_LINK } from '../config'; import { IS_BAD_URL_PARSER } from './browser/globalEnvironment'; @@ -75,6 +76,32 @@ export const processDeepLink = (url: string): boolean => { case 'giftUniqueLink': actions.openUniqueGiftBySlug({ slug: parsedLink.slug }); return true; + case 'settings': + if (!parsedLink.screen) { + actions.openLeftColumnContent({ contentKey: LeftColumnContent.Settings }); + return true; + } + switch (parsedLink.screen) { + case 'editProfile': + actions.openSettingsScreen({ screen: SettingsScreens.EditProfile }); + break; + case 'language': + actions.openSettingsScreen({ screen: SettingsScreens.Language }); + break; + case 'devices': + actions.openSettingsScreen({ screen: SettingsScreens.ActiveSessions }); + break; + case 'privacy': + actions.openSettingsScreen({ screen: SettingsScreens.Privacy }); + break; + case 'folders': + actions.openSettingsScreen({ screen: SettingsScreens.Folders }); + break; + case 'theme': + actions.openSettingsScreen({ screen: SettingsScreens.General }); + break; + } + return true; case 'stars': actions.openStarsBalanceModal({}); break;