Доработана передача списка выбранных треков

This commit is contained in:
FrigaT
2026-04-15 16:57:11 +03:00
parent 76c9b11a68
commit 629f14cbb9
6 changed files with 90 additions and 141 deletions

View File

@@ -1,4 +1,5 @@
@page "/shared/{token}"
@using PlaylistShared.Pwa.Components.Common
@using PlaylistShared.Pwa.Components.SharedPlaylist
@using PlaylistShared.Shared.DTO
@using PlaylistShared.Shared.Enums
@@ -24,7 +25,6 @@
<MudSplitPanel>
<FirstPanel>
<MudCard>
<!-- Заголовок с обложкой -->
<MudCardHeader>
<CardHeaderContent>
<PlaylistHeader Playlist="@_playlist" />
@@ -32,12 +32,25 @@
</MudCardHeader>
<MudCardContent>
<MudIconButton Icon="@Icons.Material.Filled.Refresh" OnClick="LoadTracks" Disabled="_tracksLoading" Size="Size.Medium" />
<TracksTable @ref="_tracksTableRef"
ShareToken="@Token"
CanPlay="@_canPlay"
CanRemove="@_canRemove"
/>
<MudIconButton Icon="@Icons.Material.Filled.Refresh" OnClick="LoadTracks" Disabled="@_tracksLoading" Size="Size.Medium" />
<MudTable Items="@_tracks"
Virtualize="true"
Height="400px"
Hover="true"
Breakpoint="Breakpoint.Sm"
Loading="@_tracksLoading">
<RowTemplate>
<MudTd Style="width: 100%;">
<TrackItem Track="@context" PlaylistShareToken="Token" CanPlay="@_canPlay" />
</MudTd>
@if (_canRemove)
{
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.Delete" Color="Color.Error" OnClick="() => RemoveTrack(context)" />
</MudTd>
}
</RowTemplate>
</MudTable>
</MudCardContent>
</MudCard>
</FirstPanel>
@@ -51,7 +64,7 @@
</CardHeaderContent>
</MudCardHeader>
<MudCardContent>
<AddTrackSection ShareToken="@Token" OnTrackAdded="LoadTracks" OnTrackRemoved="LoadTracks" />
<AddTrackSection ShareToken="Token" OnTrackAdded="LoadTracks" OnTrackRemoved="LoadTracks" ExistingTrackIds="_existingTrackIds" />
</MudCardContent>
</MudCard>
}
@@ -64,7 +77,9 @@
@code {
[Parameter] public string Token { get; set; }
private TracksTable? _tracksTableRef;
private HashSet<string> _existingTrackIds = new();
private bool _firstLoadExistingTrackIds;
private List<YandexTrack> _tracks = new();
private SharedPlaylistDto? _playlist;
private bool _loading = true;
@@ -90,6 +105,7 @@
_isAuthenticated = authState.User.Identity?.IsAuthenticated == true;
_currentUserId = authState.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
await LoadPlaylist();
await LoadTracks();
}
private async Task ConfigurePermissions()
@@ -141,7 +157,6 @@
_playlist = response.Data;
await ConfigurePermissions();
//await LoadTracks();
}
else
{
@@ -162,14 +177,61 @@
private async Task LoadTracks()
{
if (_playlist == null) return;
if (_tracksTableRef == null) return;
_tracksLoading = true;
StateHasChanged();
await _tracksTableRef.Reload();
try
{
var response = await Http.GetFromJsonAsync<ApiResponse<YandexPlaylistData>>($"/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);
}
_tracksLoading = false;
StateHasChanged();
}
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<string> { 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<ApiResponse<object>>();
Snackbar.Add(error?.Error?.Message ?? "Ошибка удаления", Severity.Error);
}
}
catch (Exception ex)
{
Snackbar.Add($"Ошибка: {ex.Message}", Severity.Error);
}
}
}