Add wallet profile image loading
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
using Toolkit.Foundation;
|
||||
|
||||
namespace Wallet;
|
||||
|
||||
public class CreateProfileImageHandler(IFileProvider fileProvider,
|
||||
IImageReader imageReader) :
|
||||
IHandler<CreateEventArgs<ProfileImage>, IImageDescriptor?>
|
||||
{
|
||||
public async Task<IImageDescriptor?> Handle(CreateEventArgs<ProfileImage> args,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
if (await fileProvider.SelectFiles(new FileFilter("Image files", ["jpg", "jpeg", "png"]))
|
||||
is { Count: 1 } files)
|
||||
{
|
||||
if (files.FirstOrDefault() is string file)
|
||||
{
|
||||
using FileStream stream = File.OpenRead(file);
|
||||
return imageReader.Get(stream, 200, 200, true);
|
||||
}
|
||||
}
|
||||
|
||||
return default;
|
||||
}
|
||||
}
|
||||
@@ -62,8 +62,8 @@ public partial class CreateWalletViewModel :
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
public async Task Import() => ImageDescriptor = await Mediator.Handle<ReadEventArgs<ProfileImage>,
|
||||
IImageDescriptor>(Read.As<ProfileImage>());
|
||||
public async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>,
|
||||
IImageDescriptor>(Create.As<ProfileImage>());
|
||||
|
||||
protected override void OnPropertyChanged(PropertyChangedEventArgs args)
|
||||
{
|
||||
|
||||
@@ -13,6 +13,9 @@ public partial class OpenWalletViewModel : Observable
|
||||
[ObservableProperty]
|
||||
private string? name;
|
||||
|
||||
[ObservableProperty]
|
||||
private IImageDescriptor imageDescriptor;
|
||||
|
||||
[MaybeNull]
|
||||
[ObservableProperty]
|
||||
private string password;
|
||||
@@ -24,10 +27,13 @@ public partial class OpenWalletViewModel : Observable
|
||||
IPublisher publisher,
|
||||
ISubscriber subscriber,
|
||||
IDisposer disposer,
|
||||
string name) : base(provider, factory, mediator, publisher, subscriber, disposer)
|
||||
string name,
|
||||
IImageDescriptor imageDescriptor) : base(provider, factory, mediator, publisher, subscriber, disposer)
|
||||
{
|
||||
this.validation = validation;
|
||||
|
||||
Name = name;
|
||||
ImageDescriptor = imageDescriptor;
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
using Toolkit.Foundation;
|
||||
|
||||
namespace Wallet;
|
||||
|
||||
public class ReadProfileImageHandler(IFileProvider fileProvider,
|
||||
IImageReader imageReader) :
|
||||
IHandler<ReadEventArgs<ProfileImage>, IImageDescriptor?>
|
||||
{
|
||||
public async Task<IImageDescriptor?> Handle(ReadEventArgs<ProfileImage> args,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
if (await fileProvider.SelectFiles(new FileFilter("Image files", ["jpg", "jpeg", "png"])) is { Count: 1 } files)
|
||||
{
|
||||
if (files.FirstOrDefault() is string file)
|
||||
{
|
||||
await using FileStream stream = File.OpenRead(file);
|
||||
return await imageReader.Get(stream, 200, 200, true);
|
||||
}
|
||||
}
|
||||
|
||||
return default;
|
||||
}
|
||||
}
|
||||
@@ -15,11 +15,15 @@ public class SynchronizeMainViewModelHandler(IPublisher publisher,
|
||||
is IConfigurationDescriptor<WalletConfiguration> descriptor ? descriptor.Name : null))
|
||||
{
|
||||
if (Wallet.Services.GetRequiredService<IConfigurationDescriptor<WalletConfiguration>>()
|
||||
is IConfigurationDescriptor<WalletConfiguration> descriptor)
|
||||
is IConfigurationDescriptor<WalletConfiguration> configuration)
|
||||
{
|
||||
if (Wallet.Services.GetRequiredService<IServiceFactory>() is IServiceFactory factory)
|
||||
{
|
||||
if (factory.Create<WalletNavigationViewModel>(args => args.Initialize(), descriptor.Name, selected)
|
||||
IDecoratorService<ProfileImage<IImageDescriptor>> profileImageDecorator =
|
||||
Wallet.Services.GetRequiredService<IDecoratorService<ProfileImage<IImageDescriptor>>>();
|
||||
ProfileImage<IImageDescriptor>? profileImage = profileImageDecorator.Service;
|
||||
|
||||
if (factory.Create<WalletNavigationViewModel>(args => args.Initialize(), configuration.Name, profileImage?.Value, selected)
|
||||
is WalletNavigationViewModel viewModel)
|
||||
{
|
||||
publisher.Publish(Create.As<IMainNavigationViewModel>(viewModel),
|
||||
|
||||
@@ -8,7 +8,7 @@ public class WalletCollectionInitializer(IHostEnvironment environment,
|
||||
IWalletHostCollection Wallets) :
|
||||
IInitialization
|
||||
{
|
||||
public async Task Initialize()
|
||||
public void Initialize()
|
||||
{
|
||||
foreach (string wallet in Directory.EnumerateDirectories(Path.Combine(environment.ContentRootPath, "Wallet")))
|
||||
{
|
||||
@@ -16,11 +16,11 @@ public class WalletCollectionInitializer(IHostEnvironment environment,
|
||||
string section = $"Wallet:{name}";
|
||||
|
||||
if (componentFactory.Create<WalletComponent,
|
||||
WalletConfiguration>(section)
|
||||
WalletConfiguration>(section, new WalletConfiguration())
|
||||
is IComponentHost host)
|
||||
{
|
||||
Wallets.Add(host);
|
||||
await host.StartAsync();
|
||||
host.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,9 +10,10 @@ public class WalletComponent(IHostEnvironment environment,
|
||||
public override IComponentBuilder Configuring(string key,
|
||||
IComponentBuilder builder)
|
||||
{
|
||||
string path = Path.Combine(environment.ContentRootPath, key.Replace(":", "\\"));
|
||||
builder.SetComponentConfiguration(args =>
|
||||
{
|
||||
args.ContentRoot = Path.Combine(environment.ContentRootPath, key.Replace(":", "\\"));
|
||||
args.ContentRoot = Path.Combine(path);
|
||||
});
|
||||
|
||||
return base.Configuring(key, builder);
|
||||
|
||||
@@ -27,6 +27,9 @@ public partial class WalletNavigationViewModel :
|
||||
[ObservableProperty]
|
||||
private bool isActivated;
|
||||
|
||||
[ObservableProperty]
|
||||
private IImageDescriptor imageDescriptor;
|
||||
|
||||
public WalletNavigationViewModel(IServiceProvider provider,
|
||||
IServiceFactory factory,
|
||||
IMediator mediator,
|
||||
@@ -35,10 +38,12 @@ public partial class WalletNavigationViewModel :
|
||||
IDisposer disposer,
|
||||
IContentTemplate template,
|
||||
string name,
|
||||
IImageDescriptor imageDescriptor,
|
||||
bool isSelected) : base(provider, factory, mediator, publisher, subscriber, disposer)
|
||||
{
|
||||
Template = template;
|
||||
Name = name;
|
||||
ImageDescriptor = imageDescriptor;
|
||||
IsSelected = isSelected;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Toolkit.Foundation;
|
||||
|
||||
namespace Wallet;
|
||||
|
||||
public class WalletProfileImageInitializer(IHostEnvironment environment,
|
||||
IImageReader reader,
|
||||
IDecoratorService<ProfileImage<IImageDescriptor>> profileImageDecorator) :
|
||||
IInitialization
|
||||
{
|
||||
public void Initialize()
|
||||
{
|
||||
string file = Path.Combine(environment.ContentRootPath, "Thumbnail.png");
|
||||
if (File.Exists(file))
|
||||
{
|
||||
using FileStream stream = File.OpenRead(file);
|
||||
IImageDescriptor imageDescriptor = reader.Get(stream, 200, 200);
|
||||
|
||||
profileImageDecorator.Set(new ProfileImage<IImageDescriptor>(imageDescriptor));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user