@page "/miniapp" @using Microsoft.AspNetCore.Components.Authorization @using System.Text.Json.Serialization @inject IJSRuntime JS @inject NavigationManager Navigation Mini App Dashboard — GM-Relay

GM-Relay

@statusMessage

@if (showFallback) { Войти через Telegram }
@code { private string statusMessage = "Открываем dashboard внутри Telegram..."; private string miniAppAuthStatus = "starting"; private bool showFallback; [CascadingParameter] private Task? AuthStateTask { get; set; } protected override async Task OnInitializedAsync() { if (AuthStateTask is null) { return; } var user = (await AuthStateTask).User; if (user.Identity?.IsAuthenticated == true) { Navigation.NavigateTo("/"); } } protected override async Task OnAfterRenderAsync(bool firstRender) { if (!firstRender) { return; } try { var result = await JS.InvokeAsync( "authenticateTelegramMiniApp", "/auth/telegram-webapp", "/"); if (!result.Authenticated) { miniAppAuthStatus = string.IsNullOrWhiteSpace(result.Reason) ? "telegram-auth-failed" : result.Reason; statusMessage = GetStatusMessage(miniAppAuthStatus); showFallback = true; StateHasChanged(); await TryWatchLoginAsync(); } } catch (JSException) { miniAppAuthStatus = "telegram-auth-failed"; statusMessage = "Не удалось получить данные Telegram Mini App. Попробуйте открыть dashboard из бота."; showFallback = true; StateHasChanged(); await TryWatchLoginAsync(); } } private async Task TryWatchLoginAsync() { try { await JS.InvokeVoidAsync("watchTelegramMiniAppLogin", "/auth/status", "/"); } catch (JSException) { } } 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); }