Добавлены избранные плейлисты

This commit is contained in:
FrigaT
2026-04-14 14:14:19 +03:00
parent 8230951839
commit dcb2efbedb
17 changed files with 1118 additions and 5 deletions

View File

@@ -0,0 +1,112 @@
@page "/favorites"
@attribute [Authorize]
@using PlaylistShared.Shared.DTO
@inject HttpClient Http
@inject ISnackbar Snackbar
@inject NavigationManager Navigation
<MudContainer MaxWidth="MaxWidth.Large" Class="mt-8">
<MudCard>
<MudCardHeader>
<CardHeaderContent>
<MudText Typo="Typo.h5">Избранные плейлисты</MudText>
<MudText Typo="Typo.body2">Расшаренные плейлисты, которые вы добавили в избранное</MudText>
</CardHeaderContent>
<CardHeaderActions>
<MudIconButton Icon="@Icons.Material.Filled.Refresh" OnClick="LoadFavorites" />
</CardHeaderActions>
</MudCardHeader>
<MudCardContent>
@if (_loading)
{
<MudProgressCircular Indeterminate />
}
else if (_favorites == null || !_favorites.Any())
{
<MudAlert Severity="Severity.Info">
У вас пока нет избранных плейлистов. Перейдите на страницу расшаренного плейлиста и нажмите ★, чтобы добавить.
</MudAlert>
}
else
{
<MudTable Items="@_favorites">
<HeaderContent>
<MudTh>Название</MudTh>
<MudTh>Владелец</MudTh>
<MudTh>Треков</MudTh>
<MudTh></MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Название">
<MudLink Href="@($"/shared/{context.ShareToken}")" Underline="Underline.Hover">
@context.Title
</MudLink>
</MudTd>
<MudTd DataLabel="Владелец">@context.Creator?.UserName</MudTd>
<MudTd DataLabel="Треков">@context.TrackCount</MudTd>
<MudTd DataLabel="">
<MudIconButton Icon="@Icons.Material.Filled.Delete"
Color="Color.Error"
OnClick="() => RemoveFromFavorites(context)"
Title="Удалить из избранного" />
</MudTd>
</RowTemplate>
</MudTable>
}
</MudCardContent>
</MudCard>
</MudContainer>
@code {
private List<SharedPlaylistDto> _favorites = new();
private bool _loading = true;
protected override async Task OnInitializedAsync()
{
await LoadFavorites();
}
private async Task LoadFavorites()
{
_loading = true;
try
{
var response = await Http.GetFromJsonAsync<ApiResponse<List<SharedPlaylistDto>>>("/api/favorites");
if (response?.Success == true)
_favorites = response.Data ?? new();
else
Snackbar.Add(response?.Error?.Message ?? "Ошибка загрузки избранного", Severity.Error);
}
catch (Exception ex)
{
Snackbar.Add($"Ошибка: {ex.Message}", Severity.Error);
}
finally
{
_loading = false;
StateHasChanged();
}
}
private async Task RemoveFromFavorites(SharedPlaylistDto playlist)
{
try
{
var response = await Http.DeleteAsync($"/api/favorites/{playlist.ShareToken}");
if (response.IsSuccessStatusCode)
{
Snackbar.Add($"Плейлист \"{playlist.Title}\" удалён из избранного", Severity.Success);
await LoadFavorites();
}
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);
}
}
}