From ee52eae6acc7fbe16e4e8b732c30b115925d4229 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Thu, 29 Aug 2024 15:52:37 +0200 Subject: [PATCH] Link: Open unsupported t.me links (#4880) --- src/global/actions/api/chats.ts | 26 ++++++++++++++++++++++++-- src/global/actions/api/messages.ts | 6 ++++-- src/global/types.ts | 1 + 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/global/actions/api/chats.ts b/src/global/actions/api/chats.ts index 35e045533..a4a1ff86e 100644 --- a/src/global/actions/api/chats.ts +++ b/src/global/actions/api/chats.ts @@ -1244,7 +1244,7 @@ addActionHandler('openChatByPhoneNumber', async (global, actions, payload): Prom } }); -addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnType => { +addActionHandler('openTelegramLink', async (global, actions, payload): Promise => { const { url, tabId = getCurrentTabId(), @@ -1361,6 +1361,10 @@ addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnTyp const messageId = part3 ? Number(part3) : undefined; const commentId = params.comment ? Number(params.comment) : undefined; + const isWebApp = await checkWebAppExists(global, part1, part2); + + const shouldTryOpenChat = (part1 && !part2) || isWebApp; + if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) { joinVoiceChatByLink({ username: part1, @@ -1410,7 +1414,7 @@ addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnTyp startParam: params.startattach || params.startapp, tabId, }); - } else { + } else if (shouldTryOpenChat) { openChatByUsernameAction({ username: part1, messageId: messageId || Number(chatOrChannelPostId), @@ -1423,6 +1427,10 @@ addActionHandler('openTelegramLink', (global, actions, payload): ActionReturnTyp originalParts: [part1, part2, part3], tabId, }); + } else { + actions.openUrl({ + url, shouldSkipModal: true, tabId, ignoreDeepLinks: true, + }); } }); @@ -2954,6 +2962,20 @@ export async function fetchChatByUsername( return chat; } +export async function checkWebAppExists( + global: T, botName: string, appName: string, +) { + if (!botName || !appName) return false; + global = getGlobal(); + const chatByUsername = await fetchChatByUsername(global, botName); + const bot = chatByUsername && selectUser(global, chatByUsername.id); + const botApp = bot && await callApi('fetchBotApp', { + bot, + appName, + }); + return Boolean(botApp); +} + export async function fetchChatByPhoneNumber(global: T, phoneNumber: string) { global = getGlobal(); const localUser = selectUserByPhoneNumber(global, phoneNumber); diff --git a/src/global/actions/api/messages.ts b/src/global/actions/api/messages.ts index 098bdde0f..813423728 100644 --- a/src/global/actions/api/messages.ts +++ b/src/global/actions/api/messages.ts @@ -1752,10 +1752,12 @@ addActionHandler('readAllMentions', (global, actions, payload): ActionReturnType }); addActionHandler('openUrl', (global, actions, payload): ActionReturnType => { - const { url, shouldSkipModal, tabId = getCurrentTabId() } = payload; + const { + url, shouldSkipModal, ignoreDeepLinks, tabId = getCurrentTabId(), + } = payload; const urlWithProtocol = ensureProtocol(url)!; - if (isDeepLink(urlWithProtocol)) { + if (!ignoreDeepLinks && isDeepLink(urlWithProtocol)) { actions.closeStoryViewer({ tabId }); actions.closePaymentModal({ tabId }); diff --git a/src/global/types.ts b/src/global/types.ts index b4286319f..e35a7a049 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -3050,6 +3050,7 @@ export interface ActionPayloads { openUrl: { url: string; shouldSkipModal?: boolean; + ignoreDeepLinks?: boolean; } & WithTabId; openMapModal: { geoPoint: ApiGeoPoint;