@page "/setup" @inherits LocalizableComponentBase @Localizer["Set up PrivaPub"] @* The server's first login, made while it has no administrator (PrivaPub's /clientapi/user/setup; owner decision 2026-10-16, first come, first served): it becomes the administrator, with its first persona, and setup closes for good. Everyone else joins through a group's invitation (Join). *@
@if (IsLoading) { } else if (CascadingState.IsSignedIn) {

@Localizer["You are signed in"]

@Localizer["Home"]
} else if (!isPending) {

@Localizer["This server is set up"]

@Localizer["It has an administrator already: sign in, or join with a group's invitation."]

@Localizer["Login"] @Localizer["Join with an invitation"]
} else {

@Localizer["Set up PrivaPub"]

@Localizer["This server has no administrator yet. The first login made here becomes it, with its first persona; after that, joining takes a group's invitation."]

@Localizer["Your login"] @Localizer["Your first persona"]

@Localizer["Others see your personas, never your login."]

@@ @if (isWorking) { } @Localizer["Set up PrivaPub"]
}
@code { [Inject] AuthService AuthService { get; set; } readonly SetupForm form = new(); string repeatedPassword; string error; bool isPending; bool isWorking; protected override async Task OnInitializedAsync() { if (CascadingState.IsOffline) { WhenOnline(LoadData); StartOnlinePolling(); IsLoading = false; return; } await LoadData(); IsLoading = false; } async Task LoadData() => isPending = await AuthService.SetupPending(); async Task SetUp() { error = default; if (form.Password != repeatedPassword) { error = Localizer["The two passwords don't match."]; return; } isWorking = true; form.AvatarUserName = form.AvatarUserName?.Trim().TrimStart('@').ToLowerInvariant(); var result = await AuthService.SetUp(form); if (result.IsInvalid) { isWorking = false; // set up meanwhile: the page says so isPending = result.StatusCode != (int)System.Net.HttpStatusCode.Forbidden; error = result.ErrorMessage; return; } await CascadingState.LoadSession(); isWorking = false; Toast.AddResponseSuccess(Localizer["PrivaPub is set up: you are its administrator."]); Navigation.NavigateTo(""); } }