namespace Hyperbar.Windows.Primary; public class PrimaryWidgetConfigurationHandler(IMediator mediator, PrimaryWidgetConfiguration configuration, IFactory factory, ICache cache) : INotificationHandler> { public async Task Handle(ConfigurationChanged notification, CancellationToken cancellationToken) { List<(Guid ParentId, Guid Id, PrimaryCommandConfiguration Configuration)> items = []; void AddToItems(Guid parentId, Guid id, List configurations) { if (configurations is null) { return; } Stack<(Guid, List)> stack = new(); stack.Push((parentId, configurations)); while (stack.Count > 0) { (Guid currentParentId, List currentConfigurations) = stack.Pop(); foreach (PrimaryCommandConfiguration configuration in currentConfigurations) { items.Add((currentParentId, configuration.Id, configuration)); if (configuration.Commands is not null && configuration.Commands.Count > 0) { stack.Push((configuration.Id, configuration.Commands)); } } } } AddToItems(Guid.Empty, Guid.Empty, configuration.Commands); foreach (KeyValuePair item in cache .Where(x => !items.Any(k => x.Key == k.Id))) { await mediator.PublishAsync(new Removed(item.Value), nameof(PrimaryWidgetViewModel), cancellationToken); cache.Remove(item.Key); } foreach ((Guid ParentId, Guid Id, PrimaryCommandConfiguration Configuration) item in items.Where(x => !cache.Any(k => x.Id == k.Key))) { if (factory.Create(item.Configuration) is IWidgetComponentViewModel viewModel) { await mediator.PublishAsync(new Inserted(item.Configuration.Order, viewModel), nameof(PrimaryWidgetViewModel), cancellationToken); } } } }