diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index 31ef6cd..f267988 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -89,7 +89,7 @@ public partial class App : Application services.AddTemplate(); - services.AddHandler(); + services.AddHandler(); }); })!); diff --git a/Bitvault.Avalonia/AppHandler.cs b/Bitvault.Avalonia/AppHandler.cs index cc0fe7c..d26729e 100644 --- a/Bitvault.Avalonia/AppHandler.cs +++ b/Bitvault.Avalonia/AppHandler.cs @@ -7,15 +7,15 @@ using Toolkit.Foundation; namespace Bitvault.Avalonia; public class AppHandler(IPublisher publisher) : - INotificationHandler + INotificationHandler { - public async Task Handle(Started args, CancellationToken cancellationToken = default) + public async Task Handle(StartedEventArgs args, CancellationToken cancellationToken = default) { if (Application.Current is Application application) { if (application.ApplicationLifetime is IApplicationLifetime lifetime) { - await publisher.Publish(new Navigate(lifetime is IClassicDesktopStyleApplicationLifetime ? "MainWindow" : "Main", + await publisher.Publish(new NavigateEventArgs(lifetime is IClassicDesktopStyleApplicationLifetime ? "MainWindow" : "Main", lifetime is IClassicDesktopStyleApplicationLifetime ? typeof(IClassicDesktopStyleApplicationLifetime) : typeof(ISingleViewApplicationLifetime)), cancellationToken); } diff --git a/Bitvault/Closed.cs b/Bitvault/Closed.cs index 26c2740..8f7b240 100644 --- a/Bitvault/Closed.cs +++ b/Bitvault/Closed.cs @@ -1,3 +1,10 @@ -namespace Bitvault; +using Toolkit.Foundation; -public record Closed; \ No newline at end of file +namespace Bitvault; + +public record Closed +{ + public static ChangedEventArgs As(TValue value) => new(value); + + public static ChangedEventArgs As() where TValue : new() => new(new TValue()); +} diff --git a/Bitvault/ClosedEventArgs.cs b/Bitvault/ClosedEventArgs.cs new file mode 100644 index 0000000..de4ca18 --- /dev/null +++ b/Bitvault/ClosedEventArgs.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record ClosedEventArgs(TValue? Value = default); diff --git a/Bitvault/Container.cs b/Bitvault/Container.cs index 7ed1bad..d906bb4 100644 --- a/Bitvault/Container.cs +++ b/Bitvault/Container.cs @@ -2,8 +2,6 @@ namespace Bitvault; -public record Container(TValue? Value = default); - public record Container { public Container(string name, string password) @@ -17,10 +15,10 @@ public record Container Password = password; } + public Container() + { - public static Container As(TValue value) => new(value); - - public static Container As() where TValue : new() => new(new TValue()); + } [MaybeNull] diff --git a/Bitvault/ContainerActivatedHandler.cs b/Bitvault/ContainerActivatedHandler.cs index 2f11f28..92fdb30 100644 --- a/Bitvault/ContainerActivatedHandler.cs +++ b/Bitvault/ContainerActivatedHandler.cs @@ -1,13 +1,15 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Toolkit.Foundation; namespace Bitvault; public class ContainerActivatedHandler(IContainerHostCollection containers, IPublisher publisher) : - INotificationHandler> + INotificationHandler> { - public async Task Handle(Activated args, CancellationToken cancellationToken = default) + public async Task Handle(ActivatedEventArgs args, + CancellationToken cancellationToken = default) { if (args.Value is IComponentHost container) { @@ -18,15 +20,26 @@ public class ContainerActivatedHandler(IContainerHostCollection containers, if (container.Services.GetRequiredService() is ContainerConfiguration configuration) { - if (container.Services.GetRequiredService() is IServiceFactory factory) + if (container.Services.GetRequiredService() is IServiceFactory serviceFactory) { - if (factory.Create(configuration.Name) is ContainerNavigationViewModel viewModel) + if (serviceFactory.Create(configuration.Name) is ContainerNavigationViewModel viewModel) { - await publisher.Publish(new Insert(index, viewModel), + await publisher.Publish(new InsertEventArgs(index, viewModel), nameof(MainViewModel), cancellationToken); } } } } } +} + +public class ItemActivatedHandler(IServiceFactory serviceFactory, + IPublisher publisher) : + INotificationHandler> +{ + public async Task Handle(ActivatedEventArgs args, + CancellationToken cancellationToken = default) + { + + } } \ No newline at end of file diff --git a/Bitvault/ContainerHeaderViewModel.cs b/Bitvault/ContainerHeaderViewModel.cs index aff9c41..1f4a9d0 100644 --- a/Bitvault/ContainerHeaderViewModel.cs +++ b/Bitvault/ContainerHeaderViewModel.cs @@ -3,7 +3,7 @@ namespace Bitvault; public partial class ContainerHeaderViewModel : ObservableCollectionViewModel, - INotificationHandler>> + INotificationHandler>> { public ContainerHeaderViewModel(IServiceProvider provider, IServiceFactory factory, @@ -20,7 +20,7 @@ public partial class ContainerHeaderViewModel : ObservableCollectionViewModel> args, + public Task Handle(ActivateEventArgs> args, CancellationToken cancellationToken = default) { if (args.Value is Filter filter) diff --git a/Bitvault/ContainerNavigationViewModel.cs b/Bitvault/ContainerNavigationViewModel.cs index 6af880f..ed8a991 100644 --- a/Bitvault/ContainerNavigationViewModel.cs +++ b/Bitvault/ContainerNavigationViewModel.cs @@ -6,10 +6,10 @@ namespace Bitvault; public partial class ContainerNavigationViewModel : ObservableCollectionViewModel, IMainNavigationViewModel, - INotificationHandler>, - INotificationHandler>, - INotificationHandler>, - INotificationHandler> + INotificationHandler>, + INotificationHandler>, + INotificationHandler>, + INotificationHandler> { [ObservableProperty] private bool activated; @@ -41,7 +41,7 @@ public partial class ContainerNavigationViewModel : public IContentTemplate Template { get; set; } - public Task Handle(Container args, + public Task Handle(OpenedEventArgs args, CancellationToken cancellationToken = default) { Add("All"); @@ -53,7 +53,7 @@ public partial class ContainerNavigationViewModel : return Task.CompletedTask; } - public Task Handle(Container args, + public Task Handle(ClosedEventArgs args, CancellationToken cancellationToken = default) { Opened = true; @@ -62,11 +62,11 @@ public partial class ContainerNavigationViewModel : return Task.CompletedTask; } - public Task Handle(Container args, + public Task Handle(DeactivatedEventArgs args, CancellationToken cancellationToken = default) => Task.FromResult(Activated = false); - public Task Handle(Container args, + public Task Handle(ActivatedEventArgs args, CancellationToken cancellationToken = default) => Task.FromResult(Activated = true); } \ No newline at end of file diff --git a/Bitvault/ContainerViewModel.cs b/Bitvault/ContainerViewModel.cs index 2ffeff2..4043380 100644 --- a/Bitvault/ContainerViewModel.cs +++ b/Bitvault/ContainerViewModel.cs @@ -14,7 +14,7 @@ public partial class ContainerViewModel(IServiceProvider provider, IContentTemplate template, NamedComponent named, string? filter = null) : ObservableCollectionViewModel(provider, factory, mediator, publisher, subscriber, disposer), - INotificationHandler>> + INotificationHandler>> { [ObservableProperty] private string? filter = filter; @@ -24,19 +24,19 @@ public partial class ContainerViewModel(IServiceProvider provider, public IContentTemplate Template { get; set; } = template; - public override async Task Activated() + public override async Task OnActivated() { - await Publisher.Publish(Container.As()); - await base.Activated(); + await Publisher.Publish(Activated.As()); + await base.OnActivated(); } - public override async Task Deactivated() + public override async Task OnDeactivated() { - await Publisher.Publish(Container.As()); - await base.Deactivated(); + await Publisher.Publish(Deactivated.As()); + await base.OnDeactivated(); } - public async Task Handle(Container> args, + public async Task Handle(RequestEventArgs> args, CancellationToken cancellationToken = default) { if (args.Value is Filter filter) @@ -47,5 +47,5 @@ public partial class ContainerViewModel(IServiceProvider provider, } protected override IEnumerate PrepareEnumeration(object? key) => - Enumerate.With(new ContainerViewModelConfiguration { Filter = Filter }) with { Key = key }; + EnumerateEventArgs.With(new ContainerViewModelConfiguration { Filter = Filter }) with { Key = key }; } \ No newline at end of file diff --git a/Bitvault/ContainerViewModelHandler.cs b/Bitvault/ContainerViewModelHandler.cs index 657a027..24692e5 100644 --- a/Bitvault/ContainerViewModelHandler.cs +++ b/Bitvault/ContainerViewModelHandler.cs @@ -51,7 +51,7 @@ public class ContainerViewModelHandler(IDbContextFactory dbC if (serviceFactory.Create(item.Id, item.Name, "Description " + 1) is ItemNavigationViewModel viewModel) { - await publisher.Publish(new Create(viewModel), + await publisher.Publish(new CreateEventArgs(viewModel), nameof(ContainerViewModel), cancellationToken); } } diff --git a/Bitvault/CreateContainerHandler.cs b/Bitvault/CreateContainerHandler.cs index f451ab8..6d95005 100644 --- a/Bitvault/CreateContainerHandler.cs +++ b/Bitvault/CreateContainerHandler.cs @@ -7,9 +7,9 @@ namespace Bitvault; public class CreateContainerHandler(IContainerFactory componentFactory, IPublisher publisher) : - IHandler, bool> + IHandler, bool> { - public async Task Handle(Create args, + public async Task Handle(CreateEventArgs args, CancellationToken cancellationToken) { if (args.Value is Container container && container.Name is { Length: > 0 } name && diff --git a/Bitvault/CreateContainerViewModel.cs b/Bitvault/CreateContainerViewModel.cs index 51d19e5..d39f85a 100644 --- a/Bitvault/CreateContainerViewModel.cs +++ b/Bitvault/CreateContainerViewModel.cs @@ -22,5 +22,5 @@ public partial class CreateContainerViewModel(IServiceProvider provider, private string password; public async Task Confirm() => - await Mediator.Handle, bool>(Create.As(new Container(Name, Password))); + await Mediator.Handle, bool>(Create.As(new Container(Name, Password))); } \ No newline at end of file diff --git a/Bitvault/ItemConfigurationHandler.cs b/Bitvault/CreateItemHandler.cs similarity index 70% rename from Bitvault/ItemConfigurationHandler.cs rename to Bitvault/CreateItemHandler.cs index 0502e21..7831675 100644 --- a/Bitvault/ItemConfigurationHandler.cs +++ b/Bitvault/CreateItemHandler.cs @@ -4,10 +4,10 @@ using Toolkit.Foundation; namespace Bitvault; -public class ItemConfigurationHandler(IDbContextFactory dbContextFactory) : - IHandler, bool> +public class CreateItemHandler(IDbContextFactory dbContextFactory, IPublisher publisher) : + IHandler, bool> { - public async Task Handle(Create args, + public async Task Handle(CreateEventArgs args, CancellationToken cancellationToken) { if (args.Value is ItemConfiguration configuration) @@ -19,8 +19,10 @@ public class ItemConfigurationHandler(IDbContextFactory dbCo using ContainerDbContext context = dbContextFactory.CreateDbContext(); await context.AddAsync(new Data.Item { Name = configuration.Name }, cancellationToken); await context.SaveChangesAsync(cancellationToken); + }, cancellationToken); + await publisher.Publish(Activated.As(configuration)); return true; } catch diff --git a/Bitvault/FilterContainerNavigationViewModel.cs b/Bitvault/FilterContainerNavigationViewModel.cs index 6652041..5beeac2 100644 --- a/Bitvault/FilterContainerNavigationViewModel.cs +++ b/Bitvault/FilterContainerNavigationViewModel.cs @@ -6,8 +6,8 @@ namespace Bitvault; public partial class FilterContainerNavigationViewModel : ObservableViewModel, IContainerNavigationViewModel, - INotificationHandler>, - INotificationHandler> + INotificationHandler>, + INotificationHandler> { [ObservableProperty] private bool activated; @@ -29,14 +29,14 @@ public partial class FilterContainerNavigationViewModel : ObservableViewModel, Filter = filter; } - public Task Handle(Container args, + public Task Handle(DeactivatedEventArgs args, CancellationToken cancellationToken = default) => Task.FromResult(Activated = false); - public Task Handle(Container args, + public Task Handle(ActivatedEventArgs args, CancellationToken cancellationToken = default) => Task.FromResult(Activated = true); [RelayCommand] - public async Task Invoke() => await Publisher.Publish(Container.As(new Filter(Filter))); + public async Task Invoke() => await Publisher.Publish(Request.As(new Filter(Filter))); } \ No newline at end of file diff --git a/Bitvault/Item.cs b/Bitvault/Item.cs index d7f47a2..4a123bb 100644 --- a/Bitvault/Item.cs +++ b/Bitvault/Item.cs @@ -1,3 +1,23 @@ namespace Bitvault; -public record Item; +public record Item(TValue? Value = default); + +public record Item +{ + public Item(int id) + { + Id = id; + } + + public Item() + { + + } + + public static Item As(TValue value) => new(value); + + public static Item As() where TValue : new() => new(new TValue()); + + public int Id { get; } +} + diff --git a/Bitvault/ItemViewModel.cs b/Bitvault/ItemViewModel.cs index 8fa5f43..86df5fd 100644 --- a/Bitvault/ItemViewModel.cs +++ b/Bitvault/ItemViewModel.cs @@ -5,7 +5,7 @@ namespace Bitvault; public partial class ItemViewModel : ObservableCollectionViewModel, - INotificationHandler> + INotificationHandler> { [ObservableProperty] private int? id; @@ -33,7 +33,7 @@ public partial class ItemViewModel : public IContentTemplate Template { get; set; } - public async Task Handle(Confirm args, CancellationToken cancellationToken = default) + public async Task Handle(ConfirmEventArgs args, CancellationToken cancellationToken = default) { ItemConfiguration configuration = new(); foreach (IItemViewModel item in this) @@ -41,6 +41,6 @@ public partial class ItemViewModel : item.Invoke(configuration); } - await Mediator.Handle, bool>(Create.As(configuration), cancellationToken); + await Mediator.Handle, bool>(Create.As(configuration), cancellationToken); } } diff --git a/Bitvault/MainViewModelHandler.cs b/Bitvault/MainViewModelHandler.cs index 96bcac1..0d5b0a4 100644 --- a/Bitvault/MainViewModelHandler.cs +++ b/Bitvault/MainViewModelHandler.cs @@ -5,9 +5,9 @@ namespace Bitvault; public class MainViewModelHandler(IPublisher publisher, IContainerHostCollection containers) : - INotificationHandler> + INotificationHandler> { - public async Task Handle(Enumerate args, + public async Task Handle(EnumerateEventArgs args, CancellationToken cancellationToken = default) { foreach (IComponentHost container in containers.OrderBy(x => x.GetConfiguration() @@ -19,7 +19,7 @@ public class MainViewModelHandler(IPublisher publisher, { if (factory.Create(configuration.Name) is ContainerNavigationViewModel viewModel) { - await publisher.Publish(new Create(viewModel), + await publisher.Publish(new CreateEventArgs(viewModel), nameof(MainViewModel), cancellationToken); } } diff --git a/Bitvault/OpenContainerHandler.cs b/Bitvault/OpenContainerHandler.cs index 941ec10..41eec01 100644 --- a/Bitvault/OpenContainerHandler.cs +++ b/Bitvault/OpenContainerHandler.cs @@ -6,9 +6,9 @@ namespace Bitvault; public class OpenContainerHandler(ContainerConfiguration configuration, ISecurityKeyFactory keyVaultFactory, IContainerStorageFactory vaultStorage) : - IHandler, bool> + IHandler, bool> { - public async Task Handle(Open args, + public async Task Handle(ActivateEventArgs args, CancellationToken cancellationToken) { if (args.Value is Container container && configuration.Name is { Length: > 0 } name && container.Password is { Length: > 0 } password) diff --git a/Bitvault/OpenContainerViewModel.cs b/Bitvault/OpenContainerViewModel.cs index a75e50b..fee8524 100644 --- a/Bitvault/OpenContainerViewModel.cs +++ b/Bitvault/OpenContainerViewModel.cs @@ -20,9 +20,9 @@ public partial class OpenContainerViewModel(IServiceProvider provider, { if (Password is { Length: > 0 }) { - if (await Mediator.Handle, bool>(Open.As(new Container(Password)))) + if (await Mediator.Handle, bool>(Activate.As(new Container(Password)))) { - await Publisher.Publish(Container.As()); + await Publisher.Publish(Opened.As()); } } } diff --git a/Bitvault/Opened.cs b/Bitvault/Opened.cs index dc99b08..e0bd0f3 100644 --- a/Bitvault/Opened.cs +++ b/Bitvault/Opened.cs @@ -1,3 +1,8 @@ namespace Bitvault; -public record Opened; \ No newline at end of file +public record Opened +{ + public static OpenedEventArgs As(TValue value) => new(value); + + public static OpenedEventArgs As() where TValue : new() => new(new TValue()); +} diff --git a/Bitvault/OpenedEventArgs.cs b/Bitvault/OpenedEventArgs.cs new file mode 100644 index 0000000..3db4720 --- /dev/null +++ b/Bitvault/OpenedEventArgs.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record OpenedEventArgs(TValue? Value = default);