From 819d796c16b14ec7b3eeee4ae12e7aaf56b5d57e Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Tue, 14 May 2024 19:24:07 +0100 Subject: [PATCH] Improve Publisher --- Bitvault.Avalonia/App.axaml.cs | 4 +++ Bitvault.Avalonia/AppHandler.cs | 8 +++-- Bitvault.Avalonia/ArchiveItemActionView.axaml | 1 + Bitvault/ArchiveItemActionViewModel.cs | 2 +- Bitvault/ConfirmItemActionViewModel.cs | 2 +- Bitvault/ContainerActivatedHandler.cs | 9 ++--- Bitvault/ContainerHeaderViewModel.cs | 3 +- Bitvault/ContainerNavigationViewModel.cs | 12 +++---- Bitvault/ContainerViewModel.cs | 11 +++--- Bitvault/ContainerViewModelHandler.cs | 19 ++++++----- Bitvault/CreateContainerHandler.cs | 2 +- Bitvault/CreateItemHandler.cs | 34 +++++++++++++++++-- Bitvault/DeleteItemActionViewModel.cs | 2 +- Bitvault/EditItemActionViewModel.cs | 2 +- .../FilterContainerNavigationViewModel.cs | 8 ++--- Bitvault/IContainerComponent.cs | 2 +- Bitvault/Item.cs | 1 - Bitvault/ItemActivatedHandler.cs | 9 ++--- Bitvault/ItemNavigationViewModel.cs | 3 +- Bitvault/ItemViewModel.cs | 4 +-- Bitvault/MainViewModelHandler.cs | 9 ++--- Bitvault/OpenContainerViewModel.cs | 2 +- 22 files changed, 91 insertions(+), 58 deletions(-) diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index 5a16779..bf0f88e 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -98,8 +98,12 @@ public partial class App : Application services.AddTemplate(); + services.AddHandler(ServiceLifetime.Singleton); services.AddHandler(); + + services.AddScoped, ValueStore>(); + services.AddHandler(ServiceLifetime.Scoped); }); })!); diff --git a/Bitvault.Avalonia/AppHandler.cs b/Bitvault.Avalonia/AppHandler.cs index d26729e..23cb017 100644 --- a/Bitvault.Avalonia/AppHandler.cs +++ b/Bitvault.Avalonia/AppHandler.cs @@ -9,16 +9,18 @@ namespace Bitvault.Avalonia; public class AppHandler(IPublisher publisher) : INotificationHandler { - public async Task Handle(StartedEventArgs args, CancellationToken cancellationToken = default) + public Task Handle(StartedEventArgs args) { if (Application.Current is Application application) { if (application.ApplicationLifetime is IApplicationLifetime lifetime) { - await publisher.Publish(new NavigateEventArgs(lifetime is IClassicDesktopStyleApplicationLifetime ? "MainWindow" : "Main", + publisher.Publish(new NavigateEventArgs(lifetime is IClassicDesktopStyleApplicationLifetime ? "MainWindow" : "Main", lifetime is IClassicDesktopStyleApplicationLifetime ? typeof(IClassicDesktopStyleApplicationLifetime) : - typeof(ISingleViewApplicationLifetime)), cancellationToken); + typeof(ISingleViewApplicationLifetime))); } } + + return Task.CompletedTask; } } \ No newline at end of file diff --git a/Bitvault.Avalonia/ArchiveItemActionView.axaml b/Bitvault.Avalonia/ArchiveItemActionView.axaml index 1eeffa9..219ba78 100644 --- a/Bitvault.Avalonia/ArchiveItemActionView.axaml +++ b/Bitvault.Avalonia/ArchiveItemActionView.axaml @@ -10,6 +10,7 @@ VerticalAlignment="Center" Command="{Binding InvokeCommand}" Foreground="{DynamicResource IconForegroundBrush}" + HotKey="Delete" ToolTip.Tip="Archive"> await Publisher.Publish(Archive.As()); + public void Invoke() => Publisher.Publish(Archive.As()); } diff --git a/Bitvault/ConfirmItemActionViewModel.cs b/Bitvault/ConfirmItemActionViewModel.cs index cec56e1..78b32dc 100644 --- a/Bitvault/ConfirmItemActionViewModel.cs +++ b/Bitvault/ConfirmItemActionViewModel.cs @@ -12,5 +12,5 @@ public partial class ConfirmItemActionViewModel(IServiceProvider provider, { [RelayCommand] - public async Task Invoke() => await Publisher.Publish(Confirm.As()); + public void Invoke() => Publisher.Publish(Confirm.As()); } diff --git a/Bitvault/ContainerActivatedHandler.cs b/Bitvault/ContainerActivatedHandler.cs index 80fd71d..5f243d8 100644 --- a/Bitvault/ContainerActivatedHandler.cs +++ b/Bitvault/ContainerActivatedHandler.cs @@ -8,8 +8,7 @@ public class ContainerActivatedHandler(IContainerHostCollection containers, IPublisher publisher) : INotificationHandler> { - public async Task Handle(ActivatedEventArgs args, - CancellationToken cancellationToken = default) + public Task Handle(ActivatedEventArgs args) { if (args.Value is IComponentHost container) { @@ -24,11 +23,13 @@ public class ContainerActivatedHandler(IContainerHostCollection containers, { if (serviceFactory.Create(configuration.Name) is ContainerNavigationViewModel viewModel) { - await publisher.Publish(new InsertEventArgs(index, viewModel), - nameof(MainViewModel), cancellationToken); + publisher.Publish(new InsertEventArgs(index, viewModel), + nameof(MainViewModel)); } } } } + + return Task.CompletedTask; } } \ No newline at end of file diff --git a/Bitvault/ContainerHeaderViewModel.cs b/Bitvault/ContainerHeaderViewModel.cs index 85b493e..8a74c21 100644 --- a/Bitvault/ContainerHeaderViewModel.cs +++ b/Bitvault/ContainerHeaderViewModel.cs @@ -20,8 +20,7 @@ public partial class ContainerHeaderViewModel : ObservableCollectionViewModel> args, - CancellationToken cancellationToken = default) + public Task Handle(RequestEventArgs> args) { if (args.Value is Filter filter) { diff --git a/Bitvault/ContainerNavigationViewModel.cs b/Bitvault/ContainerNavigationViewModel.cs index ed8a991..2cf537e 100644 --- a/Bitvault/ContainerNavigationViewModel.cs +++ b/Bitvault/ContainerNavigationViewModel.cs @@ -41,8 +41,7 @@ public partial class ContainerNavigationViewModel : public IContentTemplate Template { get; set; } - public Task Handle(OpenedEventArgs args, - CancellationToken cancellationToken = default) + public Task Handle(OpenedEventArgs args) { Add("All"); Add("Starred"); @@ -53,8 +52,7 @@ public partial class ContainerNavigationViewModel : return Task.CompletedTask; } - public Task Handle(ClosedEventArgs args, - CancellationToken cancellationToken = default) + public Task Handle(ClosedEventArgs args) { Opened = true; Clear(); @@ -62,11 +60,9 @@ public partial class ContainerNavigationViewModel : return Task.CompletedTask; } - public Task Handle(DeactivatedEventArgs args, - CancellationToken cancellationToken = default) => + public Task Handle(DeactivatedEventArgs args) => Task.FromResult(Activated = false); - public Task Handle(ActivatedEventArgs args, - CancellationToken cancellationToken = default) => + public Task Handle(ActivatedEventArgs args) => Task.FromResult(Activated = true); } \ No newline at end of file diff --git a/Bitvault/ContainerViewModel.cs b/Bitvault/ContainerViewModel.cs index 4043380..27359ed 100644 --- a/Bitvault/ContainerViewModel.cs +++ b/Bitvault/ContainerViewModel.cs @@ -26,24 +26,25 @@ public partial class ContainerViewModel(IServiceProvider provider, public override async Task OnActivated() { - await Publisher.Publish(Activated.As()); + Publisher.Publish(Activated.As()); await base.OnActivated(); } public override async Task OnDeactivated() { - await Publisher.Publish(Deactivated.As()); + Publisher.Publish(Deactivated.As()); await base.OnDeactivated(); } - public async Task Handle(RequestEventArgs> args, - CancellationToken cancellationToken = default) + public Task Handle(RequestEventArgs> args) { if (args.Value is Filter filter) { Filter = filter.Value; - await Enumerate(); + Enumerate(); } + + return Task.CompletedTask; } protected override IEnumerate PrepareEnumeration(object? key) => diff --git a/Bitvault/ContainerViewModelHandler.cs b/Bitvault/ContainerViewModelHandler.cs index b6ff82c..55991d1 100644 --- a/Bitvault/ContainerViewModelHandler.cs +++ b/Bitvault/ContainerViewModelHandler.cs @@ -12,8 +12,7 @@ public class ContainerViewModelHandler(IDbContextFactory dbC IPublisher publisher) : INotificationHandler> { - public async Task Handle(Enumerate args, - CancellationToken cancellationToken = default) + public async Task Handle(Enumerate args) { if (args.Options is ContainerViewModelConfiguration configuration) { @@ -36,7 +35,7 @@ public class ContainerViewModelHandler(IDbContextFactory dbC predicate = predicate.And(x => x.State == 3); } - var items = await Task.Run(async () => + var results = await Task.Run(async () => { using ContainerDbContext context = dbContextFactory.CreateDbContext(); return await context.Set().Where(predicate).Select(x => new @@ -44,19 +43,21 @@ public class ContainerViewModelHandler(IDbContextFactory dbC x.Id, x.Name }).OrderBy(x => x.Name).ToListAsync(); - - }, cancellationToken); + }); bool selected = true; - foreach (var item in items) + foreach (var result in results) { IServiceScope serviceScope = serviceProvider.CreateScope(); IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService(); + IValueStore valueStore = serviceScope.ServiceProvider.GetRequiredService>(); - if (serviceFactory.Create(item.Id, item.Name, "Description " + 1, selected) is ItemNavigationViewModel viewModel) + if (serviceFactory.Create(result.Id, result.Name, "Description " + 1, selected) is ItemNavigationViewModel viewModel) { - cache.Add(new Item { Id = item.Id, Name = item.Name }); - await publisher.Publish(Create.As(viewModel), nameof(ContainerViewModel), cancellationToken); + Item item = new() { Id = result.Id, Name = result.Name }; + valueStore.Set(item); + + publisher.Publish(Create.As(viewModel), nameof(ContainerViewModel)); } selected = false; diff --git a/Bitvault/CreateContainerHandler.cs b/Bitvault/CreateContainerHandler.cs index 6d95005..9427750 100644 --- a/Bitvault/CreateContainerHandler.cs +++ b/Bitvault/CreateContainerHandler.cs @@ -33,7 +33,7 @@ public class CreateContainerHandler(IContainerFactory componentFactory, configuration.Write(args => args.Key = $"{Convert.ToBase64String(key.Salt)}:{Convert.ToBase64String(key.EncryptedKey)}:{Convert.ToBase64String(key.DecryptedKey)}"); host.Start(); - await publisher.Publish(Activated.As(host), cancellationToken); + publisher.Publish(Activated.As(host), cancellationToken); return true; } } diff --git a/Bitvault/CreateItemHandler.cs b/Bitvault/CreateItemHandler.cs index 08b164b..9544240 100644 --- a/Bitvault/CreateItemHandler.cs +++ b/Bitvault/CreateItemHandler.cs @@ -1,11 +1,41 @@ using Bitvault.Data; -using HarfBuzzSharp; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.Extensions.Configuration; using Toolkit.Foundation; namespace Bitvault; +public class ArchiveItemHandler(IValueStore valueStore, + IDbContextFactory dbContextFactory) : + INotificationHandler> +{ + public async Task Handle(ArchiveEventArgs args) + { + try + { + if (valueStore.Value is Item item) + { + await Task.Run(async () => + { + using ContainerDbContext context = await dbContextFactory.CreateDbContextAsync(); + + if (await context.FindAsync(item.Id) is ItemEntry result) + { + result.State = 3; + await context.SaveChangesAsync(); + } + }); + } + } + catch + { + + } + } +} + + public class CreateItemHandler(IDbContextFactory dbContextFactory, IPublisher publisher) : IHandler, bool> @@ -30,7 +60,7 @@ public class CreateItemHandler(IDbContextFactory dbContextFa if (result is not null) { Item item = new() { Id = result.Entity.Id, Name = configuration.Name }; - await publisher.Publish(Activated.As(item), cancellationToken); + publisher.Publish(Activated.As(item), cancellationToken); return true; } diff --git a/Bitvault/DeleteItemActionViewModel.cs b/Bitvault/DeleteItemActionViewModel.cs index f139ef1..85f1112 100644 --- a/Bitvault/DeleteItemActionViewModel.cs +++ b/Bitvault/DeleteItemActionViewModel.cs @@ -11,5 +11,5 @@ public partial class DeleteItemActionViewModel(IServiceProvider provider, IDisposer disposer) : ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer) { [RelayCommand] - public async Task Invoke() => await Publisher.Publish(Delete.As()); + public void Invoke() => Publisher.Publish(Delete.As()); } diff --git a/Bitvault/EditItemActionViewModel.cs b/Bitvault/EditItemActionViewModel.cs index 0f056c4..7a35bdd 100644 --- a/Bitvault/EditItemActionViewModel.cs +++ b/Bitvault/EditItemActionViewModel.cs @@ -11,6 +11,6 @@ public partial class EditItemActionViewModel(IServiceProvider provider, IDisposer disposer) : ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer) { [RelayCommand] - public async Task Invoke() => await Publisher.Publish(Edit.As()); + public void Invoke() => Publisher.Publish(Edit.As()); } diff --git a/Bitvault/FilterContainerNavigationViewModel.cs b/Bitvault/FilterContainerNavigationViewModel.cs index 1273066..db94cf2 100644 --- a/Bitvault/FilterContainerNavigationViewModel.cs +++ b/Bitvault/FilterContainerNavigationViewModel.cs @@ -29,14 +29,12 @@ public partial class FilterContainerNavigationViewModel : ObservableViewModel, Filter = filter; } - public Task Handle(DeactivatedEventArgs args, - CancellationToken cancellationToken = default) => + public Task Handle(DeactivatedEventArgs args) => Task.FromResult(Activated = false); - public Task Handle(ActivatedEventArgs args, - CancellationToken cancellationToken = default) => + public Task Handle(ActivatedEventArgs args) => Task.FromResult(Activated = true); [RelayCommand] - public async Task Invoke() => await Publisher.Publish(Request.As(new Filter(Filter)), nameof(ContainerViewModel)); + public void Invoke() => Publisher.Publish(Request.As(new Filter(Filter)), nameof(ContainerViewModel)); } \ No newline at end of file diff --git a/Bitvault/IContainerComponent.cs b/Bitvault/IContainerComponent.cs index cd260ac..f428881 100644 --- a/Bitvault/IContainerComponent.cs +++ b/Bitvault/IContainerComponent.cs @@ -2,4 +2,4 @@ namespace Bitvault; -public interface IContainerComponent : IComponent; +public interface IContainerComponent : IComponent; \ No newline at end of file diff --git a/Bitvault/Item.cs b/Bitvault/Item.cs index 3f54422..3f585dc 100644 --- a/Bitvault/Item.cs +++ b/Bitvault/Item.cs @@ -5,6 +5,5 @@ public record Item public int Id { get; init; } public string? Name { get; init; } - } diff --git a/Bitvault/ItemActivatedHandler.cs b/Bitvault/ItemActivatedHandler.cs index ad9d040..934f197 100644 --- a/Bitvault/ItemActivatedHandler.cs +++ b/Bitvault/ItemActivatedHandler.cs @@ -9,8 +9,7 @@ public class ItemActivatedHandler(IServiceProvider serviceProvider, IPublisher publisher) : INotificationHandler> { - public async Task Handle(ActivatedEventArgs args, - CancellationToken cancellationToken = default) + public Task Handle(ActivatedEventArgs args) { if (args.Value is Item item) { @@ -20,10 +19,12 @@ public class ItemActivatedHandler(IServiceProvider serviceProvider, cache.Add(item); int index = cache.IndexOf(item); - if (serviceFactory.Create(item.Id, item.Name, "Description " + 1) is ItemNavigationViewModel viewModel) + if (serviceFactory.Create(item.Id, item.Name, "Description " + 1, true) is ItemNavigationViewModel viewModel) { - await publisher.Publish(Insert.As(index, viewModel), nameof(ContainerViewModel), cancellationToken); + publisher.Publish(Insert.As(index, viewModel), nameof(ContainerViewModel)); } } + + return Task.CompletedTask; } } \ No newline at end of file diff --git a/Bitvault/ItemNavigationViewModel.cs b/Bitvault/ItemNavigationViewModel.cs index 7e2aae9..bdedb1a 100644 --- a/Bitvault/ItemNavigationViewModel.cs +++ b/Bitvault/ItemNavigationViewModel.cs @@ -36,8 +36,7 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, public IContentTemplate Template { get; set; } = template; - public Task Handle(ArchiveEventArgs args, - CancellationToken cancellationToken = default) + public Task Handle(ArchiveEventArgs args) { Dispose(); return Task.CompletedTask; diff --git a/Bitvault/ItemViewModel.cs b/Bitvault/ItemViewModel.cs index a286f01..e442716 100644 --- a/Bitvault/ItemViewModel.cs +++ b/Bitvault/ItemViewModel.cs @@ -38,7 +38,7 @@ public partial class ItemViewModel : public IContentTemplate Template { get; set; } - public async Task Handle(ConfirmEventArgs args, CancellationToken cancellationToken = default) + public async Task Handle(ConfirmEventArgs args) { ItemConfiguration configuration = new(); foreach (IItemViewModel item in this) @@ -46,6 +46,6 @@ public partial class ItemViewModel : item.Invoke(configuration); } - await Mediator.Handle, bool>(Create.As(configuration), cancellationToken); + await Mediator.Handle, bool>(Create.As(configuration)); } } diff --git a/Bitvault/MainViewModelHandler.cs b/Bitvault/MainViewModelHandler.cs index 0d5b0a4..2c1cb47 100644 --- a/Bitvault/MainViewModelHandler.cs +++ b/Bitvault/MainViewModelHandler.cs @@ -7,8 +7,7 @@ public class MainViewModelHandler(IPublisher publisher, IContainerHostCollection containers) : INotificationHandler> { - public async Task Handle(EnumerateEventArgs args, - CancellationToken cancellationToken = default) + public Task Handle(EnumerateEventArgs args) { foreach (IComponentHost container in containers.OrderBy(x => x.GetConfiguration() is ContainerConfiguration configuration ? configuration.Name : null)) @@ -19,11 +18,13 @@ public class MainViewModelHandler(IPublisher publisher, { if (factory.Create(configuration.Name) is ContainerNavigationViewModel viewModel) { - await publisher.Publish(new CreateEventArgs(viewModel), - nameof(MainViewModel), cancellationToken); + publisher.Publish(new CreateEventArgs(viewModel), + nameof(MainViewModel)); } } } } + + return Task.CompletedTask; } } \ No newline at end of file diff --git a/Bitvault/OpenContainerViewModel.cs b/Bitvault/OpenContainerViewModel.cs index fee8524..fb48972 100644 --- a/Bitvault/OpenContainerViewModel.cs +++ b/Bitvault/OpenContainerViewModel.cs @@ -22,7 +22,7 @@ public partial class OpenContainerViewModel(IServiceProvider provider, { if (await Mediator.Handle, bool>(Activate.As(new Container(Password)))) { - await Publisher.Publish(Opened.As()); + Publisher.Publish(Opened.As()); } } }