Files
sufi-blazor/src/SufiChain.SufiBlazor/Components/Overlays/SbConfirmDialog.razor
T
pooria 3ff35dedb5
Release NuGet Packages / pack-and-push (release) Failing after 10m17s
first commit
2026-05-21 11:20:43 +03:30

197 lines
5.2 KiB
Plaintext

@namespace SufiChain.SufiBlazor.Components.Overlays
@using SufiChain.SufiBlazor.Components.Common
@using SufiChain.SufiBlazor.Components.Actions
@inject IStringLocalizer<SufiBlazorResource> L
@inject IStringLocalizer<SufiBlazorResource> L
@if (_isOpen)
{
<div class="sb-confirm-dialog-overlay" @onclick="OnOverlayClick">
<div class="sb-confirm-dialog sb-confirm-dialog--@Variant.ToString().ToLower() @Class" @onclick:stopPropagation="true" role="alertdialog" aria-modal="true">
@if (Icon != null)
{
<div class="sb-confirm-dialog__icon sb-confirm-dialog__icon--@Variant.ToString().ToLower()">
@Icon
</div>
}
else
{
<div class="sb-confirm-dialog__icon sb-confirm-dialog__icon--@Variant.ToString().ToLower()">
<SbIcon Name="@GetDefaultIconName()" Size="SbSize.Lg" />
</div>
}
<div class="sb-confirm-dialog__content">
<h3 class="sb-confirm-dialog__title">@Title</h3>
@if (!string.IsNullOrEmpty(Message))
{
<p class="sb-confirm-dialog__message">@Message</p>
}
@if (ChildContent != null)
{
<div class="sb-confirm-dialog__body">
@ChildContent
</div>
}
</div>
<div class="sb-confirm-dialog__actions">
@if (ShowCancelButton)
{
<SbButton Variant="SbButtonVariant.Ghost" OnClick="Cancel">@(CancelText ?? L["Cancel"])</SbButton>
}
<SbButton Variant="SbButtonVariant.Solid"
Color="@GetConfirmButtonColor()"
OnClick="Confirm">
@(ConfirmText ?? L["Confirm"])
</SbButton>
</div>
</div>
</div>
}
@code {
private bool _isOpen;
private TaskCompletionSource<bool>? _tcs;
/// <summary>
/// Dialog title.
/// </summary>
[Parameter]
public string Title { get; set; } = "Confirm";
/// <summary>
/// Dialog message.
/// </summary>
[Parameter]
public string? Message { get; set; }
/// <summary>
/// Dialog content.
/// </summary>
[Parameter]
public RenderFragment? ChildContent { get; set; }
/// <summary>
/// Custom icon.
/// </summary>
[Parameter]
public RenderFragment? Icon { get; set; }
/// <summary>
/// Dialog variant.
/// </summary>
[Parameter]
public SbConfirmDialogVariant Variant { get; set; } = SbConfirmDialogVariant.Default;
/// <summary>
/// Confirm button text.
/// </summary>
[Parameter]
public string? ConfirmText { get; set; }
/// <summary>
/// Cancel button text.
/// </summary>
[Parameter]
public string? CancelText { get; set; }
/// <summary>
/// Whether to show cancel button.
/// </summary>
[Parameter]
public bool ShowCancelButton { get; set; } = true;
/// <summary>
/// Whether clicking outside closes the dialog.
/// </summary>
[Parameter]
public bool CloseOnOverlayClick { get; set; } = true;
/// <summary>
/// Callback when confirmed.
/// </summary>
[Parameter]
public EventCallback OnConfirm { get; set; }
/// <summary>
/// Callback when cancelled.
/// </summary>
[Parameter]
public EventCallback OnCancel { get; set; }
/// <summary>
/// Additional CSS classes.
/// </summary>
[Parameter]
public string? Class { get; set; }
private string GetDefaultIconName() => Variant switch
{
SbConfirmDialogVariant.Danger => "warning",
SbConfirmDialogVariant.Warning => "warning",
SbConfirmDialogVariant.Info => "info",
_ => "help-circle"
};
private SbColor GetConfirmButtonColor() => Variant switch
{
SbConfirmDialogVariant.Danger => SbColor.Danger,
SbConfirmDialogVariant.Warning => SbColor.Warning,
SbConfirmDialogVariant.Info => SbColor.Info,
_ => SbColor.Primary
};
/// <summary>
/// Show the dialog and wait for result.
/// </summary>
public Task<bool> ShowAsync()
{
_tcs = new TaskCompletionSource<bool>();
_isOpen = true;
StateHasChanged();
return _tcs.Task;
}
/// <summary>
/// Show the dialog.
/// </summary>
public void Show()
{
_isOpen = true;
StateHasChanged();
}
/// <summary>
/// Close the dialog.
/// </summary>
public void Close()
{
_isOpen = false;
StateHasChanged();
}
private async Task Confirm()
{
_isOpen = false;
_tcs?.TrySetResult(true);
await OnConfirm.InvokeAsync();
}
private async Task Cancel()
{
_isOpen = false;
_tcs?.TrySetResult(false);
await OnCancel.InvokeAsync();
}
private async Task OnOverlayClick()
{
if (CloseOnOverlayClick)
{
await Cancel();
}
}
}