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
+2 -3
View File
@@ -25,7 +25,6 @@
@code {
private string BotUsername => Configuration["Telegram:BotUsername"] ?? "GmRelayBot";
private string AuthUrl => Navigation.ToAbsoluteUri("/auth/telegram").ToString();
[CascadingParameter]
private Task<AuthenticationState>? AuthStateTask { get; set; }
@@ -46,8 +45,8 @@
{
if (firstRender)
{
await JS.InvokeVoidAsync("loadTelegramWidget", BotUsername, AuthUrl);
await JS.InvokeVoidAsync("watchTelegramMiniAppLogin", "/auth/status", "/", true);
await JS.InvokeVoidAsync("loadTelegramWidget", BotUsername, "/auth/telegram-login");
await JS.InvokeVoidAsync("watchTelegramMiniAppLogin", "/auth/status", "/", false);
}
}
}
+24 -4
View File
@@ -1,12 +1,13 @@
@page "/miniapp"
@using Microsoft.AspNetCore.Components.Authorization
@using System.Text.Json.Serialization
@inject IJSRuntime JS
@inject NavigationManager Navigation
<PageTitle>Mini App Dashboard — GM-Relay</PageTitle>
<div class="mini-app-page">
<div class="mini-app-auth-card">
<div class="mini-app-auth-card" data-auth-status="@miniAppAuthStatus">
<div class="mini-app-logo">🎲</div>
<h1>GM-Relay</h1>
<p>@statusMessage</p>
@@ -20,6 +21,7 @@
@code {
private string statusMessage = "Открываем dashboard внутри Telegram...";
private string miniAppAuthStatus = "starting";
private bool showFallback;
[CascadingParameter]
@@ -48,14 +50,17 @@
try
{
var authenticated = await JS.InvokeAsync<bool>(
var result = await JS.InvokeAsync<MiniAppAuthResult>(
"authenticateTelegramMiniApp",
"/auth/telegram-webapp",
"/");
if (!authenticated)
if (!result.Authenticated)
{
statusMessage = "Mini App доступен из Telegram. Для браузера используйте обычный вход.";
miniAppAuthStatus = string.IsNullOrWhiteSpace(result.Reason)
? "telegram-auth-failed"
: result.Reason;
statusMessage = GetStatusMessage(miniAppAuthStatus);
showFallback = true;
StateHasChanged();
await TryWatchLoginAsync();
@@ -63,6 +68,7 @@
}
catch (JSException)
{
miniAppAuthStatus = "telegram-auth-failed";
statusMessage = "Не удалось получить данные Telegram Mini App. Попробуйте открыть dashboard из бота.";
showFallback = true;
StateHasChanged();
@@ -80,4 +86,18 @@
{
}
}
private static string GetStatusMessage(string reason) => reason switch
{
"telegram-webapp-missing" => "Mini App API не найден. Если страница открыта в браузере, войдите через Telegram.",
"telegram-init-data-empty" => "Telegram открыл страницу без Mini App initData. Попробуйте войти через Telegram на этом экране.",
"telegram-auth-failed" => "Не удалось проверить Telegram Mini App. Попробуйте войти через Telegram.",
_ => "Mini App доступен из Telegram. Для браузера используйте обычный вход."
};
private sealed record MiniAppAuthResult(
[property: JsonPropertyName("authenticated")] bool Authenticated,
[property: JsonPropertyName("reason")] string? Reason,
[property: JsonPropertyName("status")] int? Status,
[property: JsonPropertyName("redirectUrl")] string? RedirectUrl);
}