player state and availability

This commit is contained in:
beo3000 2025-11-13 17:21:33 +01:00
parent 047d9f6565
commit 6b95c25d9c
8 changed files with 122 additions and 68 deletions

View File

@ -7,7 +7,7 @@
@implements IDisposable @implements IDisposable
@implements KoogleApp.Services.IMyHandle<KoogleApp.Model.EventMessages.PlayerViewChangedMessage> @implements KoogleApp.Services.IMyHandle<KoogleApp.Model.EventMessages.PlayerViewChangedMessage>
@inject IState<PlayersState> PlayersState @inject IState<PlayerState> PlayersState
@* @inject SharedDataService DataService; *@ @* @inject SharedDataService DataService; *@
@inject IMyEventAggregator EventAggregator; @inject IMyEventAggregator EventAggregator;
@ -22,7 +22,7 @@ else
RowClass="cursor-pointer" RowClassFunc="@SelectedRowClassFunc" T="PlayerExpense" RowClass="cursor-pointer" RowClassFunc="@SelectedRowClassFunc" T="PlayerExpense"
OnRowClick="RowClickEvent" @ref="mudTable"> OnRowClick="RowClickEvent" @ref="mudTable">
<ToolBarContent> <ToolBarContent>
<MudText Typo="Typo.h6">Strafen @_player.Name</MudText> <MudText Typo="Typo.h6">Strafen @PlayersState.Value.Name</MudText>
<MudSpacer/> <MudSpacer/>
<MudTextField @bind-Value="Search" Placeholder="Search" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField> <MudTextField @bind-Value="Search" Placeholder="Search" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
</ToolBarContent> </ToolBarContent>
@ -48,7 +48,7 @@ else
@code { @code {
private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); // 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;

View File

@ -4,15 +4,24 @@
@using KoogleApp.Services; @using KoogleApp.Services;
@using KoogleApp.Store.Player @using KoogleApp.Store.Player
@inherits FluxorComponent
@inject IState<PlayersState> PlayersState @inject IDispatcher Dispatcher
@* @inject IState<PlayersState> PlayersState *@
@inject IState<PlayerState> PlayerState
<MudGrid> @if (@PlayerState.Value != null)
{
<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">
<MudText Typo="Typo.h4">@_player?.Name</MudText> <MudText Typo="Typo.h4">@PlayerState.Value.Name</MudText>
<MudSwitch @bind-Value="available">todo: @available</MudSwitch> <StateSwitch TState="PlayerState"
Color="Color.Tertiary"
ValueSelector="@(state => state.Available)"
OnValueChanged="@(value => Dispatcher.Dispatch(new ChangePlayerAvailableAction(PlayerState.Value.Id, value)))" />
<MudText Typo="Typo.subtitle2">@(PlayerState.Value.Available? "anwesend": "abwesend")</MudText>
</MudPaper> </MudPaper>
</MudItem> </MudItem>
@ -21,10 +30,12 @@
<PlayerExpenseList/> <PlayerExpenseList/>
</MudPaper> </MudPaper>
</MudItem> </MudItem>
</MudGrid>
</MudGrid>
}
@code { @code {
private bool available = true; // private bool available = true;
private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); // private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value);
} }

View File

