@page "/login" @using System.Diagnostics.CodeAnalysis @using Iceshrimp.Frontend.Core.Miscellaneous @using Iceshrimp.Frontend.Core.Schemas @using Iceshrimp.Frontend.Core.Services @using Iceshrimp.Frontend.Localization @using Iceshrimp.Shared.Schemas.Web @using Microsoft.Extensions.Localization @inject ApiService Api @inject SessionService SessionService @inject NavigationManager Navigation @inject IStringLocalizer Loc; @layout LoginLayout

Login

@if (Loading) { Loading! } @if (Failure) { Authentication Failed }

A login page is being constructed here.

@code { [SupplyParameterFromQuery(Name = "rd")] [SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Local")] private string? Redirect { get; set; } private string? Password { get; set; } private string? Username { get; set; } private bool Loading { get; set; } private bool Failure { get; set; } private async void Submit() { Loading = true; try { if (Username == null || Password == null) { Loading = false; Failure = true; StateHasChanged(); // Manually triggering a state update, else component will not re-render. return; } var res = await Api.Auth.Login(new AuthRequest { Username = Username, Password = Password }); switch (res.Status) { case AuthStatusEnum.Authenticated: SessionService.AddUser(new StoredUser { // Token nor user will ever be null on an authenticated response Id = res.User!.Id, Username = res.User.Username, DisplayName = res.User.DisplayName, AvatarUrl = res.User.AvatarUrl, BannerUrl = res.User.BannerUrl, InstanceName = res.User.InstanceName, InstanceIconUrl = res.User.InstanceIconUrl, Token = res.Token!, Host = res.User.Host, IsAdmin = res.IsAdmin ?? false, Emojis = res.User.Emojis, MovedTo = res.User.MovedTo }); SessionService.SetSession(res.User.Id); Navigation.NavigateTo(Uri.TryCreate(Redirect, UriKind.Relative, out _) ? Redirect : "/"); break; case AuthStatusEnum.Guest: Failure = true; Loading = false; break; case AuthStatusEnum.TwoFactor: //FixMe: Implement Two Factor break; } } catch (ApiException) { Loading = false; Failure = false; StateHasChanged(); // Manually triggering a state update, else component will not re-render. } } }