@page "/search" @attribute [Authorize] @inherits LocalizableComponentBase @Localizer["Search"] @* Accounts, posts and hashtags (/api/v2/search). A handle (name@host) or a post's address is resolved by PrivaPub, which fetches it from its server if it has not met it yet; the browser never contacts another server. *@
@if (isSearching) { } @Localizer["Search"] @if (searched) { @if (results.Accounts.Count == 0 && results.Statuses.Count == 0 && results.Hashtags.Count == 0) {

@Localizer["Nothing found."]

} @if (results.Accounts.Count > 0) {

@Localizer["Accounts"]

} @if (results.Hashtags.Count > 0) {

@Localizer["Hashtags"]

@foreach (var tag in results.Hashtags) { #@tag.Name }
} @if (results.Statuses.Count > 0) {

@Localizer["Posts and replies"]

@foreach (var post in statuses) { }
} }
@code { [Inject] AccountService AccountService { get; set; } [Inject] InstanceService InstanceService { get; set; } [Inject] ILocalStorageService LocalStorage { get; set; } [SupplyParameterFromQuery(Name = "q")] public string Q { get; set; } sealed class SearchForm { public string Query { get; set; } } SearchForm form = new(); SearchResults results = new(); List statuses = []; bool searched; bool isSearching; protected override async Task OnInitializedAsync() { IsLoading = false; if (string.IsNullOrWhiteSpace(Q)) return; form.Query = Q; await Run(); } async Task Run() { if (string.IsNullOrWhiteSpace(form.Query)) return; isSearching = true; // a handle or an address is something to resolve; plain words only search what PrivaPub already holds var resolve = form.Query.Contains('@') || form.Query.StartsWith("http", StringComparison.OrdinalIgnoreCase); results = await AccountService.Search(form.Query, resolve); statuses = [.. results.Statuses.Select(FeedPost.Of)]; searched = true; isSearching = false; await InstanceService.Resolve(statuses.Select(p => p.Host).Append(InstanceService.SelfHost)); InstanceService.Locate(statuses); if (results.Accounts.Count == 1 && results.Statuses.Count == 0 && form.Query.Contains('@')) Navigation.NavigateTo($"account/{Uri.EscapeDataString(results.Accounts[0].Id)}"); } async Task OpenTag(string tagName) { var filter = await LocalStorage.GetItemAsync(nameof(FeedFilter)) ?? new(); filter.Tag = tagName; filter.TimelineType = TimelineType.Tag; await LocalStorage.SetItemAsync(nameof(FeedFilter), filter); Navigation.NavigateTo(""); } }