@ -5,13 +5,14 @@
@using KoogleApp.Services @using KoogleApp.Services
@using KoogleApp.Store.Player @using KoogleApp.Store.Player
@inherits FluxorComponent @inherits FluxorComponent
@implements IMyHandle<PlayerViewChangedMessage> @implements IMyHandle<PlayerViewChangedMessage>
@implements IDisposable
@inject IMyEventAggregator _eventAggregator @inject IMyEventAggregator EventAggregator
@inject IState<PlayersState> PlayersState @inject IState<PlayersState> PlayersState
@inject IState<PlayerState> PlayerState
@inject IDispatcher Dispatcher @inject IDispatcher Dispatcher
@* @inject SharedDataService _dataService *@ @* @inject SharedDataService _dataService *@
@ -19,7 +20,6 @@
@if (PlayersState.Value != null) @if (PlayersState.Value != null)
{ {
<MudList T="PlayerState" Color="@Color.Info" <MudList T="PlayerState" Color="@Color.Info"
@ref="_list"
@bind-SelectedValue="SelectedValue" @bind-SelectedValue="SelectedValue"
SelectionMode="SelectionMode.SingleSelection"> SelectionMode="SelectionMode.SingleSelection">
@ -37,11 +37,13 @@
@code { @code {
private MudList<PlayerState> _list; private PlayerState _selectedValue;
public PlayerState? SelectedValue; public PlayerState? SelectedValue
{
private List<Player>? _players; get => _selectedValue;
set => _selectedValue = value;
}
protected override async Task OnAfterRenderAsync(bool firstRender) protected override async Task OnAfterRenderAsync(bool firstRender)
{ {
@ -51,51 +53,41 @@
{ {
Dispatcher.Dispatch(new LoadPlayersAction()); Dispatcher.Dispatch(new LoadPlayersAction());
} }
// _players = await _dataService.GetAllAsync();
// StateHasChanged();
} }
} }
private async Task OnClick(MouseEventArgs obj) private async Task OnClick(MouseEventArgs obj)
{ {
Dispatcher.Dispatch(new SelectPlayerAction(SelectedValue.Id)); Dispatcher.Dispatch(new SelectPlayerAction(SelectedValue));
// 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 Task HandleAsync(PlayerViewChangedMessage message)
{ {
// if (message.Sender == this) SelectedValue = PlayerState.Value;
// { StateHasChanged();
// return; return Task.CompletedTask;
// }
// SelectedValue = await _dataService.GetSelectedPlayerAsync();
// StateHasChanged();
} }
protected override void OnInitialized() protected override void OnInitialized()
{ {
_eventAggregator.Subscribe(this); EventAggregator.Subscribe(this);
base.OnInitialized(); base.OnInitialized();
} }
protected override ValueTask DisposeAsyncCore(bool disposing)
public void Dispose()
{ {
_eventAggregator.Unsubscribe(this); EventAggregator.Unsubscribe(this);
return base.DisposeAsyncCore(disposing);
} }
} }

View File

@ -0,0 +1,34 @@
@inherits FluxorComponent
@typeparam TState
@inject IState<TState> State
<MudSwitch @bind-Value="SwitchValue"
@bind-Color="Color" />
@code {
private bool SwitchValue
{
get => ValueSelector.Invoke(State.Value);
set => OnValueChanged?.Invoke(value);
}
[Parameter, EditorRequired]
public Func<TState, bool> ValueSelector
{
get;
set;
} = null!;
[Parameter, EditorRequired]
public Action<bool> OnValueChanged
{
get;
set;
} = null!;
[Parameter]
public Color Color { get; set; }
}

View File

@ -4,5 +4,7 @@
public record PlayersLoadedAction(List<Model.Player> Players); public record PlayersLoadedAction(List<Model.Player> Players);
public record SelectPlayerAction(int PlayerId); public record SelectPlayerAction(PlayerState? Player);
public record ChangePlayerAvailableAction(int PlayerId, bool IsAvailable);
} }

View File

@ -1,4 +1,5 @@
using Fluxor; using Fluxor;
using System;
namespace KoogleApp.Store.Player namespace KoogleApp.Store.Player
{ {
@ -8,18 +9,32 @@ namespace KoogleApp.Store.Player
public static PlayersState OnPlayersLoaded(PlayersState state, PlayersLoadedAction action) public static PlayersState OnPlayersLoaded(PlayersState state, PlayersLoadedAction action)
{ {
var players = action.Players var players = action.Players
.Select(p => new PlayerState(p.Name, p.Id, Available: true)) .Select(p => new PlayerState(p.Name, p.Id, Available: false))
.ToList(); .ToList();
return state with { Players = players, Loaded = true}; return state with { Players = players, Loaded = true};
} }
[ReducerMethod] [ReducerMethod]
public static PlayersState OnSelectPlayerAction( public static PlayerState OnSelectPlayerAction(PlayerState state, SelectPlayerAction action)
PlayersState state,
SelectPlayerAction action)
{ {
return state with { SelectedPlayer = action.PlayerId }; return action.Player;
//return state with { Available = action.Player };
} }
[ReducerMethod]
public static PlayerState OnChangePlayerAvailableAction(PlayerState state, ChangePlayerAvailableAction action)
{
return state with { Available = action.IsAvailable };
}
[ReducerMethod]
public static PlayersState OnChangePlayerAvailableAction(PlayersState state, ChangePlayerAvailableAction action)
{
var newList = new List<PlayerState>(state.Players); // Kopie erstellen
var idx = state.Players.FindIndex(p => p.Id == action.PlayerId);
newList[idx] = newList[idx] with { Available = action.IsAvailable }; // Element ändern
return state with { Players = newList };
}
} }
} }

View File

@ -1,13 +1,13 @@
namespace KoogleApp.Store.Player namespace KoogleApp.Store.Player
{ {
public class PlayersSelector public static class PlayersSelector
{ {
public static PlayerState? SelectedPlayer(PlayersState state) //public static PlayerState? SelectedPlayer(PlayersState state)
{ //{
if (state.SelectedPlayer == 0) // if (state. == null)
return null; // return null;
return state.Players.FirstOrDefault(_ => _.Id == state.SelectedPlayer); // return state.Players.FirstOrDefault(_ => _.Id == state.SelectedPlayer.Id);
} //}
} }
} }

View File

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