From 14fcd7dff95a706eaaff39715480da146b1f3fcf Mon Sep 17 00:00:00 2001 From: FrigaT Date: Fri, 24 Apr 2026 10:37:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=9F=D0=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/LongExtensions.cs | 30 ++++++++-- .../Pages/SharedPlaylistView.razor | 55 +++++++++++++++---- 2 files changed, 70 insertions(+), 15 deletions(-) diff --git a/PlaylistShared.Pwa/Extensions/LongExtensions.cs b/PlaylistShared.Pwa/Extensions/LongExtensions.cs index acd101f..7775fc5 100644 --- a/PlaylistShared.Pwa/Extensions/LongExtensions.cs +++ b/PlaylistShared.Pwa/Extensions/LongExtensions.cs @@ -5,11 +5,33 @@ public static class LongExtensions /// /// Преобразует миллисекунды в формат Минуты:Секунды /// - public static string FormatDuration(this long ms) + public static string FormatDuration(this long ms, FormatDurationType format = FormatDurationType.mmss) { var seconds = ms / 1000; - var mins = seconds / 60; - var secs = seconds % 60; - return $"{mins}:{secs:D2}"; + + var mm = seconds / 60; + var ss = seconds % 60; + + if (format == FormatDurationType.mmss || mm < 60) + { + return $"{mm}:{ss:D2}"; + } + else if (format == FormatDurationType.hhmmss) + { + var hh = mm / 60; + mm = mm / 60; + + return $"{hh}:{mm:D2}:{ss:D2}"; + } + else + { + return $"{mm}:{ss:D2}"; + } + } + + public enum FormatDurationType + { + mmss, + hhmmss, } } \ No newline at end of file diff --git a/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor b/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor index 5bb08f2..b2b9dd2 100644 --- a/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor +++ b/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor @@ -45,6 +45,11 @@ + + @if (_isCreator && _isAuthenticated) { @@ -127,6 +132,12 @@ + + + @if (_isCreator && _isAuthenticated) { } - - @_playlist?.Title - + + + @_playlist?.Title + + + @if (_tracksLoading) + { + + } + else + { + + @($"Треков: {_playlistTrackCount} • Продолжительность: {_playlistDurationMs.FormatDuration(LongExtensions.FormatDurationType.hhmmss)}") + + } + } }; @@ -405,6 +429,14 @@ /// Список добавленных в плейлист треков. /// private List _tracks = new(); + /// + /// Продолжительность плейлиста. + /// + long _playlistDurationMs; + /// + /// Кол-во треков в ПЛ. + /// + int _playlistTrackCount; /// Свойства плейлиста. private SharedPlaylistDto? _playlist; @@ -554,7 +586,9 @@ if (response?.Success == true && response.Data != null) { _tracks = response.Data.Tracks; - await GenerateUniqTrackIds(); + _existingTrackIds = _tracks.Select(t => t.TrackId).ToHashSet(); + _playlistDurationMs = _tracks.Sum(t => t.DurationMs); + _playlistTrackCount = _tracks.Count(); } else { @@ -573,11 +607,6 @@ } } - private async Task GenerateUniqTrackIds() - { - _existingTrackIds = _tracks.Select(t => t.TrackId).ToHashSet(); - } - /// Удаление трека из списка плейлиста private async Task OnRemoveTrack(YandexTrack track) { @@ -607,7 +636,9 @@ { Snackbar.Add($"Трек \"{track.Title}\" добавлен", Severity.Success, c => c.SnackbarVariant = Variant.Outlined); _tracks.Insert(0, track); - await GenerateUniqTrackIds(); + _existingTrackIds.Add(track.TrackId); + _playlistDurationMs += track.DurationMs; + _playlistTrackCount += 1; } else { @@ -636,7 +667,9 @@ { Snackbar.Add("Трек удалён", Severity.Success); _tracks.Remove(track); - await GenerateUniqTrackIds(); + _existingTrackIds.Remove(track.TrackId); + _playlistDurationMs -= track.DurationMs; + _playlistTrackCount -= 1; } else {