92 lines
3.3 KiB
Plaintext
92 lines
3.3 KiB
Plaintext
@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
|
||
|
||
<h3>@playlist?.Title</h3>
|
||
<p>Владелец: @playlist?.Owner?.UserName</p>
|
||
<p>Описание: @playlist?.Description</p>
|
||
|
||
@if (canAdd)
|
||
{
|
||
<div class="mb-3">
|
||
<input type="text" id="trackId" placeholder="ID трека Яндекс.Музыки" class="form-control" />
|
||
<input type="text" id="trackTitle" placeholder="Название трека" class="form-control mt-1" />
|
||
<input type="text" id="artistName" placeholder="Исполнитель" class="form-control mt-1" />
|
||
<button class="btn btn-primary mt-2" id="addTrackBtn">Добавить</button>
|
||
</div>
|
||
}
|
||
|
||
<ul id="trackList" class="list-group">
|
||
@foreach (var track in tracks)
|
||
{
|
||
<li class="list-group-item d-flex justify-content-between align-items-center" data-track-id="@track.YandexTrackId">
|
||
<div>
|
||
<strong>@track.Title</strong> - @track.Artist
|
||
</div>
|
||
@if (canDelete(track))
|
||
{
|
||
<button class="btn btn-sm btn-danger deleteTrackBtn" data-track-id="@track.YandexTrackId">Удалить</button>
|
||
}
|
||
</li>
|
||
}
|
||
</ul>
|
||
|
||
@code {
|
||
[Parameter] public string slug { get; set; } = "";
|
||
|
||
private SharedPlaylist? playlist;
|
||
private List<PlaylistTrack> 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);
|
||
}
|
||
}
|
||
} |