@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) @FormatDuration(track.DurationMs) } } else if (!string.IsNullOrEmpty(_searchQuery) && !_isSearching) { Ничего не найдено. Попробуйте изменить запрос. } @code { [Parameter] public EventCallback OnAddTrack { get; set; } [Parameter] public EventCallback OnPlayTrack { get; set; } [Parameter] public string ShareToken { get; set; } = string.Empty; [Parameter] public string? CurrentPlayingTrackId { get; set; } [Parameter] public bool IsPlaying { get; set; } private string _searchQuery = ""; private List _searchResults = new(); private bool _isSearching; private HashSet _addingTrackIds = new(); private string? _currentPlayingTrackId; private bool _isPlaying; protected override void OnParametersSet() { _currentPlayingTrackId = CurrentPlayingTrackId; _isPlaying = IsPlaying; } private async Task SearchTracks() { if (string.IsNullOrWhiteSpace(_searchQuery)) return; _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(YandexTrackSearchResult 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(); } } private async Task PlayTrack(string trackId) { await OnPlayTrack.InvokeAsync(trackId); } private string FormatDuration(long ms) { var seconds = ms / 1000; var mins = seconds / 60; var secs = seconds % 60; return $"{mins}:{secs:D2}"; } }