Сохранение громкости плеера
This commit is contained in:
@@ -59,6 +59,7 @@
|
|||||||
|
|
||||||
[Inject] protected IJSRuntime JS { get; set; } = null!;
|
[Inject] protected IJSRuntime JS { get; set; } = null!;
|
||||||
[Inject] private TokenStorage TokenStorage { get; set; } = null!;
|
[Inject] private TokenStorage TokenStorage { get; set; } = null!;
|
||||||
|
[Inject] private PlayerStorage PlayerStorage { get; set; } = null!;
|
||||||
[Inject] private AuthenticationStateProvider AuthProvider { get; set; } = null!;
|
[Inject] private AuthenticationStateProvider AuthProvider { get; set; } = null!;
|
||||||
[Inject] private ISnackbar Snackbar { get; set; } = null!;
|
[Inject] private ISnackbar Snackbar { get; set; } = null!;
|
||||||
|
|
||||||
@@ -76,6 +77,8 @@
|
|||||||
if (firstRender)
|
if (firstRender)
|
||||||
{
|
{
|
||||||
await EnsureAudioModuleAsync();
|
await EnsureAudioModuleAsync();
|
||||||
|
await ChangeVolume(await PlayerStorage.GetVolumeAsync());
|
||||||
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +100,7 @@
|
|||||||
if (double.IsNaN(currentTime) || double.IsNaN(duration) || double.IsInfinity(currentTime) || double.IsInfinity(duration))
|
if (double.IsNaN(currentTime) || double.IsNaN(duration) || double.IsInfinity(currentTime) || double.IsInfinity(duration))
|
||||||
return;
|
return;
|
||||||
if (duration <= 0) return;
|
if (duration <= 0) return;
|
||||||
|
|
||||||
_currentProgress = (currentTime / duration) * 100;
|
_currentProgress = (currentTime / duration) * 100;
|
||||||
_currentTime = FormatTime(currentTime);
|
_currentTime = FormatTime(currentTime);
|
||||||
// Длительность не обновляем здесь
|
// Длительность не обновляем здесь
|
||||||
@@ -123,10 +126,10 @@
|
|||||||
private async Task<bool> CheckAuthAsync()
|
private async Task<bool> CheckAuthAsync()
|
||||||
{
|
{
|
||||||
if (!RequireAuth) return true;
|
if (!RequireAuth) return true;
|
||||||
|
|
||||||
var authState = await AuthProvider.GetAuthenticationStateAsync();
|
var authState = await AuthProvider.GetAuthenticationStateAsync();
|
||||||
var isAuthenticated = authState.User.Identity?.IsAuthenticated == true;
|
var isAuthenticated = authState.User.Identity?.IsAuthenticated == true;
|
||||||
|
|
||||||
if (!isAuthenticated)
|
if (!isAuthenticated)
|
||||||
{
|
{
|
||||||
Snackbar.Add("Воспроизведение доступно только авторизованным пользователям", Severity.Warning);
|
Snackbar.Add("Воспроизведение доступно только авторизованным пользователям", Severity.Warning);
|
||||||
@@ -141,13 +144,13 @@
|
|||||||
|
|
||||||
var tokens = await TokenStorage.GetTokensAsync();
|
var tokens = await TokenStorage.GetTokensAsync();
|
||||||
var accessToken = tokens.token;
|
var accessToken = tokens.token;
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(accessToken) && string.IsNullOrWhiteSpace(SharedPlaylistId))
|
if (string.IsNullOrWhiteSpace(accessToken) && string.IsNullOrWhiteSpace(SharedPlaylistId))
|
||||||
{
|
{
|
||||||
Snackbar.Add("Токен авторизации не найден. Пожалуйста, войдите заново.", Severity.Error);
|
Snackbar.Add("Токен авторизации не найден. Пожалуйста, войдите заново.", Severity.Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var streamUrl = new Uri(Http.BaseAddress!, $"/api/audio/track/{trackId}").ToString();
|
var streamUrl = new Uri(Http.BaseAddress!, $"/api/audio/track/{trackId}").ToString();
|
||||||
|
|
||||||
await EnsureAudioModuleAsync();
|
await EnsureAudioModuleAsync();
|
||||||
@@ -160,7 +163,7 @@
|
|||||||
public async Task PlayAsync()
|
public async Task PlayAsync()
|
||||||
{
|
{
|
||||||
if (!await CheckAuthAsync()) return;
|
if (!await CheckAuthAsync()) return;
|
||||||
|
|
||||||
if (_audioElement == null) return;
|
if (_audioElement == null) return;
|
||||||
await _audioElement.InvokeVoidAsync("play");
|
await _audioElement.InvokeVoidAsync("play");
|
||||||
_isPlaying = true;
|
_isPlaying = true;
|
||||||
@@ -226,6 +229,8 @@
|
|||||||
var volume = value / 100;
|
var volume = value / 100;
|
||||||
await _audioElement.InvokeVoidAsync("setVolume", volume);
|
await _audioElement.InvokeVoidAsync("setVolume", volume);
|
||||||
_isMuted = false;
|
_isMuted = false;
|
||||||
|
_currentVolume = value;
|
||||||
|
await PlayerStorage.SetVolumeAsync(value);
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ internal class Program
|
|||||||
});
|
});
|
||||||
|
|
||||||
builder.Services.AddScoped<TokenStorage>();
|
builder.Services.AddScoped<TokenStorage>();
|
||||||
|
builder.Services.AddScoped<PlayerStorage>();
|
||||||
builder.Services.AddScoped<AuthStateProvider>();
|
builder.Services.AddScoped<AuthStateProvider>();
|
||||||
builder.Services.AddScoped<AuthenticationStateProvider>(sp => sp.GetRequiredService<AuthStateProvider>());
|
builder.Services.AddScoped<AuthenticationStateProvider>(sp => sp.GetRequiredService<AuthStateProvider>());
|
||||||
builder.Services.AddScoped<ApiClient>();
|
builder.Services.AddScoped<ApiClient>();
|
||||||
|
|||||||
30
PlaylistShared.Pwa/Services/PlayerStorage.cs
Normal file
30
PlaylistShared.Pwa/Services/PlayerStorage.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using Microsoft.JSInterop;
|
||||||
|
|
||||||
|
namespace PlaylistShared.Pwa.Services;
|
||||||
|
|
||||||
|
public class PlayerStorage
|
||||||
|
{
|
||||||
|
private readonly IJSRuntime _js;
|
||||||
|
private const string VolumeKey = "audio_player_volume";
|
||||||
|
|
||||||
|
public PlayerStorage(IJSRuntime js) => _js = js;
|
||||||
|
|
||||||
|
public async Task SetVolumeAsync(double volume)
|
||||||
|
{
|
||||||
|
await _js.InvokeVoidAsync("localStorage.setItem", VolumeKey, volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<double> GetVolumeAsync()
|
||||||
|
{
|
||||||
|
var volume = await _js.InvokeAsync<string>("localStorage.getItem", VolumeKey);
|
||||||
|
|
||||||
|
if (double.TryParse(volume, out var result))
|
||||||
|
{
|
||||||
|
result = Math.Clamp(result, 0, 100);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,4 +28,4 @@ public class TokenStorage
|
|||||||
await _js.InvokeVoidAsync("localStorage.removeItem", TokenKey);
|
await _js.InvokeVoidAsync("localStorage.removeItem", TokenKey);
|
||||||
await _js.InvokeVoidAsync("localStorage.removeItem", RefreshTokenKey);
|
await _js.InvokeVoidAsync("localStorage.removeItem", RefreshTokenKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user