using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; namespace AntDesign { public partial class ModalService : IDisposable { internal event Func OnModalOpenEvent; internal event Func OnModalCloseEvent; private readonly NavigationManager _navigationManager; private readonly IJSRuntime _jsRuntime; /// /// constructor /// public ModalService(NavigationManager navigationManager, IJSRuntime jsRuntime) { _navigationManager = navigationManager; _navigationManager.LocationChanged += NavigationManager_LocationChanged; _jsRuntime = jsRuntime; } /// /// Destroy all reused Modal /// /// /// private async void NavigationManager_LocationChanged(object sender, Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs e) { if (Modal.ReusedModals.Count > 0) { // Since Modal cannot be captured, it can only be removed through JS await _jsRuntime.InvokeVoidAsync(JSInteropConstants.DestroyAllDialog); Modal.ReusedModals.Clear(); } } /// /// Create and open a Modal /// /// public Task CreateModalAsync(ModalOptions config) { if (config == null) { throw new ArgumentNullException(nameof(config)); } ModalRef modalRef = new ModalRef(config, this); config.ModalRef = modalRef; return CreateOrOpenModalAsync(modalRef); } /// /// Create and open template modal /// /// /// /// /// /// public Task CreateModalAsync(ModalOptions config, TComponentOptions componentOptions) where TComponent : ModalTemplate { if (config == null) { throw new ArgumentNullException(nameof(config)); } ModalRef modalRef = new ModalRef(config, this); void Child(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { builder.OpenComponent(0); builder.AddAttribute(1, "ModalRef", modalRef); builder.AddAttribute(2, "Options", componentOptions); builder.CloseComponent(); } config.Content = Child; config.ModalRef = modalRef; return CreateOrOpenModalAsync(modalRef); } internal Task CreateOrOpenModalAsync(ModalRef modalRef) { OnModalOpenEvent?.Invoke(modalRef); return Task.FromResult(modalRef); } internal Task CloseModalAsync(ModalRef modalRef) { if (OnModalCloseEvent != null) { return OnModalCloseEvent.Invoke(modalRef); } return Task.CompletedTask; } /// /// Implement the interface IDisposable /// public void Dispose() { _navigationManager.LocationChanged -= NavigationManager_LocationChanged; GC.SuppressFinalize(this); } } }