@page "/playlist/{slug}" @using System.Security.Claims @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.EntityFrameworkCore @using PlaylistShared.Data.Entities @inject AuthenticationStateProvider AuthenticationStateProvider @inject AppDbContext Db @inject IYandexMusicService YandexService @inject IJSRuntime Js @inject HttpClient Http

@playlist?.Title

Владелец: @playlist?.Owner?.UserName

Описание: @playlist?.Description

@if (canAdd) {
} @code { [Parameter] public string slug { get; set; } = ""; private SharedPlaylist? playlist; private List tracks = new(); private bool canAdd; private string? currentUserId; protected override async Task OnInitializedAsync() { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); currentUserId = authState.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; playlist = await Db.SharedPlaylists .Include(p => p.Owner) .Include(p => p.Tracks) .FirstOrDefaultAsync(p => p.ShareSlug == slug); if (playlist == null) return; canAdd = playlist.Permissions.Add switch { AccessLevel.All => true, AccessLevel.Authorized => currentUserId != null, _ => false }; // Здесь можно при желании синхронизировать с Яндекс API, но пока используем локальный кеш // var yandexTracks = await YandexService.GetPlaylistTracksAsync(playlist.OwnerUserId, playlist.YandexPlaylistId); tracks = playlist.Tracks.OrderBy(t => t.AddedAt).ToList(); } private bool canDelete(PlaylistTrack track) { if (currentUserId == playlist?.OwnerUserId) return true; return playlist?.Permissions.Delete switch { DeleteAccessLevel.All => true, DeleteAccessLevel.Authorized => currentUserId != null, DeleteAccessLevel.AdderOnly => currentUserId != null && currentUserId == track.AddedByUserId, DeleteAccessLevel.OwnerOnly => false, _ => false }; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && playlist != null) { await Js.InvokeVoidAsync("initPlaylistInteractions", playlist.Id); } } }