@using PlaylistShared.Pwa.Components.Common @using PlaylistShared.Shared.DTO @inject HttpClient Http @inject ISnackbar Snackbar
Искать
@if (_isSearching) {
} else if (_searchResults.Any()) {
@foreach (var track in _searchResults) {
@track.Title @string.Join(", ", track.Artists)
@track.DurationMs.FormatDuration()
}
} else if (!_isFirstSearch) { Ничего не найдено. Попробуйте изменить запрос. }
@code { [Parameter] public EventCallback OnAddTrack { get; set; } [Parameter] public string ShareToken { get; set; } = string.Empty; private List _searchResults = new(); private bool _isSearching; private bool _isFirstSearch = true; private HashSet _addingTrackIds = new(); private string _searchQuery = string.Empty; private async Task SearchTracks() { if (string.IsNullOrWhiteSpace(_searchQuery)) return; _isFirstSearch = false; _isSearching = true; try { var url = $"/api/yandexsearch/tracks?query={Uri.EscapeDataString(_searchQuery)}&limit=20"; if (!string.IsNullOrEmpty(ShareToken)) url += $"&shared_id={Uri.EscapeDataString(ShareToken)}"; var response = await Http.GetFromJsonAsync>>(url); if (response?.Success == true) _searchResults = response.Data ?? new(); else Snackbar.Add(response?.Error?.Message ?? "Ошибка поиска", Severity.Error); } catch (Exception ex) { Snackbar.Add($"Ошибка: {ex.Message}", Severity.Error); } finally { _isSearching = false; StateHasChanged(); } } private async Task AddTrack(YandexTrack track) { if (_addingTrackIds.Contains(track.TrackId)) return; _addingTrackIds.Add(track.TrackId); try { await OnAddTrack.InvokeAsync(track.TrackId); Snackbar.Add($"Трек \"{track.Title}\" добавлен", Severity.Success); } catch (Exception ex) { Snackbar.Add($"Ошибка добавления: {ex.Message}", Severity.Error); } finally { _addingTrackIds.Remove(track.TrackId); StateHasChanged(); } } }