add playerstate

This commit is contained in:
beo3000 2025-11-12 21:42:32 +01:00
parent f4b8f9ea96
commit 047d9f6565
10 changed files with 163 additions and 84 deletions

View File

@ -2,11 +2,13 @@
@using KoogleApp.Model @using KoogleApp.Model
@using KoogleApp.Model.EventMessages @using KoogleApp.Model.EventMessages
@using KoogleApp.Services @using KoogleApp.Services
@using KoogleApp.Store.Player
@implements IDisposable @implements IDisposable
@implements KoogleApp.Services.IMyHandle<KoogleApp.Model.EventMessages.PlayerViewChangedMessage> @implements KoogleApp.Services.IMyHandle<KoogleApp.Model.EventMessages.PlayerViewChangedMessage>
@inject SharedDataService DataService; @inject IState<PlayersState> PlayersState
@* @inject SharedDataService DataService; *@
@inject IMyEventAggregator EventAggregator; @inject IMyEventAggregator EventAggregator;
@if (_isProcessing) @if (_isProcessing)
@ -46,9 +48,11 @@ else
@code { @code {
private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value);
private PlayerExpense selectedItem1 = null; private PlayerExpense selectedItem1 = null;
private List<PlayerExpense>? _expenses = null; private List<PlayerExpense>? _expenses = null;
private Player? _player = null; // private Player? _player = null;
private List<PlayerExpense>? _Allexpenses = null; private List<PlayerExpense>? _Allexpenses = null;
private MudTable<PlayerExpense> mudTable; private MudTable<PlayerExpense> mudTable;
@ -77,37 +81,37 @@ else
{ {
if (firstRender) if (firstRender)
{ {
await LoadDataAsync(); // await LoadDataAsync();
} }
} }
private async Task LoadDataAsync() // private async Task LoadDataAsync()
{ // {
if (_isProcessing) // if (_isProcessing)
return; // return;
_isProcessing = true; // _isProcessing = true;
StateHasChanged(); // StateHasChanged();
try // try
{ // {
_player = await DataService.GetPlayerWithExpensesAsync(); // _player = await DataService.GetPlayerWithExpensesAsync();
if (_player != null) // if (_player != null)
{ // {
_expenses = _player.Expenses; // _expenses = _player.Expenses;
} // }
else // else
{ // {
_expenses = new List<PlayerExpense>(); // _expenses = new List<PlayerExpense>();
} // }
} // }
finally // finally
{ // {
_isProcessing = false; // _isProcessing = false;
StateHasChanged(); // StateHasChanged();
} // }
} // }
private async Task RowClickEvent(TableRowClickEventArgs<PlayerExpense> tableRowClickEventArgs) private async Task RowClickEvent(TableRowClickEventArgs<PlayerExpense> tableRowClickEventArgs)
{ {
@ -186,7 +190,7 @@ else
public async Task HandleAsync(PlayerViewChangedMessage message) public async Task HandleAsync(PlayerViewChangedMessage message)
{ {
await LoadDataAsync(); // await LoadDataAsync();
} }

View File

@ -2,17 +2,17 @@
@using KoogleApp.Model @using KoogleApp.Model
@using KoogleApp.Model.EventMessages @using KoogleApp.Model.EventMessages
@using KoogleApp.Services; @using KoogleApp.Services;
@using KoogleApp.Store.Player
@implements IMyHandle<PlayerViewChangedMessage>
@inject SharedDataService DataService @inject IState<PlayersState> PlayersState
@inject IMyEventAggregator EventAggregator
<MudGrid> <MudGrid>
<MudItem xs="12"> <MudItem xs="12">
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0"> <MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
Player: @_player?.Name <MudText Typo="Typo.h4">@_player?.Name</MudText>
<MudSwitch @bind-Value="available">todo: @available</MudSwitch>
</MudPaper> </MudPaper>
</MudItem> </MudItem>
@ -24,34 +24,7 @@
</MudGrid> </MudGrid>
@code { @code {
private Player? _player; private bool available = true;
private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value);
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();
}
} }

View File

@ -0,0 +1,5 @@
<h3>PlayerSelect</h3>
@code {
}

View File

@ -3,21 +3,27 @@
@using KoogleApp.Model.EventMessages @using KoogleApp.Model.EventMessages
@using KoogleApp.Model.Framework @using KoogleApp.Model.Framework
@using KoogleApp.Services @using KoogleApp.Services
@using KoogleApp.Store.Player
@inherits FluxorComponent
@implements IMyHandle<PlayerViewChangedMessage> @implements IMyHandle<PlayerViewChangedMessage>
@implements IDisposable @implements IDisposable
@inject IMyEventAggregator _eventAggregator @inject IMyEventAggregator _eventAggregator
@inject SharedDataService _dataService @inject IState<PlayersState> PlayersState
@inject IDispatcher Dispatcher
@if (_players != null) @* @inject SharedDataService _dataService *@
@if (PlayersState.Value != null)
{ {
<MudList T="Player" Color="@Color.Info" <MudList T="PlayerState" Color="@Color.Info"
@ref="_list" @ref="_list"
@bind-SelectedValue="SelectedValue" @bind-SelectedValue="SelectedValue"
SelectionMode="SelectionMode.SingleSelection"> SelectionMode="SelectionMode.SingleSelection">
@foreach (var player in _players) @foreach (var player in PlayersState.Value.Players)
{ {
<MudListItem Text="@player.Name" <MudListItem Text="@player.Name"
OnClick="OnClick" OnClick="OnClick"
@ -31,9 +37,9 @@
@code { @code {
private MudList<Player> _list; private MudList<PlayerState> _list;
public Player? SelectedValue; public PlayerState? SelectedValue;
private List<Player>? _players; private List<Player>? _players;
@ -41,33 +47,38 @@
{ {
if (firstRender) if (firstRender)
{ {
_players = await _dataService.GetAllAsync(); if (!PlayersState.Value.Loaded)
StateHasChanged(); {
Dispatcher.Dispatch(new LoadPlayersAction());
}
// _players = await _dataService.GetAllAsync();
// StateHasChanged();
} }
} }
private async Task OnClick(MouseEventArgs obj) 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 }); await _eventAggregator.PublishAsync(new GameViewChangedMessage(GameView.Player) { Scope = EventScope.Circuit });
if (SelectedValue != null) // if (SelectedValue != null)
{ // {
await _eventAggregator.PublishAsync(new PlayerViewChangedMessage(SelectedValue.Id, this) { Scope = EventScope.Circuit }); // await _eventAggregator.PublishAsync(new PlayerViewChangedMessage(SelectedValue.Id, this) { Scope = EventScope.Circuit });
} // }
} }
public async Task HandleAsync(PlayerViewChangedMessage message) public async Task HandleAsync(PlayerViewChangedMessage message)
{ {
if (message.Sender == this) // if (message.Sender == this)
{ // {
return; // return;
} // }
SelectedValue = await _dataService.GetSelectedPlayerAsync(); // SelectedValue = await _dataService.GetSelectedPlayerAsync();
// _list.SelectedValue = SelectedValue;
StateHasChanged(); // StateHasChanged();
// await InvokeAsync(StateHasChanged);
} }

View File

@ -4,9 +4,9 @@ using KoogleApp.Store.Game.ThrowPanel;
namespace KoogleApp.Store.Game.Setup namespace KoogleApp.Store.Game.Setup
{ {
[FeatureState] [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:[])
{ } { }
} }
} }

View File

@ -0,0 +1,8 @@
namespace KoogleApp.Store.Player
{
public record LoadPlayersAction();
public record PlayersLoadedAction(List<Model.Player> Players);
public record SelectPlayerAction(int PlayerId);
}

View File

@ -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));
}
}
}

View File

@ -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 };
}
}
}

View File

@ -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);
}
}
}

View File

@ -0,0 +1,18 @@
using Fluxor;
namespace KoogleApp.Store.Player
{
[FeatureState]
public record PlayersState(bool Loaded, List<PlayerState> Players, int SelectedPlayer)
{
public PlayersState() : this(Loaded:false, Players: new List<PlayerState>(), SelectedPlayer:0)
{}
}
[FeatureState]
public record PlayerState(string Name, int Id, bool Available)
{
public PlayerState(): this(Name:"",0,true)
{}
}
}