@page "/shared/{token}" @_playlist?.Title - Playlist Share @using PlaylistShared.Pwa.Components.Common @using PlaylistShared.Pwa.Components.SharedPlaylist @using PlaylistShared.Shared.DTO @using PlaylistShared.Shared.Enums @using PlaylistShared.Pwa.Services @using PlaylistShared.Shared.SharedPlaylist @using PlaylistShared.Shared.Yandex @inject HttpClient Http @inject ISnackbar Snackbar @inject NavigationManager Navigation @inject AuthenticationStateProvider AuthProvider @inject IDialogService DialogService @if (_loading) { } else if (_playlist == null) { Плейлист не найден или у вас нет доступа } else { @* --- ВЕРСИЯ ДЛЯ ПК (сетка) --- *@ @PlaylistCardContent @if (_canAdd) { @AddTrackCardContent } @* --- ВЕРСИЯ ДЛЯ МОБИЛОК (вкладки внизу) --- *@ @* Область контента: оба компонента здесь всегда *@ @PlaylistCardContent @AddTrackCardContent @* Кастомная панель навигации внизу *@ @if (_canAdd) { } } @code { [Parameter] public string Token { get; set; } private RenderFragment PlaylistCardContent => __builder => { @if (_canRemove) { } }; private RenderFragment AddTrackCardContent => __builder => { Добавление треков }; private int _activeMobileTab = 0; private HashSet _existingTrackIds = new(); private bool _firstLoadExistingTrackIds; private List _tracks = new(); private SharedPlaylistDto? _playlist; private bool _loading = true; private bool _isAuthenticated; private bool _isCreator; private bool _canPlay; private bool _canAdd; private bool _canRemove; private UpdatePermissionsDto _editPermissions = new(); private bool _savingPermissions; private string? _currentUserId; private bool _isFavorite = false; private bool _favoriteLoading = false; private bool _tracksLoading; private string _trackLink = ""; private bool _addingTrack; protected override async Task OnInitializedAsync() { var authState = await AuthProvider.GetAuthenticationStateAsync(); _isAuthenticated = authState.User.Identity?.IsAuthenticated == true; _currentUserId = authState.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; await LoadPlaylist(); await LoadTracks(); } private async Task ConfigurePermissions() { if (_playlist is null) { _isCreator = false; _canAdd = false; _canRemove = false; _canPlay = false; } else { _isCreator = _playlist.CreatorUserId.ToString() == _currentUserId; _canAdd = _isCreator || _playlist.AddPermission == EditPermission.Everyone || (_playlist.AddPermission == EditPermission.AuthorizedOnly && _isAuthenticated); _canRemove = _isCreator || _playlist.RemovePermission == EditPermission.Everyone || (_playlist.RemovePermission == EditPermission.AuthorizedOnly && _isAuthenticated); _canPlay = _isCreator || _playlist.PlayPermission == ViewPermission.Everyone || (_playlist.PlayPermission == ViewPermission.AuthorizedOnly && _isAuthenticated); if (_isCreator && _isAuthenticated) { _editPermissions = new UpdatePermissionsDto { ViewPermission = _playlist.ViewPermission, AddPermission = _playlist.AddPermission, RemovePermission = _playlist.RemovePermission, PlayPermission = _playlist.PlayPermission, }; } } } private async Task LoadPlaylist() { try { var response = await Http.GetFromJsonAsync>($"/api/sharedplaylist/{Token}"); if (response?.Success == true) { _playlist = response.Data; _activeMobileTab = 0; await ConfigurePermissions(); } else { Snackbar.Add(response?.Error?.Message ?? "Не удалось загрузить плейлист", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Ошибка: {ex.Message}", Severity.Error); } finally { _loading = false; StateHasChanged(); } } private async Task LoadTracks() { if (_playlist == null) return; _tracksLoading = true; try { var response = await Http.GetFromJsonAsync>($"/api/sharedplaylist/{Token}/tracks"); if (response?.Success == true && response.Data != null) { _tracks = response.Data.Tracks; _existingTrackIds = _tracks.Select(t => t.TrackId).ToHashSet(); } else { Snackbar.Add(response?.Error?.Message ?? "Не удалось загрузить треки", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Ошибка загрузки треков: {ex.Message}", Severity.Error); } finally { _tracksLoading = false; StateHasChanged(); } } private async Task RemoveTrack(YandexTrack track) { var confirmed = await DialogService.ShowMessageBoxAsync( "Подтверждение удаления", $"Вы уверены, что хотите удалить трек \"{track.Title}\"?", yesText: "Удалить", cancelText: "Отмена"); if (confirmed != true) return; try { var request = new UpdateTrackListRequest { TrackIds = new List { track.TrackId } }; var response = await Http.PostAsJsonAsync($"/api/sharedplaylist/{Token}/remove-tracks", request); if (response.IsSuccessStatusCode) { Snackbar.Add("Трек удалён", Severity.Success); await LoadTracks(); } else { var error = await response.Content.ReadFromJsonAsync>(); Snackbar.Add(error?.Error?.Message ?? "Ошибка удаления", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Ошибка: {ex.Message}", Severity.Error); } } }