diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index 236c4cd..b83502b 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -18,13 +18,15 @@ public partial class App : Application public override async void OnFrameworkInitializationCompleted() { IHost? host = DefaultBuilder.Create() + .AddConfiguration(args => args.Name = "Personal", + "Vault:*") .ConfigureServices((context, services) => { services.AddAvalonia(); services.AddHandler(); services.AddTransient(); - services.AddInitializer(); + services.AddInitializer(); if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime) { @@ -32,11 +34,19 @@ public partial class App : Application } services.AddSingleton(); + services.AddSingleton(); + services.AddHandler(); services.AddTemplate("Main"); services.AddHandler(); - services.AddConfiguration(args => args.Name = "Personal", "Vault:Personal"); + services.AddTransient(); + + services.AddTemplate(); + services.AddTemplate("Manage"); + + services.AddTemplate(); + services.AddTemplate("CreateVault"); }) .Build(); diff --git a/Bitvault.Avalonia/Bitvault.Avalonia.csproj b/Bitvault.Avalonia/Bitvault.Avalonia.csproj index 7bcb486..f12073e 100644 --- a/Bitvault.Avalonia/Bitvault.Avalonia.csproj +++ b/Bitvault.Avalonia/Bitvault.Avalonia.csproj @@ -27,4 +27,9 @@ + + + ManageNavigationView.axaml + + \ No newline at end of file diff --git a/Bitvault.Avalonia/CreateVaultNavigationView.axaml b/Bitvault.Avalonia/CreateVaultNavigationView.axaml new file mode 100644 index 0000000..3270fcc --- /dev/null +++ b/Bitvault.Avalonia/CreateVaultNavigationView.axaml @@ -0,0 +1,16 @@ + + + + + diff --git a/Bitvault.Avalonia/CreateVaultNavigationView.axaml.cs b/Bitvault.Avalonia/CreateVaultNavigationView.axaml.cs new file mode 100644 index 0000000..1be9f78 --- /dev/null +++ b/Bitvault.Avalonia/CreateVaultNavigationView.axaml.cs @@ -0,0 +1,8 @@ +using Toolkit.UI.Controls.Avalonia; + +namespace Bitvault.Avalonia; + +public partial class CreateVaultNavigationView : SettingsExpander +{ + public CreateVaultNavigationView() => InitializeComponent(); +} diff --git a/Bitvault.Avalonia/CreateVaultView.axaml b/Bitvault.Avalonia/CreateVaultView.axaml new file mode 100644 index 0000000..f09c84d --- /dev/null +++ b/Bitvault.Avalonia/CreateVaultView.axaml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/Bitvault.Avalonia/CreateVaultView.axaml.cs b/Bitvault.Avalonia/CreateVaultView.axaml.cs new file mode 100644 index 0000000..aa428d4 --- /dev/null +++ b/Bitvault.Avalonia/CreateVaultView.axaml.cs @@ -0,0 +1,8 @@ +using Toolkit.UI.Controls.Avalonia; + +namespace Bitvault.Avalonia; + +public partial class CreateVaultView : ContentDialog +{ + public CreateVaultView() => InitializeComponent(); +} diff --git a/Bitvault.Avalonia/MainView.axaml b/Bitvault.Avalonia/MainView.axaml index 4066b19..beb0c77 100644 --- a/Bitvault.Avalonia/MainView.axaml +++ b/Bitvault.Avalonia/MainView.axaml @@ -4,7 +4,10 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="using:Bitvault" x:DataType="vm:MainViewModel"> - + diff --git a/Bitvault.Avalonia/ManageNavigationView.axaml b/Bitvault.Avalonia/ManageNavigationView.axaml new file mode 100644 index 0000000..8e0ae9c --- /dev/null +++ b/Bitvault.Avalonia/ManageNavigationView.axaml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Bitvault.Avalonia/ManageNavigationView.axaml.cs b/Bitvault.Avalonia/ManageNavigationView.axaml.cs new file mode 100644 index 0000000..1822850 --- /dev/null +++ b/Bitvault.Avalonia/ManageNavigationView.axaml.cs @@ -0,0 +1,8 @@ +using Toolkit.UI.Controls.Avalonia; + +namespace Bitvault.Avalonia; + +public partial class ManageNavigationView : NavigationViewItem +{ + public ManageNavigationView() => InitializeComponent(); +} diff --git a/Bitvault.Avalonia/ManageView.axaml b/Bitvault.Avalonia/ManageView.axaml new file mode 100644 index 0000000..4be06ad --- /dev/null +++ b/Bitvault.Avalonia/ManageView.axaml @@ -0,0 +1,13 @@ + + + + + diff --git a/Bitvault.Avalonia/ManageView.axaml.cs b/Bitvault.Avalonia/ManageView.axaml.cs new file mode 100644 index 0000000..852e0f1 --- /dev/null +++ b/Bitvault.Avalonia/ManageView.axaml.cs @@ -0,0 +1,8 @@ +using Avalonia.Controls; + +namespace Bitvault.Avalonia; + +public partial class ManageView : UserControl +{ + public ManageView() => InitializeComponent(); +} diff --git a/Bitvault.Avalonia/VaultComponent.cs b/Bitvault.Avalonia/VaultComponent.cs index 942db67..e69bf4c 100644 --- a/Bitvault.Avalonia/VaultComponent.cs +++ b/Bitvault.Avalonia/VaultComponent.cs @@ -1,4 +1,5 @@ -using Toolkit.Foundation; +using Microsoft.Extensions.DependencyInjection; +using Toolkit.Foundation; namespace Bitvault.Avalonia; @@ -17,6 +18,5 @@ public class VaultComponent : services.AddTemplate("Vault"); services.AddTemplate("Lock"); - }); } diff --git a/Bitvault.Avalonia/VaultNavigationView.axaml b/Bitvault.Avalonia/VaultNavigationView.axaml index 6439325..bbc1c41 100644 --- a/Bitvault.Avalonia/VaultNavigationView.axaml +++ b/Bitvault.Avalonia/VaultNavigationView.axaml @@ -7,7 +7,7 @@ Content="{Binding Name}" MenuItemsSource="{Binding}"> - + diff --git a/Bitvault/CreateVaultNavigationViewModel.cs b/Bitvault/CreateVaultNavigationViewModel.cs new file mode 100644 index 0000000..a33d2f6 --- /dev/null +++ b/Bitvault/CreateVaultNavigationViewModel.cs @@ -0,0 +1,17 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class CreateVaultNavigationViewModel : + ObservableViewModel, + IMainNavigationViewModel +{ + public CreateVaultNavigationViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + { + + } +} diff --git a/Bitvault/CreateVaultViewModel.cs b/Bitvault/CreateVaultViewModel.cs new file mode 100644 index 0000000..6561830 --- /dev/null +++ b/Bitvault/CreateVaultViewModel.cs @@ -0,0 +1,24 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System.Diagnostics.CodeAnalysis; +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class CreateVaultViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer) : + ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer), + IPrimaryConfirmation +{ + [MaybeNull] + [ObservableProperty] + private string name; + + public async Task Confirm() + { + await Publisher.Publish(Create.As(new Vault(Name))); + return true; + } +} \ No newline at end of file diff --git a/Bitvault/FooterViewModel.cs b/Bitvault/FooterViewModel.cs new file mode 100644 index 0000000..f7b52a0 --- /dev/null +++ b/Bitvault/FooterViewModel.cs @@ -0,0 +1,16 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class FooterViewModel : + ObservableCollectionViewModel +{ + public FooterViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + { + Add(); + } +} diff --git a/Bitvault/IVaultFactory.cs b/Bitvault/IVaultFactory.cs new file mode 100644 index 0000000..80ba47b --- /dev/null +++ b/Bitvault/IVaultFactory.cs @@ -0,0 +1,8 @@ + +namespace Bitvault +{ + public interface IVaultFactory + { + Task CreateAsync(string name, VaultConfiguration configuration); + } +} \ No newline at end of file diff --git a/Bitvault/LockViewModel.cs b/Bitvault/LockViewModel.cs index 8055f9a..c44904f 100644 --- a/Bitvault/LockViewModel.cs +++ b/Bitvault/LockViewModel.cs @@ -7,11 +7,10 @@ public class LockViewModel(IServiceProvider serviceProvider, IPublisher publisher, ISubscriber subscriber, IDisposer disposer) : - ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer), - IConfirmation + ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer) { - public Task Confirm() - { - return Task.FromResult(false); - } -} \ No newline at end of file + //public Task Confirm() + //{ + // //return Task.FromResult(false); + //} +} diff --git a/Bitvault/MainViewModel.cs b/Bitvault/MainViewModel.cs index de69028..531c961 100644 --- a/Bitvault/MainViewModel.cs +++ b/Bitvault/MainViewModel.cs @@ -1,4 +1,5 @@ -using Toolkit.Foundation; +using CommunityToolkit.Mvvm.ComponentModel; +using Toolkit.Foundation; namespace Bitvault; @@ -6,14 +7,19 @@ namespace Bitvault; public partial class MainViewModel : ObservableCollectionViewModel { + [ObservableProperty] + private FooterViewModel footer; + public MainViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, ISubscriber subscriber, IDisposer disposer, - IContentTemplate template) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + IContentTemplate template, + FooterViewModel footer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { Template = template; + Footer = footer; } public IContentTemplate Template { get; set; } diff --git a/Bitvault/ManageNavigationViewModel.cs b/Bitvault/ManageNavigationViewModel.cs new file mode 100644 index 0000000..62b0e53 --- /dev/null +++ b/Bitvault/ManageNavigationViewModel.cs @@ -0,0 +1,17 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class ManageNavigationViewModel : + ObservableViewModel, + IMainNavigationViewModel +{ + public ManageNavigationViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + { + + } +} diff --git a/Bitvault/ManageViewModel.cs b/Bitvault/ManageViewModel.cs new file mode 100644 index 0000000..c84a79a --- /dev/null +++ b/Bitvault/ManageViewModel.cs @@ -0,0 +1,23 @@ +using Avalonia.Styling; +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class ManageViewModel : + ObservableCollectionViewModel, + IMainNavigationViewModel +{ + public ManageViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer, + IContentTemplate template) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + { + Template = template; + + Add(); + } + + public IContentTemplate Template { get; set; } +} \ No newline at end of file diff --git a/Bitvault/Vault.cs b/Bitvault/Vault.cs new file mode 100644 index 0000000..aabd844 --- /dev/null +++ b/Bitvault/Vault.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record Vault(string Name); diff --git a/Bitvault/VaultComponentsInitializer.cs b/Bitvault/VaultComponentsInitializer.cs deleted file mode 100644 index aae186b..0000000 --- a/Bitvault/VaultComponentsInitializer.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Toolkit.Foundation; - -namespace Bitvault; - -public class VaultComponentsInitializer(IServiceProvider provider, - IProxyServiceCollection proxy, - IEnumerable> configurations, - IComponentScopeCollection scopes, - IVaultHostCollection vaults) : IInitializer -{ - public async Task Initialize() - { - foreach (IConfigurationDescriptor configuration in configurations) - { - if (provider.GetRequiredService() is IVaultComponent component) - { - IComponentBuilder builder = component.Create(); - builder.AddServices(services => - { - services.AddTransient(_ => - provider.GetRequiredService>()); - - services.AddTransient(_ => - provider.GetRequiredService>()); - - services.AddScoped(_ => - provider.GetRequiredService()); - - services.AddScoped(_ => - provider.GetRequiredService()); - - services.AddScoped(_ => - provider.GetRequiredService()); - - services.AddTransient(_ => - provider.GetRequiredService()); - - services.AddRange(proxy.Services); - - services.AddSingleton(new ComponentScope(configuration.Section)); - }); - - builder.AddConfiguration(configuration.Section, configuration.Value); - IComponentHost host = builder.Build(); - - scopes.Add(new ComponentScopeDescriptor(configuration.Section, - host.Services.GetRequiredService())); - - vaults.Add(host); - await host.StartAsync(); - } - } - } -} diff --git a/Bitvault/VaultConfigurationInitializer.cs b/Bitvault/VaultConfigurationInitializer.cs new file mode 100644 index 0000000..53bcadf --- /dev/null +++ b/Bitvault/VaultConfigurationInitializer.cs @@ -0,0 +1,16 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public class VaultConfigurationInitializer(IEnumerable> configurations, + IVaultFactory factory) : IInitializer +{ + public async Task Initialize() + { + foreach (IConfigurationDescriptor configuration in configurations) + { + await factory.CreateAsync(configuration.Section, + configuration.Value); + } + } +} diff --git a/Bitvault/VaultFactory.cs b/Bitvault/VaultFactory.cs new file mode 100644 index 0000000..33f2abf --- /dev/null +++ b/Bitvault/VaultFactory.cs @@ -0,0 +1,51 @@ +using Microsoft.Extensions.DependencyInjection; +using Toolkit.Foundation; + +namespace Bitvault; + +public class VaultFactory(IServiceProvider provider, + IProxyServiceCollection proxy, + IComponentScopeCollection scopes, + IVaultHostCollection vaults) : IVaultFactory +{ + public async Task CreateAsync(string name, + VaultConfiguration configuration) + { + if (provider.GetRequiredService() is IVaultComponent component) + { + IComponentBuilder builder = component.Create(); + builder.AddServices(services => + { + services.AddTransient(_ => + provider.GetRequiredService>()); + + services.AddTransient(_ => + provider.GetRequiredService>()); + + services.AddScoped(_ => + provider.GetRequiredService()); + + services.AddScoped(_ => + provider.GetRequiredService()); + + services.AddScoped(_ => + provider.GetRequiredService()); + + services.AddTransient(_ => + provider.GetRequiredService()); + + services.AddRange(proxy.Services); + services.AddSingleton(new ComponentScope(name)); + }); + + builder.AddConfiguration(name, configuration); + IComponentHost host = builder.Build(); + + scopes.Add(new ComponentScopeDescriptor(name, + host.Services.GetRequiredService())); + + vaults.Add(host); + await host.StartAsync(); + } + } +} diff --git a/Bitvault/VaultHandler.cs b/Bitvault/VaultHandler.cs new file mode 100644 index 0000000..7dee929 --- /dev/null +++ b/Bitvault/VaultHandler.cs @@ -0,0 +1,15 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public class VaultHandler(IVaultFactory factory) : INotificationHandler> +{ + public async Task Handle(Create args, + CancellationToken cancellationToken = default) + { + if (args.Value is Vault vault) + { + await factory.CreateAsync($"Vault:{vault.Name}", new VaultConfiguration { Name = vault.Name }); + } + } +} \ No newline at end of file