@page "/{User}"
@using Iceshrimp.Frontend.Core.Miscellaneous
@using Iceshrimp.Frontend.Core.Services
@using Iceshrimp.Shared.Schemas
@using Iceshrimp.Frontend.Components
@using Iceshrimp.Frontend.Components.Note
@using System.Text.RegularExpressions
@inject ApiService Api
@if (_init)
{
}
@if (_loading)
{
loading
}
@if (_notFound)
{
User does not exist!
}
@if (_error)
{
Failure
}
@code {
[Parameter] public string? User { get; set; }
[Parameter] public string? Host { get; set; }
private UserResponse UserResponse { get; set; } = null!;
private UserProfileResponse? Profile { get; set; }
private string? MinId { get; set; }
private List UserNotes { get; set; } = [];
private bool _loading = true;
private bool _init;
private bool _notFound;
private bool _error;
private bool _fetchLock;
private async Task GetNotes(string? minId)
{
var pq = new PaginationQuery() { Limit = 10, MaxId = minId };
var notes = await Api.Users.GetUserNotes(UserResponse.Id, pq);
if (notes is not null && notes.Count > 0)
{
MinId = notes.Last().Id;
UserNotes.AddRange(notes);
StateHasChanged();
}
}
private async Task AddNotes()
{
if (_fetchLock == false)
{
_fetchLock = true;
await GetNotes(MinId);
_fetchLock = false;
}
}
private async Task LoadProfile()
{
try
{
if (User is null)
{
_notFound = true;
}
else
{
var pattern = "^@(.[^@]+)@?(.+)?$";
var matches = Regex.Match(User, pattern);
var userResponse = await Api.Users.LookupUser(matches.Groups[1].Value, matches.Groups[2].Value);
if (userResponse is null)
{
_notFound = true;
}
else
{
UserResponse = userResponse;
Profile = await Api.Users.GetUserProfile(UserResponse.Id);
await GetNotes(null);
_init = true;
_loading = false;
}
}
}
catch (ApiException)
{
_loading = false;
_error = true;
}
}
protected override async Task OnInitializedAsync()
{
await LoadProfile();
}
protected override async Task OnParametersSetAsync()
{
_init = false;
_loading = true;
UserNotes = [];
MinId = null;
Profile = null;
StateHasChanged();
await LoadProfile();
}
}