Разбиение по компонентам
This commit is contained in:
85
PlaylistShared.Pwa/Components/Common/ShareButton.razor
Normal file
85
PlaylistShared.Pwa/Components/Common/ShareButton.razor
Normal file
@@ -0,0 +1,85 @@
|
||||
@inject IJSRuntime JS
|
||||
@inject ISnackbar Snackbar
|
||||
@inject NavigationManager Navigation
|
||||
|
||||
<MudIconButton Icon="@Icons.Material.Filled.Share"
|
||||
Color="Color.Default"
|
||||
OnClick="@TogglePopover"
|
||||
Title="Поделиться"
|
||||
Size="Size.Medium" />
|
||||
|
||||
<MudPopover Open="@_popoverOpen"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
TransformOrigin="Origin.TopCenter"
|
||||
RelativeWidth="DropdownWidth.Adaptive"
|
||||
Paper="true">
|
||||
<MudPaper Class="pa-4">
|
||||
<MudText Typo="Typo.body2" Class="mb-2">Ссылка для приглашения:</MudText>
|
||||
<div style="display: flex; gap: 8px; align-items: center;">
|
||||
<MudTextField @bind-Value="_shareUrl"
|
||||
ReadOnly="true"
|
||||
Variant="Variant.Outlined"
|
||||
FullWidth="true" />
|
||||
<MudIconButton Variant="Variant.Filled"
|
||||
Color="Color.Primary"
|
||||
Size="Size.Medium"
|
||||
OnClick="CopyLink"
|
||||
Icon="@Icons.Material.Filled.ContentCopy">
|
||||
</MudIconButton>
|
||||
</div>
|
||||
</MudPaper>
|
||||
</MudPopover>
|
||||
|
||||
@code {
|
||||
private bool _popoverOpen;
|
||||
private string _shareUrl = "";
|
||||
|
||||
/// <summary>
|
||||
/// Ссылка для копирования. Если не указана, используется текущий URL страницы.
|
||||
/// </summary>
|
||||
[Parameter] public string ShareUrl { get; set; } = string.Empty;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
if (string.IsNullOrEmpty(ShareUrl))
|
||||
ShareUrl = Navigation.Uri;
|
||||
}
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(ShareUrl))
|
||||
_shareUrl = ShareUrl;
|
||||
}
|
||||
|
||||
private async Task TogglePopover()
|
||||
{
|
||||
if (_popoverOpen)
|
||||
{
|
||||
_popoverOpen = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (string.IsNullOrEmpty(ShareUrl))
|
||||
{
|
||||
Snackbar.Add("Ссылка недоступна", Severity.Warning);
|
||||
return;
|
||||
}
|
||||
_shareUrl = ShareUrl;
|
||||
_popoverOpen = true;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task CopyLink()
|
||||
{
|
||||
try
|
||||
{
|
||||
await JS.InvokeVoidAsync("navigator.clipboard.writeText", _shareUrl);
|
||||
Snackbar.Add("Ссылка скопирована в буфер обмена", Severity.Success);
|
||||
_popoverOpen = false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Snackbar.Add($"Не удалось скопировать ссылку: {ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
|
||||
<div class="track-cover-container"
|
||||
@onmouseenter="HandleMouseEnter"
|
||||
@onmouseleave="HandleMouseLeave"
|
||||
style="position: relative; display: inline-block; cursor: pointer;">
|
||||
|
||||
<MudImage Src="@FormatCoverUrl(CoverUrl)" Height="@Height" Width="@Width" Class="rounded" Style="display: block;" />
|
||||
|
||||
@if (_isHovered || IsPlaying)
|
||||
{
|
||||
<div class="play-overlay"
|
||||
style="position: absolute; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background: rgba(0,0,0,0.6);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 4px;">
|
||||
<MudIconButton Icon="@(IsPlaying? Icons.Material.Filled.Pause : Icons.Material.Filled.PlayArrow)"
|
||||
Color="Color.Inherit"
|
||||
Size="Size.Large"
|
||||
OnClick="OnPlayClick" />
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter] public string CoverUrl { get; set; } = string.Empty;
|
||||
[Parameter] public string TrackId { get; set; } = string.Empty;
|
||||
[Parameter] public bool IsPlaying { get; set; } = false;
|
||||
[Parameter] public EventCallback<string> OnPlay { get; set; }
|
||||
[Parameter] public int Height { get; set; } = 50;
|
||||
[Parameter] public int Width { get; set; } = 50;
|
||||
|
||||
private bool _isHovered;
|
||||
|
||||
private void HandleMouseEnter() => _isHovered = true;
|
||||
private void HandleMouseLeave() => _isHovered = false;
|
||||
|
||||
private async Task OnPlayClick()
|
||||
{
|
||||
await OnPlay.InvokeAsync(TrackId);
|
||||
}
|
||||
|
||||
private string FormatCoverUrl(string? url)
|
||||
{
|
||||
if (string.IsNullOrEmpty(url)) return "";
|
||||
return "https://" + url.Replace("%%", $"{Width}x{Height}");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user