From 76c9b11a68d39fda28a18ee81391463d8d36a691 Mon Sep 17 00:00:00 2001 From: FrigaT Date: Wed, 15 Apr 2026 15:56:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=82=D1=80=D0=B5=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Common/ShareButton.razor | 1 - .../Common/TrackCoverWithPlay.razor | 9 +- .../Components/Common/TrackItem.razor | 34 ++++++ .../SharedPlaylist/AddTrackBySearch.razor | 113 ------------------ .../SharedPlaylist/AddTrackSection.razor | 110 +++++++---------- .../SharedPlaylist/TracksTable.razor | 43 +------ .../Pages/SharedPlaylistView.razor | 61 +++++----- 7 files changed, 118 insertions(+), 253 deletions(-) create mode 100644 PlaylistShared.Pwa/Components/Common/TrackItem.razor delete mode 100644 PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackBySearch.razor diff --git a/PlaylistShared.Pwa/Components/Common/ShareButton.razor b/PlaylistShared.Pwa/Components/Common/ShareButton.razor index ba9803e..f6fd949 100644 --- a/PlaylistShared.Pwa/Components/Common/ShareButton.razor +++ b/PlaylistShared.Pwa/Components/Common/ShareButton.razor @@ -66,7 +66,6 @@ } _shareUrl = ShareUrl; _popoverOpen = true; - await CopyLink(); } } diff --git a/PlaylistShared.Pwa/Components/Common/TrackCoverWithPlay.razor b/PlaylistShared.Pwa/Components/Common/TrackCoverWithPlay.razor index 752ce19..535d610 100644 --- a/PlaylistShared.Pwa/Components/Common/TrackCoverWithPlay.razor +++ b/PlaylistShared.Pwa/Components/Common/TrackCoverWithPlay.razor @@ -1,8 +1,7 @@ @using Microsoft.AspNetCore.Components.Web @inject IAudioPlayerService AudioPlayerService - @@ -10,15 +9,15 @@ @if (_isHovered || IsCurrentTrackPlaying) { - - + } - + @code { [Parameter] public string CoverUrl { get; set; } = string.Empty; diff --git a/PlaylistShared.Pwa/Components/Common/TrackItem.razor b/PlaylistShared.Pwa/Components/Common/TrackItem.razor new file mode 100644 index 0000000..dcaf15f --- /dev/null +++ b/PlaylistShared.Pwa/Components/Common/TrackItem.razor @@ -0,0 +1,34 @@ +@using PlaylistShared.Shared.DTO +@using PlaylistShared.Pwa.Components.Common +@using PlaylistShared.Pwa.Extensions + + + + + + + + + + + @Track.Title + @string.Join(", ", Track.Artists) + + + + + + + + @Track.DurationMs.FormatDuration() + + + +@code { + [Parameter] public YandexTrack Track { get; set; } = null!; + [Parameter] public string PlaylistShareToken { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackBySearch.razor b/PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackBySearch.razor deleted file mode 100644 index 4ac68a5..0000000 --- a/PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackBySearch.razor +++ /dev/null @@ -1,113 +0,0 @@ -@using PlaylistShared.Pwa.Components.Common -@using PlaylistShared.Shared.DTO -@inject HttpClient Http -@inject ISnackbar Snackbar - - - - - @if (_isSearching) - { - - } - else if (_searchResults.Any()) - { -
- @foreach (var track in _searchResults) - { -
-
- -
-
- @track.Title - @string.Join(", ", track.Artists) -
-
- @track.DurationMs.FormatDuration() -
-
- -
-
- } -
- } - else if (!_isFirstSearch) - { - Ничего не найдено. Попробуйте изменить запрос. - } -
- - @code { - [Parameter] public EventCallback OnAddTrack { get; set; } - [Parameter] public string ShareToken { get; set; } = string.Empty; - - private List _searchResults = new(); - private bool _isSearching; - private bool _isFirstSearch = true; - private HashSet _addingTrackIds = new(); - private string _searchQuery = string.Empty; - - private async Task SearchTracks() - { - _isFirstSearch = false; - _isSearching = true; - try - { - var url = $"/api/yandexsearch/query?query={Uri.EscapeDataString(_searchQuery)}&limit=20"; - if (!string.IsNullOrEmpty(ShareToken)) - url += $"&shared_id={Uri.EscapeDataString(ShareToken)}"; - - var response = await Http.GetFromJsonAsync>>(url); - if (response?.Success == true) - _searchResults = response.Data ?? new(); - else - Snackbar.Add(response?.Error?.Message ?? "Ошибка поиска", Severity.Error); - } - catch (Exception ex) - { - Snackbar.Add($"Ошибка: {ex.Message}", Severity.Error); - } - finally - { - _isSearching = false; - StateHasChanged(); - } - } - - private async Task AddTrack(YandexTrack track) - { - if (_addingTrackIds.Contains(track.TrackId)) return; - _addingTrackIds.Add(track.TrackId); - try - { - await OnAddTrack.InvokeAsync(track.TrackId); - Snackbar.Add($"Трек \"{track.Title}\" добавлен", Severity.Success); - } - catch (Exception ex) - { - Snackbar.Add($"Ошибка добавления: {ex.Message}", Severity.Error); - } - finally - { - _addingTrackIds.Remove(track.TrackId); - StateHasChanged(); - } - } -} \ No newline at end of file diff --git a/PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackSection.razor b/PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackSection.razor index 93c692e..5fa8f43 100644 --- a/PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackSection.razor +++ b/PlaylistShared.Pwa/Components/SharedPlaylist/AddTrackSection.razor @@ -5,72 +5,50 @@ @inject HttpClient Http @inject ISnackbar Snackbar - - - + + - - - - - - + + + + + + - @if (_isSearching) - { - - } - else if (_searchResults.Any()) - { -
- @foreach (var track in _searchResults) - { -
-
- -
-
- @track.Title - @string.Join(", ", track.Artists) -
-
- @track.DurationMs.FormatDuration() -
-
- -
-
- } -
- } - else if (!_isFirstSearch) - { - Ничего не найдено. Попробуйте изменить запрос. - } -
-
+ + + + + + + + + + + @code { [Parameter] public string ShareToken { get; set; } = string.Empty; @@ -165,7 +143,7 @@ { await RemoveTrackById(track.TrackId); await OnTrackRemoved.InvokeAsync(); - Snackbar.Add($"Трек \"{track.Title}\" добавлен", Severity.Success); + Snackbar.Add($"Трек \"{track.Title}\" удален", Severity.Success); } catch (Exception ex) { @@ -208,7 +186,6 @@ var response = await Http.PostAsJsonAsync($"/api/sharedplaylist/{ShareToken}/add-tracks", request); if (response.IsSuccessStatusCode) { - Snackbar.Add("Трек успешно добавлен", Severity.Success); await OnTrackAdded.InvokeAsync(); // уведомляем родителя, что список треков изменился } else @@ -235,7 +212,6 @@ var response = await Http.PostAsJsonAsync($"/api/sharedplaylist/{ShareToken}/remove-tracks", request); if (response.IsSuccessStatusCode) { - Snackbar.Add("Трек успешно удален", Severity.Success); await OnTrackAdded.InvokeAsync(); // уведомляем родителя, что список треков изменился } else diff --git a/PlaylistShared.Pwa/Components/SharedPlaylist/TracksTable.razor b/PlaylistShared.Pwa/Components/SharedPlaylist/TracksTable.razor index ced4279..f81683f 100644 --- a/PlaylistShared.Pwa/Components/SharedPlaylist/TracksTable.razor +++ b/PlaylistShared.Pwa/Components/SharedPlaylist/TracksTable.razor @@ -5,48 +5,14 @@ @inject ISnackbar Snackbar @inject IDialogService DialogService - - - # - Обложка - Название - Исполнитель - Длительность - @if (CanRemove) - { - - } - + - @context.Index - - @if (!string.IsNullOrEmpty(context.CoverUri)) - { - @if (CanPlay) - { - - } - else - { - - } - } + + - - - @context.Title - - - - @string.Join(", ", context.Artists) - @context.DurationMs.FormatDuration() @if (CanRemove) { - + } @@ -57,7 +23,6 @@ [Parameter] public string ShareToken { get; set; } = string.Empty; [Parameter] public bool CanPlay { get; set; } [Parameter] public bool CanRemove { get; set; } - [Parameter] public string? CurrentPlayingTrackId { get; set; } [Parameter] public bool IsPlaying { get; set; } [Parameter] public EventCallback OnPlayTrack { get; set; } diff --git a/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor b/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor index 47d8269..64f8145 100644 --- a/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor +++ b/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor @@ -10,7 +10,7 @@ @inject AuthenticationStateProvider AuthProvider @inject IDialogService DialogService - + @if (_loading) { @@ -21,37 +21,42 @@ } else { - - - - - - - + + + + + + + + + - + + + + + + + @if (_canAdd) { - + + + + Добавление треков + + + + + + } - - - - Треки - - - - - - + + }