diff --git a/data/telegram.org/js/telegram-web-app.js b/data/telegram.org/js/telegram-web-app.js index 0524751376..6074846332 100644 --- a/data/telegram.org/js/telegram-web-app.js +++ b/data/telegram.org/js/telegram-web-app.js @@ -224,6 +224,7 @@ } window.Telegram.WebView = { initParams: initParams, + isIframe: isIframe, onEvent: onEvent, offEvent: offEvent, postEvent: postEvent, @@ -252,10 +253,12 @@ var Utils = window.Telegram.Utils; var WebView = window.Telegram.WebView; var initParams = WebView.initParams; + var isIframe = WebView.isIframe; var WebApp = {}; var webAppInitData = '', webAppInitDataUnsafe = {}; var themeParams = {}, colorScheme = 'light'; + var webAppVersion = '1.0'; if (initParams.tgWebAppData && initParams.tgWebAppData.length) { webAppInitData = initParams.tgWebAppData; @@ -277,6 +280,9 @@ setThemeParams(theme_params); } catch (e) {} } + if (initParams.tgWebAppVersion) { + webAppVersion = initParams.tgWebAppVersion; + } function onThemeChanged(eventType, eventData) { if (eventData.theme_params) { @@ -305,6 +311,20 @@ } } + function linkHandler(e) { + if (e.metaKey || e.ctrlKey) return; + var el = e.target; + while (el.tagName != 'A' && el.parentNode) { + el = el.parentNode; + } + if (el.tagName == 'A' && + el.target != '_blank' && + (el.protocol == 'http:' || el.protocol == 'https:') && + el.hostname == 't.me') { + WebApp.openTgLink(el.href); + } + } + function receiveWebViewEvent(eventType) { var args = Array.prototype.slice.call(arguments); eventType = args.shift(); @@ -395,6 +415,26 @@ return hsp < 120; } + function versionCompare(v1, v2) { + if (typeof v1 !== 'string') v1 = ''; + if (typeof v2 !== 'string') v2 = ''; + v1 = v1.replace(/^\s+|\s+$/g, '').split('.'); + v2 = v2.replace(/^\s+|\s+$/g, '').split('.'); + var a = Math.max(v1.length, v2.length), i, p1, p2; + for (i = 0; i < a; i++) { + p1 = parseInt(v1[i]) || 0; + p2 = parseInt(v2[i]) || 0; + if (p1 == p2) continue; + if (p1 > p2) return 1; + return -1; + } + return 0; + } + + function versionAtLeast(ver) { + return versionCompare(webAppVersion, ver) >= 0; + } + function byteLength(str) { if (window.Blob) { try { return new Blob([str]).size; } catch (e) {} @@ -652,6 +692,10 @@ get: function(){ return webAppInitDataUnsafe; }, enumerable: true }); + Object.defineProperty(WebApp, 'version', { + get: function(){ return webAppVersion; }, + enumerable: true + }); Object.defineProperty(WebApp, 'colorScheme', { get: function(){ return colorScheme; }, enumerable: true @@ -676,6 +720,9 @@ value: MainButton, enumerable: true }); + WebApp.isVersionAtLeast = function(ver) { + return versionAtLeast(ver); + }; WebApp.onEvent = function(eventType, callback) { onWebViewEvent(eventType, callback); }; @@ -692,6 +739,26 @@ } WebView.postEvent('web_app_data_send', false, {data: data}); }; + WebApp.openTgLink = function (url) { + var a = document.createElement('A'); + a.href = url; + if (a.protocol != 'http:' && + a.protocol != 'https:') { + console.error('[Telegram.WebApp] Url protocol is not supported', url); + throw Error('WebAppTgUrlInvalid'); + } + if (a.hostname != 't.me') { + console.error('[Telegram.WebApp] Url host is not supported', url); + throw Error('WebAppTgUrlInvalid'); + } + var path_full = a.pathname + a.search; + if (WebApp.isIframe || + versionAtLeast('1.1')) { + WebView.postEvent('open_tg_link', false, {path_full: path_full}); + } else { + location.href = 'https://t.me' + path_full; + } + }; WebApp.ready = function () { WebView.postEvent('web_app_ready'); }; @@ -707,6 +774,9 @@ setViewportHeight(); window.addEventListener('resize', onWindowResize); + if (isIframe) { + document.addEventListener('click', linkHandler); + } WebView.onEvent('theme_changed', onThemeChanged); WebView.onEvent('viewport_changed', onViewportChanged); diff --git a/data/webappcontent.telegram.org/cafe.html b/data/webappcontent.telegram.org/cafe.html index a5b4246eaf..2f7a6f06b5 100644 --- a/data/webappcontent.telegram.org/cafe.html +++ b/data/webappcontent.telegram.org/cafe.html @@ -9,7 +9,7 @@ - + +