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.EventMessages
@using KoogleApp.Services
@using KoogleApp.Store.Player
@implements IDisposable
@implements KoogleApp.Services.IMyHandle<KoogleApp.Model.EventMessages.PlayerViewChangedMessage>
@inject SharedDataService DataService;
@inject IState<PlayersState> 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<PlayerExpense>? _expenses = null;
private Player? _player = null;
// private Player? _player = null;
private List<PlayerExpense>? _Allexpenses = null;
private MudTable<PlayerExpense> 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<PlayerExpense>();
}
// try
// {
// _player = await DataService.GetPlayerWithExpensesAsync();
// if (_player != null)
// {
// _expenses = _player.Expenses;
// }
// else
// {
// _expenses = new List<PlayerExpense>();
// }
}
finally
{
_isProcessing = false;
StateHasChanged();
}
}
// }
// finally
// {
// _isProcessing = false;
// StateHasChanged();
// }
// }
private async Task RowClickEvent(TableRowClickEventArgs<PlayerExpense> tableRowClickEventArgs)
{
@ -186,7 +190,7 @@ else
public async Task HandleAsync(PlayerViewChangedMessage message)
{
await LoadDataAsync();
// await LoadDataAsync();
}

View File

@ -2,17 +2,17 @@
@using KoogleApp.Model
@using KoogleApp.Model.EventMessages
@using KoogleApp.Services;
@using KoogleApp.Store.Player
@implements IMyHandle<PlayerViewChangedMessage>
@inject SharedDataService DataService
@inject IMyEventAggregator EventAggregator
@inject IState<PlayersState> PlayersState
<MudGrid>
<MudItem xs="12">
<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>
</MudItem>
@ -24,34 +24,7 @@
</MudGrid>
@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);
}

View File

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

View File

@ -3,21 +3,27 @@
@using KoogleApp.Model.EventMessages
@using KoogleApp.Model.Framework
@using KoogleApp.Services
@using KoogleApp.Store.Player
@inherits FluxorComponent
@implements IMyHandle<PlayerViewChangedMessage>
@implements IDisposable
@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"
@bind-SelectedValue="SelectedValue"
SelectionMode="SelectionMode.SingleSelection">
@foreach (var player in _players)
@foreach (var player in PlayersState.Value.Players)
{
<MudListItem Text="@player.Name"
OnClick="OnClick"
@ -31,9 +37,9 @@
@code {
private MudList<Player> _list;
private MudList<PlayerState> _list;
public Player? SelectedValue;
public PlayerState? SelectedValue;
private List<Player>? _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();
}

View File

@ -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:[])
{ }
}
}

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)
{}
}
}