@page "/setup" @rendermode InteractiveServer @inject AdminConfigService AdminConfig @inject NavigationManager Navigation @using System.Net.Http.Json First-Time Setup @if (!AdminConfig.IsConfigured) {

First-Time Setup

Welcome to the CannedNet Admin Panel. Before you can log in, please configure the connection to your CannedNet server.

@if (saved) {
Settings saved! Redirecting to login...
} @if (error) {
@errorMessage
}
} else {

Already configured. Go to login.

} @code { private AdminConfigService.AdminConfigData edit = new(); private bool saving; private bool saved; private bool error; private string errorMessage = ""; private class KeyResponse { public string? apiKey { get; set; } } private async Task Save() { saving = true; saved = false; error = false; errorMessage = ""; try { if (string.IsNullOrWhiteSpace(edit.ServerBaseUrl)) { error = true; errorMessage = "Server Base URL is required."; return; } if (!Uri.TryCreate(edit.ServerBaseUrl, UriKind.Absolute, out _)) { error = true; errorMessage = "Server Base URL is not a valid absolute URL."; return; } edit.NsBaseUrl = edit.ServerBaseUrl; AdminConfig.Save(edit); try { using var client = new HttpClient(); client.BaseAddress = new Uri(edit.ServerBaseUrl.TrimEnd('/')); var keyResp = await client.GetFromJsonAsync("/admin/api/setup/key"); if (keyResp?.apiKey != null) { client.DefaultRequestHeaders.Add("X-Admin-Api-Key", keyResp.apiKey); await client.PostAsJsonAsync("/admin/api/setup/baseurl", new { baseUrl = edit.ServerBaseUrl }); } } catch { // server config update is best-effort during setup } saved = true; await Task.Delay(1000); Navigation.NavigateTo("/login", forceLoad: true); } finally { saving = false; } } }