fix: stabilize mini app login and safe area
Deploy Telegram Bot / build-and-push (push) Successful in 3m53s
Deploy Telegram Bot / deploy (push) Successful in 17s

This commit is contained in:
2026-04-28 20:25:18 +03:00
parent 57c8714889
commit 2a76ec0fb8
14 changed files with 459 additions and 39 deletions
+129 -21
View File
@@ -24,6 +24,22 @@
<ReconnectModal />
<script src="@Assets["_framework/blazor.web.js"]"></script>
<script>
window.waitForTelegramMiniApp = async function (timeoutMs) {
var deadline = Date.now() + (timeoutMs || 3000);
while (Date.now() <= deadline) {
if (window.Telegram && window.Telegram.WebApp) {
return window.Telegram.WebApp;
}
await new Promise(function (resolve) {
setTimeout(resolve, 100);
});
}
return null;
};
window.waitForTelegramMiniAppInitData = async function (timeoutMs) {
var deadline = Date.now() + (timeoutMs || 3000);
@@ -40,30 +56,111 @@
return null;
};
(async function () {
var webApp = await window.waitForTelegramMiniAppInitData(1000);
window.syncTelegramMiniAppViewport = function (webApp) {
if (!webApp) {
return;
}
var root = document.documentElement;
var safeArea = webApp.safeAreaInset || {};
var contentSafeArea = webApp.contentSafeAreaInset || {};
var setPx = function (name, value) {
root.style.setProperty(name, Math.max(0, Number(value) || 0) + 'px');
};
setPx('--gm-tg-safe-top', safeArea.top);
setPx('--gm-tg-safe-right', safeArea.right);
setPx('--gm-tg-safe-bottom', safeArea.bottom);
setPx('--gm-tg-safe-left', safeArea.left);
setPx('--gm-tg-content-safe-top', contentSafeArea.top);
setPx('--gm-tg-content-safe-right', contentSafeArea.right);
setPx('--gm-tg-content-safe-bottom', contentSafeArea.bottom);
setPx('--gm-tg-content-safe-left', contentSafeArea.left);
if (webApp.viewportHeight) {
root.style.setProperty('--gm-tg-viewport-height', webApp.viewportHeight + 'px');
}
};
window.prepareTelegramMiniApp = function (webApp) {
if (!webApp) {
return;
}
document.body.classList.add('telegram-mini-app');
webApp.ready();
window.syncTelegramMiniAppViewport(webApp);
try {
webApp.ready();
} catch (error) {
}
try {
webApp.expand();
} catch (error) {
}
if (webApp.onEvent && !window.gmRelayTelegramMiniAppViewportEventsRegistered) {
window.gmRelayTelegramMiniAppViewportEventsRegistered = true;
webApp.onEvent('safeAreaChanged', function () {
window.syncTelegramMiniAppViewport(webApp);
});
webApp.onEvent('contentSafeAreaChanged', function () {
window.syncTelegramMiniAppViewport(webApp);
});
webApp.onEvent('viewportChanged', function () {
window.syncTelegramMiniAppViewport(webApp);
});
}
};
(async function () {
var webApp = await window.waitForTelegramMiniApp(1000);
window.prepareTelegramMiniApp(webApp);
})();
window.loadTelegramWidget = function (botUsername, authUrl) {
var container = document.getElementById('telegram-login-container');
if (!container) return;
container.innerHTML = '';
window.gmRelayTelegramLoginAuthUrl = authUrl || '/auth/telegram-login';
var script = document.createElement('script');
script.async = true;
script.src = 'https://telegram.org/js/telegram-widget.js?22';
script.setAttribute('data-telegram-login', botUsername);
script.setAttribute('data-size', 'large');
script.setAttribute('data-auth-url', authUrl);
script.setAttribute('data-onauth', 'window.handleTelegramLogin(user)');
script.setAttribute('data-request-access', 'write');
container.appendChild(script);
};
window.handleTelegramLogin = async function (user) {
if (!user) {
window.location.href = '/login?error=auth_failed';
return;
}
try {
var response = await fetch(window.gmRelayTelegramLoginAuthUrl || '/auth/telegram-login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'same-origin',
cache: 'no-store',
body: JSON.stringify(user)
});
if (!response.ok) {
window.location.href = '/login?error=auth_failed';
return;
}
var payload = await response.json();
window.location.href = payload.redirectUrl || '/';
} catch (error) {
window.location.href = '/login?error=auth_failed';
}
};
window.watchTelegramMiniAppLogin = function (statusUrl, redirectUrl, reloadOnReturn) {
window.gmRelayMiniAppLoginReloadOnReturn =
window.gmRelayMiniAppLoginReloadOnReturn || reloadOnReturn === true;
@@ -161,29 +258,40 @@
};
window.authenticateTelegramMiniApp = async function (authUrl, redirectUrl) {
var webApp = await window.waitForTelegramMiniAppInitData(3000);
var webApp = await window.waitForTelegramMiniApp(3000);
if (!webApp) {
return false;
return { authenticated: false, reason: 'telegram-webapp-missing' };
}
document.body.classList.add('telegram-mini-app');
webApp.ready();
webApp.expand();
window.prepareTelegramMiniApp(webApp);
var response = await fetch(authUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'same-origin',
body: JSON.stringify({ initData: webApp.initData })
});
if (!response.ok) {
return false;
if (!webApp.initData) {
return { authenticated: false, reason: 'telegram-init-data-empty' };
}
var payload = await response.json();
window.location.href = payload.redirectUrl || redirectUrl || '/';
return true;
try {
var response = await fetch(authUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'same-origin',
cache: 'no-store',
body: JSON.stringify({ initData: webApp.initData })
});
if (!response.ok) {
return {
authenticated: false,
reason: 'telegram-auth-failed',
status: response.status
};
}
var payload = await response.json();
window.location.href = payload.redirectUrl || redirectUrl || '/';
return { authenticated: true, redirectUrl: payload.redirectUrl || redirectUrl || '/' };
} catch (error) {
return { authenticated: false, reason: 'telegram-auth-failed' };
}
};
</script>
</body>