Добавлен стандартный "поделиться ПЛ"
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
@inject AuthenticationStateProvider AuthProvider
|
||||
@inject IDialogService DialogService
|
||||
@inject IAudioPlayerService AudioPlayerService
|
||||
@inject IJSRuntime JS
|
||||
@inject IDialogService DialogService
|
||||
@implements IDisposable
|
||||
|
||||
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="py-1 px-1" Style="height: 100%;">
|
||||
@@ -32,18 +34,23 @@
|
||||
<CardHeaderContent>
|
||||
@PlaylistCardHeaderContent
|
||||
</CardHeaderContent>
|
||||
|
||||
<CardHeaderActions>
|
||||
<MudIconButton Icon="@(_isFavorite? Icons.Material.Filled.Star : Icons.Material.Outlined.StarBorder)"
|
||||
Color="Color.Warning"
|
||||
OnClick="ToggleFavorite"
|
||||
Disabled="_favoriteLoading"
|
||||
Size="Size.Medium" />
|
||||
|
||||
<MudIconButton Icon="@Icons.Material.Filled.Share"
|
||||
OnClick="SharePlaylist"
|
||||
Size="Size.Medium" />
|
||||
|
||||
@if (_isCreator && _isAuthenticated)
|
||||
{
|
||||
<MudIconButton Icon="@Icons.Material.Filled.Settings" OnClick="OpenPermissionsDialog" Size="Size.Medium" />
|
||||
}
|
||||
<MudIconButton Icon="@Icons.Material.Filled.Refresh" OnClick="LoadTracks" Disabled="@_tracksLoading" />
|
||||
<MudIconButton Icon="@Icons.Material.Filled.Refresh" OnClick="LoadTracks" Disabled="@_tracksLoading" Size="Size.Medium" />
|
||||
</CardHeaderActions>
|
||||
</MudCardHeader>
|
||||
|
||||
@@ -116,7 +123,10 @@
|
||||
OnClick="ToggleFavorite"
|
||||
Disabled="@_favoriteLoading"
|
||||
/>
|
||||
|
||||
|
||||
<MudMenuItem Icon="@Icons.Material.Filled.Share"
|
||||
OnClick="SharePlaylist"
|
||||
Label="Поделиться" />
|
||||
@if (_isCreator && _isAuthenticated)
|
||||
{
|
||||
<MudMenuItem Icon="@Icons.Material.Filled.Settings"
|
||||
@@ -405,6 +415,12 @@
|
||||
private bool _isFavorite;
|
||||
/// <summary>Загрузка признака "фаворит".</summary>
|
||||
private bool _favoriteLoading;
|
||||
|
||||
/********************************
|
||||
* Поделиться ссылкой
|
||||
*********************************/
|
||||
private IJSObjectReference? _shareModule;
|
||||
private bool _isWebShareSupported = false;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
@@ -417,6 +433,18 @@
|
||||
AudioPlayerService.OnEndedTrack += OnPlayerStateChanged;
|
||||
}
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
// Загружаем JS-модуль
|
||||
_shareModule = await JS.InvokeAsync<IJSObjectReference>("import", "/js/shareUtils.js");
|
||||
// Проверяем поддержку Web Share API
|
||||
_isWebShareSupported = await _shareModule.InvokeAsync<bool>("isSupported");
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPlayerStateChanged()
|
||||
{
|
||||
InvokeAsync(StateHasChanged);
|
||||
@@ -803,9 +831,58 @@
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Поделитьсы ссылкой
|
||||
/// <summary> Поделиться ссылкой </summary>
|
||||
private async Task SharePlaylist()
|
||||
{
|
||||
if (_shareModule == null) return;
|
||||
|
||||
var shareUrl = Navigation.Uri;
|
||||
var shareTitle = "🎵 Поделиться плейлистом";
|
||||
var shareText = _playlist?.Title != null
|
||||
? $"Послушайте плейлист '{_playlist.Title}'!"
|
||||
: "Послушайте этот плейлист!";
|
||||
|
||||
if (_isWebShareSupported)
|
||||
{
|
||||
var result = await _shareModule.InvokeAsync<ShareResult>("shareLink", shareTitle, shareText, shareUrl);
|
||||
if (result?.Success == false && !string.IsNullOrEmpty(result.Error) && !result.Cancelled)
|
||||
{
|
||||
Snackbar.Add($"Не удалось поделиться: {result.Error}", Severity.Warning);
|
||||
await ShowShareDialog(shareUrl);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
await ShowShareDialog(shareUrl);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary> Модальное окно, чтобы поделиться ссылкой </summary>
|
||||
private async Task ShowShareDialog(string url)
|
||||
{
|
||||
var parameters = new DialogParameters<ShareDialog>
|
||||
{
|
||||
{ x => x.ShareUrl, url }
|
||||
};
|
||||
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true };
|
||||
await DialogService.ShowAsync<ShareDialog>("Поделиться", parameters, options);
|
||||
}
|
||||
|
||||
// Вспомогательный класс для результата
|
||||
private class ShareResult
|
||||
{
|
||||
public bool Success { get; set; }
|
||||
public string? Error { get; set; }
|
||||
public bool Cancelled { get; set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
AudioPlayerService.OnStartedTrack -= OnPlayerStateChanged;
|
||||
AudioPlayerService.OnEndedTrack -= OnPlayerStateChanged;
|
||||
|
||||
_shareModule?.DisposeAsync();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user