112 lines
4.3 KiB
Plaintext
112 lines
4.3 KiB
Plaintext
@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);
|
||
}
|
||
}
|
||
} |