@using ArcaneLibs.Blazor.Components
@using ArcaneLibs.Blazor.Components.Services
@using Spacebar.Client.WebCore
@using Spacebar.Sdk.Core
@inject SessionStore sessionStore
@inject SpacebarClientProviderService clientProvider
@inject JsConsoleService jsConsole
@if (_sessionPickerVisible)
{
@foreach (var (sessionId, session) in _sessionEntries)
{
@(session.ProfileCache?.Username ?? "Unknown user")#@(session.ProfileCache?.Discriminator ?? "0000") on @session.ServerName
x
}
Log in
Register
}
@code {
private bool _sessionPickerVisible;
private DebugBanner _dbgBanner;
private Dictionary _sessionEntries = [];
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!firstRender) return;
await _dbgBanner.SetStatus("Crunching numbers...");
_sessionPickerVisible = await sessionStore.GetCurrentSessionAsync() == null;
await _dbgBanner.SetStatus("Ready!");
await _dbgBanner.SetStatus(null, 1000);
}
public async Task SetSessionPickerVisible(bool visible = true)
{
await jsConsole.Info("[SessionManager] showing session picker...");
_sessionEntries = visible ? await sessionStore.GetAllSessionsAsync() : [];
_sessionPickerVisible = visible;
StateHasChanged();
await Task.Delay(1);
}
private async Task SetCurrentSessionAsync(Guid sessionId)
{
_sessionPickerVisible = false;
StateHasChanged();
await sessionStore.SetCurrentSessionAsync(sessionId);
var cs = await sessionStore.GetCurrentSessionAsync();
await _dbgBanner.SetStatus($"Current session changed to {cs!.ProfileCache?.Username}#{cs.ProfileCache?.Discriminator} ({cs.ProfileCache.Id}) / {sessionId.ToString()}!");
await _dbgBanner.SetStatus(null, 3000);
}
private async Task RemoveSessionAsync(Guid sessionId)
{
try
{
await _dbgBanner.SetStatus("Trying to log out...");
var sess = _sessionEntries[sessionId];
var client = await clientProvider.GetAuthenticatedClientAsync(sess.ServerName, sess.AccessToken);
await client.LogOutAsync();
}
catch (Exception e)
{
await _dbgBanner.SetStatus("Failed to log out, removing anyway: " + string.Join("\n", e.ToString().Split("\n").Where(x => !x.Trim().StartsWith("at "))));
await Task.Delay(1000);
}
await sessionStore.RemoveSessionAsync(sessionId);
await _dbgBanner.SetStatus("Session removed successfully!");
await _dbgBanner.SetStatus(null, 1000);
await SetSessionPickerVisible();
}
}