Files
PlaylistShared/PlaylistShared.Pwa/Pages/Login.razor
2026-04-13 14:16:44 +03:00

75 lines
2.9 KiB
Plaintext

@page "/login"
@using PlaylistShared.Shared.DTO
@using PlaylistShared.Pwa.Services
@inject HttpClient Http
@inject AuthStateProvider AuthProvider
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
<MudContainer MaxWidth="MaxWidth.Small" Class="mt-16">
<MudCard>
<MudCardContent Class="text-center">
<MudText Typo="Typo.h5" Class="mb-4">Вход в PlaylistShared</MudText>
<MudText Typo="Typo.body2" Class="mb-6">
Войдите через учётную запись Keycloak или используйте локальный аккаунт.
</MudText>
<!-- Кнопка входа через Keycloak -->
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="LoginWithKeycloak" StartIcon="@Icons.Material.Filled.Login" FullWidth="true" Class="mb-4">
Войти через Keycloak
</MudButton>
<MudDivider Class="my-4">или</MudDivider>
<!-- Локальная форма входа -->
<MudTextField @bind-Value="_loginModel.Username" Label="Имя пользователя" Variant="Variant.Outlined" FullWidth="true" Class="mb-3" />
<MudTextField @bind-Value="_loginModel.Password" Label="Пароль" Variant="Variant.Outlined" FullWidth="true" Type="InputType.Password" />
<MudButton Variant="Variant.Outlined" Color="Color.Secondary" OnClick="LocalLogin" FullWidth="true" Class="mt-4">
Войти (локально)
</MudButton>
<MudText Class="mt-4" Typo="Typo.body2">
Нет аккаунта? <MudLink Href="/register">Зарегистрироваться</MudLink>
</MudText>
</MudCardContent>
</MudCard>
</MudContainer>
@code {
private LoginModel _loginModel = new();
private void LoginWithKeycloak()
{
Navigation.NavigateTo("/api/openid/login", true);
}
private async Task LocalLogin()
{
var response = await Http.PostAsJsonAsync("/api/account/login", _loginModel);
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadFromJsonAsync<ApiResponse<LoginResponse>>();
if (result?.Success == true && result.Data != null)
{
await AuthProvider.MarkUserAsAuthenticated(result.Data.Token, result.Data.RefreshToken);
Navigation.NavigateTo("/");
}
else
{
Snackbar.Add(result?.Error?.Message ?? "Ошибка входа", Severity.Error);
}
}
else
{
Snackbar.Add("Неверное имя пользователя или пароль", Severity.Error);
}
}
public class LoginModel
{
public string Username { get; set; } = "";
public string Password { get; set; } = "";
}
}