@using System.Timers @implements IDisposable; @inject ISearchService searchService @inject IJSRuntime jsRuntime @inject NavigationManager navigationManager @if (searchService.IsLoaded() && searchService.IsVisible) {
} @code { private ElementReference searchBox; private string SearchText { get; set; } = ""; protected override void OnInitialized() { searchService.Subscribe(OnSearchChanged); timer = new Timer(200); timer.Elapsed += FocusTimer; timer.Enabled = false; } private void FocusTimer(object? sender, ElapsedEventArgs e) { jsRuntime.InvokeVoidAsync("SetFocusToElement", "search-input-box"); StateHasChanged(); } private Timer timer = null!; private void OnSearchChanged() { if (timer.Enabled != searchService.IsVisible) { timer.Enabled = searchService.IsVisible; } StateHasChanged(); } public void Dispose() { searchService.Unsubscribe(OnSearchChanged); timer.Elapsed -= FocusTimer; } public void CloseDialog() { searchService.Hide(); } public void NavigateTo(string url) { if (url.Contains("#")) { navigationManager.NavigateTo(url, navigationManager.Uri.Split("#").First().Contains(url.Split("#").First())); } else { navigationManager.NavigateTo(url); } } private void SearchChanged(ChangeEventArgs obj) { SearchText = obj.Value!.ToString()!; } private void OnSearch(SearchPointModel searchPoint) { NavigateTo(searchPoint.Href); searchService.Hide(); } private void OnFocus(object obj) { timer.Enabled = false; } }