diff --git a/Wallet.Avalonia/App.axaml.cs b/Wallet.Avalonia/App.axaml.cs index b9a2d4e..ab94646 100644 --- a/Wallet.Avalonia/App.axaml.cs +++ b/Wallet.Avalonia/App.axaml.cs @@ -166,6 +166,7 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); services.AddTemplate(); + services.AddTemplate(); services.AddTemplate("ItemCommandHeader"); @@ -180,6 +181,8 @@ public partial class App : Application services.AddHandler(nameof(ItemState.Write)); services.AddHandler(nameof(ItemState.New)); + services.AddHandler(); + services.AddHandler(); services.AddHandler(); services.AddHandler(); @@ -191,7 +194,8 @@ public partial class App : Application services.AddHandler(nameof(MaskedTextEntryConfiguration)); services.AddHandler(nameof(DropdownEntryConfiguration)); services.AddHandler(nameof(DateEntryConfiguration)); - + services.AddHandler(nameof(HyperlinkEntryConfiguration)); + services.AddHandler(ServiceLifetime.Singleton); services.AddHandler(ServiceLifetime.Singleton); }); diff --git a/Wallet.Avalonia/HyperlinkEntryView.axaml b/Wallet.Avalonia/HyperlinkEntryView.axaml new file mode 100644 index 0000000..7fe902f --- /dev/null +++ b/Wallet.Avalonia/HyperlinkEntryView.axaml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wallet.Avalonia/HyperlinkEntryView.axaml.cs b/Wallet.Avalonia/HyperlinkEntryView.axaml.cs new file mode 100644 index 0000000..f7886cf --- /dev/null +++ b/Wallet.Avalonia/HyperlinkEntryView.axaml.cs @@ -0,0 +1,10 @@ +using Toolkit.UI.Controls.Avalonia; + +namespace Wallet.Avalonia; + +public partial class HyperlinkEntryView : + SettingsExpander +{ + public HyperlinkEntryView() => + InitializeComponent(); +} diff --git a/Wallet/DateEntryViewModel.cs b/Wallet/DateEntryViewModel.cs index de03901..af860e8 100644 --- a/Wallet/DateEntryViewModel.cs +++ b/Wallet/DateEntryViewModel.cs @@ -11,5 +11,5 @@ public partial class DateEntryViewModel(IServiceProvider provider, ItemState state, ItemEntryConfiguration configuration, string key, - object value, - double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); + DateTimeOffset value, + double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); diff --git a/Wallet/Hyperlink.cs b/Wallet/Hyperlink.cs new file mode 100644 index 0000000..07141bb --- /dev/null +++ b/Wallet/Hyperlink.cs @@ -0,0 +1,3 @@ +namespace Wallet; + +public record Hyperlink(string Value); diff --git a/Wallet/HyperlinkEntryConfiguration.cs b/Wallet/HyperlinkEntryConfiguration.cs index a64d6b3..0a231b5 100644 --- a/Wallet/HyperlinkEntryConfiguration.cs +++ b/Wallet/HyperlinkEntryConfiguration.cs @@ -4,4 +4,4 @@ public record HyperlinkEntryConfiguration : ItemEntryConfiguration { -} \ No newline at end of file +} diff --git a/Wallet/HyperlinkEntryViewModel.cs b/Wallet/HyperlinkEntryViewModel.cs new file mode 100644 index 0000000..87260d9 --- /dev/null +++ b/Wallet/HyperlinkEntryViewModel.cs @@ -0,0 +1,20 @@ +using CommunityToolkit.Mvvm.Input; +using Toolkit.Foundation; + +namespace Wallet; + +public partial class HyperlinkEntryViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer, + ItemState state, + ItemEntryConfiguration configuration, + string key, + string value, + double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width) +{ + [RelayCommand] + public void Invoke() => Publisher.Publish(Create.As(new Hyperlink(Value))); +} \ No newline at end of file diff --git a/Wallet/HyperlinkEntryViewModelHandler.cs b/Wallet/HyperlinkEntryViewModelHandler.cs new file mode 100644 index 0000000..f5ceb66 --- /dev/null +++ b/Wallet/HyperlinkEntryViewModelHandler.cs @@ -0,0 +1,26 @@ +using Toolkit.Foundation; + +namespace Wallet; + +public class HyperlinkEntryViewModelHandler(IServiceFactory serviceFactory) : + IHandler, IItemEntryViewModel?> +{ + public Task Handle(CreateEventArgs args, + CancellationToken cancellationToken) + { + if (args.Sender is HyperlinkEntryConfiguration configuration) + { + string? label = configuration.Label; + string? value = $"{configuration.Value}" ?? ""; + double? width = configuration.Width; + + if (serviceFactory.Create([.. args.Parameters, configuration, label, value, width]) + is HyperlinkEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } + } + + return Task.FromResult(default); + } +} diff --git a/Wallet/HyperlinkHandler.cs b/Wallet/HyperlinkHandler.cs new file mode 100644 index 0000000..a333ff6 --- /dev/null +++ b/Wallet/HyperlinkHandler.cs @@ -0,0 +1,25 @@ +using System.Diagnostics; +using Toolkit.Foundation; + +namespace Wallet; + +public class HyperlinkHandler : + INotificationHandler> +{ + public Task Handle(CreateEventArgs args) + { + if (args.Sender is Hyperlink hyperlink && hyperlink.Value is { Length: > 0 } value) + { + try + { + Process.Start(new ProcessStartInfo { FileName = value, UseShellExecute = true }); + } + catch + { + + } + } + + return Task.CompletedTask; + } +} diff --git a/Wallet/ItemEntryViewModel.cs b/Wallet/ItemEntryViewModel.cs index 0b2faca..6b05cdd 100644 --- a/Wallet/ItemEntryViewModel.cs +++ b/Wallet/ItemEntryViewModel.cs @@ -3,7 +3,7 @@ using Toolkit.Foundation; namespace Wallet; -public partial class ItemEntryViewModel(IServiceProvider provider, +public partial class ItemEntryViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -12,13 +12,14 @@ public partial class ItemEntryViewModel(IServiceProvider provider, ItemState state, ItemEntryConfiguration configuration, string key, - object value, + TValue value, double width) : - Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), + Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), IItemEntryViewModel, INotificationHandler>, INotificationHandler>, INotificationHandler> + where TValue : notnull { [ObservableProperty] private ItemState state = state; @@ -46,5 +47,5 @@ public partial class ItemEntryViewModel(IServiceProvider provider, } protected override void OnValueChanged() => - configuration.Value = Value; + configuration.Value = Value; } \ No newline at end of file diff --git a/Wallet/MaskedTextEntryViewModel.cs b/Wallet/MaskedTextEntryViewModel.cs index fd4cddf..6d7f2ac 100644 --- a/Wallet/MaskedTextEntryViewModel.cs +++ b/Wallet/MaskedTextEntryViewModel.cs @@ -13,8 +13,8 @@ public partial class MaskedTextEntryViewModel(IServiceProvider provider, ItemEntryConfiguration configuration, string pattern, string key, - object value, - double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width) + string value, + double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width) { [ObservableProperty] private string pattern = pattern; diff --git a/Wallet/MultilineTextEntryViewModel.cs b/Wallet/MultilineTextEntryViewModel.cs index 6390389..3f51a34 100644 --- a/Wallet/MultilineTextEntryViewModel.cs +++ b/Wallet/MultilineTextEntryViewModel.cs @@ -11,6 +11,6 @@ public partial class MultilineTextEntryViewModel(IServiceProvider provider, ItemState state, ItemEntryConfiguration configuration, string key, - object value, - double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); + string value, + double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); diff --git a/Wallet/MultilineTextEntryViewModelHandler.cs b/Wallet/MultilineTextEntryViewModelHandler.cs index dc418bc..65789d2 100644 --- a/Wallet/MultilineTextEntryViewModelHandler.cs +++ b/Wallet/MultilineTextEntryViewModelHandler.cs @@ -11,7 +11,7 @@ public class MultilineTextEntryViewModelHandler(IServiceFactory serviceFactory) if (args.Sender is MultilineTextEntryConfiguration configuration) { string? label = configuration.Label; - object? value = configuration.Value ?? ""; + string? value = $"{configuration.Value}" ?? ""; double? width = configuration.Width; if (serviceFactory.Create([.. args.Parameters, configuration, label, value, width]) diff --git a/Wallet/PasswordEntryViewModel.cs b/Wallet/PasswordEntryViewModel.cs index 6af842a..57454a8 100644 --- a/Wallet/PasswordEntryViewModel.cs +++ b/Wallet/PasswordEntryViewModel.cs @@ -11,5 +11,5 @@ public partial class PasswordEntryViewModel(IServiceProvider provider, ItemState state, ItemEntryConfiguration configuration, string key, - object value, - double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); \ No newline at end of file + string value, + double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); \ No newline at end of file diff --git a/Wallet/PasswordEntryViewModelHandler.cs b/Wallet/PasswordEntryViewModelHandler.cs index d47a788..2025c54 100644 --- a/Wallet/PasswordEntryViewModelHandler.cs +++ b/Wallet/PasswordEntryViewModelHandler.cs @@ -11,7 +11,7 @@ public class PasswordEntryViewModelHandler(IServiceFactory serviceFactory) : if (args.Sender is PasswordEntryConfiguration configuration) { string? label = configuration.Label; - object? value = configuration.Value ?? ""; + string? value = $"{configuration.Value}" ?? ""; double? width = configuration.Width; if (serviceFactory.Create([.. args.Parameters, configuration, label, value, width]) diff --git a/Wallet/PasswordViewModel.cs b/Wallet/PasswordViewModel.cs deleted file mode 100644 index ac2e90b..0000000 --- a/Wallet/PasswordViewModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Toolkit.Foundation; - -namespace Wallet; - -public partial class PasswordViewModel : Observable -{ - public PasswordViewModel(IServiceProvider provider, - IServiceFactory factory, - IMediator mediator, - IPublisher publisher, - ISubscription subscriber, - IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer) - { - } -} \ No newline at end of file diff --git a/Wallet/SearchWalletActionViewModel.cs b/Wallet/SearchWalletActionViewModel.cs index 72d17d7..96c7dc1 100644 --- a/Wallet/SearchWalletActionViewModel.cs +++ b/Wallet/SearchWalletActionViewModel.cs @@ -9,7 +9,7 @@ public partial class SearchWalletActionViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer) + IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer, "") { [ObservableProperty] private int index = 2; diff --git a/Wallet/TextEntryViewModel.cs b/Wallet/TextEntryViewModel.cs index 53349a2..b3af775 100644 --- a/Wallet/TextEntryViewModel.cs +++ b/Wallet/TextEntryViewModel.cs @@ -11,5 +11,5 @@ public partial class TextEntryViewModel(IServiceProvider provider, ItemState state, ItemEntryConfiguration configuration, string key, - object value, - double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); + string value, + double width) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width); diff --git a/Wallet/TextEntryViewModelHandler.cs b/Wallet/TextEntryViewModelHandler.cs index 5314d32..e87752d 100644 --- a/Wallet/TextEntryViewModelHandler.cs +++ b/Wallet/TextEntryViewModelHandler.cs @@ -11,7 +11,7 @@ public class TextEntryViewModelHandler(IServiceFactory serviceFactory) : if (args.Sender is TextEntryConfiguration configuration) { string? label = configuration.Label; - object? value = configuration.Value ?? ""; + string? value = $"{configuration.Value}" ?? ""; double? width = configuration.Width; if (serviceFactory.Create([.. args.Parameters, configuration, label, value, width])