diff --git a/KoogleApp/Components/Controls/PlayerExpenseList.razor b/KoogleApp/Components/Controls/PlayerExpenseList.razor index a9090c5..481d557 100644 --- a/KoogleApp/Components/Controls/PlayerExpenseList.razor +++ b/KoogleApp/Components/Controls/PlayerExpenseList.razor @@ -2,11 +2,13 @@ @using KoogleApp.Model @using KoogleApp.Model.EventMessages @using KoogleApp.Services +@using KoogleApp.Store.Player @implements IDisposable @implements KoogleApp.Services.IMyHandle -@inject SharedDataService DataService; +@inject IState PlayersState +@* @inject SharedDataService DataService; *@ @inject IMyEventAggregator EventAggregator; @if (_isProcessing) @@ -46,9 +48,11 @@ else @code { + private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); + private PlayerExpense selectedItem1 = null; private List? _expenses = null; - private Player? _player = null; + // private Player? _player = null; private List? _Allexpenses = null; private MudTable mudTable; @@ -77,37 +81,37 @@ else { if (firstRender) { - await LoadDataAsync(); + // await LoadDataAsync(); } } - private async Task LoadDataAsync() - { - if (_isProcessing) - return; + // private async Task LoadDataAsync() + // { + // if (_isProcessing) + // return; - _isProcessing = true; - StateHasChanged(); + // _isProcessing = true; + // StateHasChanged(); - try - { - _player = await DataService.GetPlayerWithExpensesAsync(); - if (_player != null) - { - _expenses = _player.Expenses; - } - else - { - _expenses = new List(); - } + // try + // { + // _player = await DataService.GetPlayerWithExpensesAsync(); + // if (_player != null) + // { + // _expenses = _player.Expenses; + // } + // else + // { + // _expenses = new List(); + // } - } - finally - { - _isProcessing = false; - StateHasChanged(); - } - } + // } + // finally + // { + // _isProcessing = false; + // StateHasChanged(); + // } + // } private async Task RowClickEvent(TableRowClickEventArgs tableRowClickEventArgs) { @@ -186,7 +190,7 @@ else public async Task HandleAsync(PlayerViewChangedMessage message) { - await LoadDataAsync(); + // await LoadDataAsync(); } diff --git a/KoogleApp/Components/Controls/PlayerPanel.razor b/KoogleApp/Components/Controls/PlayerPanel.razor index 62c1037..21eb6dc 100644 --- a/KoogleApp/Components/Controls/PlayerPanel.razor +++ b/KoogleApp/Components/Controls/PlayerPanel.razor @@ -2,17 +2,17 @@ @using KoogleApp.Model @using KoogleApp.Model.EventMessages @using KoogleApp.Services; +@using KoogleApp.Store.Player -@implements IMyHandle -@inject SharedDataService DataService -@inject IMyEventAggregator EventAggregator +@inject IState PlayersState - Player: @_player?.Name + @_player?.Name + todo: @available @@ -24,34 +24,7 @@ @code { - private Player? _player; - - protected override void OnInitialized() - { - EventAggregator.Subscribe(this); - - base.OnInitialized(); - } - - public async ValueTask DisposeAsync() - { - EventAggregator.Unsubscribe(this); - } - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - _player = await DataService.GetSelectedPlayerAsync(); - StateHasChanged(); - } - } - - - public async Task HandleAsync(PlayerViewChangedMessage message) - { - _player = await DataService.GetSelectedPlayerAsync(); - StateHasChanged(); - } + private bool available = true; + private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); } diff --git a/KoogleApp/Components/Controls/PlayerSelect.razor b/KoogleApp/Components/Controls/PlayerSelect.razor new file mode 100644 index 0000000..fbfba96 --- /dev/null +++ b/KoogleApp/Components/Controls/PlayerSelect.razor @@ -0,0 +1,5 @@ +

PlayerSelect

