app/BTCPayApp.UI/StateMiddleware.cs

93 lines
4.0 KiB
C#

using BTCPayApp.Core;
using BTCPayApp.Core.Contracts;
using BTCPayApp.UI.Features;
using Fluxor;
namespace BTCPayApp.UI;
public class StateMiddleware : Middleware
{
private readonly IConfigProvider _configProvider;
private readonly BTCPayAppConfigManager _btcPayAppConfigManager;
private readonly BTCPayConnection _btcPayConnection;
private readonly LightningNodeManager _lightningNodeManager;
public const string UiStateConfigKey = "uistate";
public StateMiddleware(
IConfigProvider configProvider,
BTCPayConnection btcPayConnection,
BTCPayAppConfigManager btcPayAppConfigManager,
LightningNodeManager lightningNodeManager)
{
_configProvider = configProvider;
_btcPayConnection = btcPayConnection;
_btcPayAppConfigManager = btcPayAppConfigManager;
_lightningNodeManager = lightningNodeManager;
}
public override async Task InitializeAsync(IDispatcher dispatcher, IStore store)
{
if (store.Features.TryGetValue(typeof(UIState).FullName, out var uiStateFeature))
{
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.UiState, true));
var existing = await _configProvider.Get<UIState>(UiStateConfigKey);
if (existing is not null)
{
uiStateFeature.RestoreState(existing);
}
uiStateFeature.StateChanged += async (sender, args) =>
{
await _configProvider.Set(UiStateConfigKey, (UIState)uiStateFeature.GetState());
};
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.UiState, false));
}
await base.InitializeAsync(dispatcher, store);
ListenIn(dispatcher);
}
private void ListenIn(IDispatcher dispatcher)
{
_btcPayAppConfigManager.PairConfigUpdated += (_, config) =>
dispatcher.Dispatch(new RootState.PairConfigLoadedAction(config));
_btcPayAppConfigManager.WalletConfigUpdated += (_, config) =>
dispatcher.Dispatch(new RootState.WalletConfigLoadedAction(config));
_btcPayConnection.ConnectionChanged += (sender, args) =>
dispatcher.Dispatch(new RootState.BTCPayConnectionUpdatedAction(_btcPayConnection.Connection?.State));
_lightningNodeManager.StateChanged += (sender, args) =>
dispatcher.Dispatch(new RootState.LightningNodeStateUpdatedAction(args));
if (_lightningNodeManager.State is not LightningNodeState.Running)
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.LightningState, true));
if (_btcPayAppConfigManager.PairConfig is null)
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.PairConfig, true));
else
dispatcher.Dispatch(new RootState.PairConfigLoadedAction(_btcPayAppConfigManager.PairConfig));
if (_btcPayAppConfigManager.WalletConfig is null)
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.WalletConfig, true));
else
dispatcher.Dispatch(new RootState.WalletConfigLoadedAction(_btcPayAppConfigManager.WalletConfig));
_ = _btcPayAppConfigManager.Loaded.Task.ContinueWith(_ =>
{
dispatcher.Dispatch(new RootState.WalletConfigLoadedAction(_btcPayAppConfigManager.WalletConfig));
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.WalletConfig, false));
dispatcher.Dispatch(new RootState.PairConfigLoadedAction(_btcPayAppConfigManager.PairConfig));
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.PairConfig, false));
dispatcher.Dispatch(new RootState.LightningNodeStateUpdatedAction(_lightningNodeManager.State));
dispatcher.Dispatch(new RootState.LoadingAction(RootState.LoadingHandles.LightningState, false));
dispatcher.Dispatch(new RootState.BTCPayConnectionUpdatedAction(_btcPayConnection.Connection?.State));
});
}
}