@using PlaylistShared.Shared.Shared @inject HttpClient Http @inject ISnackbar Snackbar @if (_addingTrack) { } else { Добавить } @code { private int _activeTabIndex = 0; private string _trackLink = ""; private bool _addingTrack = false; [Parameter] public string ShareToken { get; set; } = string.Empty; [Parameter] public EventCallback OnTrackAdded { get; set; } private async Task AddTrackByLink() { if (string.IsNullOrWhiteSpace(_trackLink)) { Snackbar.Add("Введите ссылку на трек", Severity.Warning); return; } var trackId = ExtractTrackIdFromLink(_trackLink); if (string.IsNullOrEmpty(trackId)) { Snackbar.Add("Неверный формат ссылки", Severity.Warning); return; } await AddTrackById(trackId); if (!_addingTrack) // если не было ошибки _trackLink = ""; } private async Task AddTrackById(string trackId) { _addingTrack = true; try { var request = new AddTracksRequest { TrackIds = new List { trackId } }; var response = await Http.PostAsJsonAsync($"/api/sharedplaylist/{ShareToken}/add-tracks", request); if (response.IsSuccessStatusCode) { Snackbar.Add("Трек успешно добавлен", Severity.Success); await OnTrackAdded.InvokeAsync(); // уведомляем родителя, что список треков изменился } else { var error = await response.Content.ReadFromJsonAsync>(); Snackbar.Add(error?.Error?.Message ?? "Ошибка добавления трека", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Ошибка: {ex.Message}", Severity.Error); } finally { _addingTrack = false; StateHasChanged(); } } private string? ExtractTrackIdFromLink(string link) { var match = System.Text.RegularExpressions.Regex.Match(link, @"/track/(\d+)"); return match.Success ? match.Groups[1].Value : null; } }