+ +@code { + +} diff --git a/KoogleApp/Components/Controls/PlayersPanel.razor b/KoogleApp/Components/Controls/PlayersPanel.razor index 9da07e9..75ff272 100644 --- a/KoogleApp/Components/Controls/PlayersPanel.razor +++ b/KoogleApp/Components/Controls/PlayersPanel.razor @@ -3,21 +3,27 @@ @using KoogleApp.Model.EventMessages @using KoogleApp.Model.Framework @using KoogleApp.Services +@using KoogleApp.Store.Player + +@inherits FluxorComponent @implements IMyHandle @implements IDisposable @inject IMyEventAggregator _eventAggregator -@inject SharedDataService _dataService +@inject IState PlayersState +@inject IDispatcher Dispatcher -@if (_players != null) +@* @inject SharedDataService _dataService *@ + +@if (PlayersState.Value != null) { - - @foreach (var player in _players) + @foreach (var player in PlayersState.Value.Players) { _list; + private MudList _list; - public Player? SelectedValue; + public PlayerState? SelectedValue; private List? _players; @@ -41,33 +47,38 @@ { if (firstRender) { - _players = await _dataService.GetAllAsync(); - StateHasChanged(); + if (!PlayersState.Value.Loaded) + { + Dispatcher.Dispatch(new LoadPlayersAction()); + } + // _players = await _dataService.GetAllAsync(); + // StateHasChanged(); } } private async Task OnClick(MouseEventArgs obj) { - await _dataService.SetSelectedPlayerAsync(SelectedValue); + Dispatcher.Dispatch(new SelectPlayerAction(SelectedValue.Id)); + // await _dataService.SetSelectedPlayerAsync(SelectedValue); await _eventAggregator.PublishAsync(new GameViewChangedMessage(GameView.Player) { Scope = EventScope.Circuit }); - if (SelectedValue != null) - { - await _eventAggregator.PublishAsync(new PlayerViewChangedMessage(SelectedValue.Id, this) { Scope = EventScope.Circuit }); - } + // if (SelectedValue != null) + // { + // await _eventAggregator.PublishAsync(new PlayerViewChangedMessage(SelectedValue.Id, this) { Scope = EventScope.Circuit }); + // } } public async Task HandleAsync(PlayerViewChangedMessage message) { - if (message.Sender == this) - { - return; - } - SelectedValue = await _dataService.GetSelectedPlayerAsync(); - // _list.SelectedValue = SelectedValue; - StateHasChanged(); - // await InvokeAsync(StateHasChanged); + // if (message.Sender == this) + // { + // return; + // } + // SelectedValue = await _dataService.GetSelectedPlayerAsync(); + + // StateHasChanged(); + } diff --git a/KoogleApp/Store/Game/Setup/State.cs b/KoogleApp/Store/Game/Setup/State.cs index f47e0f4..dc7e949 100644 --- a/KoogleApp/Store/Game/Setup/State.cs +++ b/KoogleApp/Store/Game/Setup/State.cs @@ -4,9 +4,9 @@ using KoogleApp.Store.Game.ThrowPanel; namespace KoogleApp.Store.Game.Setup { [FeatureState] - public record SetupState(ThrowMode ThrowMode, int ThrowsPerRound) + public record SetupState(ThrowMode ThrowMode, int ThrowsPerRound, int[] Players) { - public SetupState() : this(ThrowMode: ThrowMode.Reposition, ThrowsPerRound:3) + public SetupState() : this(ThrowMode: ThrowMode.Reposition, ThrowsPerRound:3, Players:[]) { } } } diff --git a/KoogleApp/Store/Player/Actions.cs b/KoogleApp/Store/Player/Actions.cs new file mode 100644 index 0000000..a72514a --- /dev/null +++ b/KoogleApp/Store/Player/Actions.cs @@ -0,0 +1,8 @@ +namespace KoogleApp.Store.Player +{ + public record LoadPlayersAction(); + + public record PlayersLoadedAction(List Players); + + public record SelectPlayerAction(int PlayerId); +} diff --git a/KoogleApp/Store/Player/Effects.cs b/KoogleApp/Store/Player/Effects.cs new file mode 100644 index 0000000..e4d50fc --- /dev/null +++ b/KoogleApp/Store/Player/Effects.cs @@ -0,0 +1,22 @@ +using Fluxor; +using KoogleApp.Data; + +namespace KoogleApp.Store.Player +{ + public class PlayerEffects + { + private readonly SharedDataService _dataService; + + public PlayerEffects(SharedDataService dataService) + { + _dataService = dataService; + } + + [EffectMethod] + public async Task HandleLoadPlayersActions(LoadPlayersAction action, IDispatcher dispatcher) + { + var players = await _dataService.GetAllAsync(); + dispatcher.Dispatch(new PlayersLoadedAction(players)); + } + } +} diff --git a/KoogleApp/Store/Player/Reducers.cs b/KoogleApp/Store/Player/Reducers.cs new file mode 100644 index 0000000..3a97791 --- /dev/null +++ b/KoogleApp/Store/Player/Reducers.cs @@ -0,0 +1,25 @@ +using Fluxor; + +namespace KoogleApp.Store.Player +{ + public class PlayersStateReducers + { + [ReducerMethod] + public static PlayersState OnPlayersLoaded(PlayersState state, PlayersLoadedAction action) + { + var players = action.Players + .Select(p => new PlayerState(p.Name, p.Id, Available: true)) + .ToList(); + return state with { Players = players, Loaded = true}; + } + + [ReducerMethod] + public static PlayersState OnSelectPlayerAction( + PlayersState state, + SelectPlayerAction action) + { + return state with { SelectedPlayer = action.PlayerId }; + } + + } +} diff --git a/KoogleApp/Store/Player/Selectors.cs b/KoogleApp/Store/Player/Selectors.cs new file mode 100644 index 0000000..3a3416f --- /dev/null +++ b/KoogleApp/Store/Player/Selectors.cs @@ -0,0 +1,13 @@ +namespace KoogleApp.Store.Player +{ + public class PlayersSelector + { + public static PlayerState? SelectedPlayer(PlayersState state) + { + if (state.SelectedPlayer == 0) + return null; + + return state.Players.FirstOrDefault(_ => _.Id == state.SelectedPlayer); + } + } +} diff --git a/KoogleApp/Store/Player/State.cs b/KoogleApp/Store/Player/State.cs new file mode 100644 index 0000000..e453243 --- /dev/null +++ b/KoogleApp/Store/Player/State.cs @@ -0,0 +1,18 @@ +using Fluxor; + +namespace KoogleApp.Store.Player +{ + [FeatureState] + public record PlayersState(bool Loaded, List Players, int SelectedPlayer) + { + public PlayersState() : this(Loaded:false, Players: new List(), SelectedPlayer:0) + {} + } + + [FeatureState] + public record PlayerState(string Name, int Id, bool Available) + { + public PlayerState(): this(Name:"",0,true) + {} + } +}