From 6b95c25d9c267f5b5d04e5b91b2c82deb9ed5549 Mon Sep 17 00:00:00 2001 From: beo3000 Date: Thu, 13 Nov 2025 17:21:33 +0100 Subject: [PATCH] player state and availability --- .../Controls/PlayerExpenseList.razor | 6 +- .../Components/Controls/PlayerPanel.razor | 43 +++++++++----- .../Components/Controls/PlayersPanel.razor | 58 ++++++++----------- .../Components/Controls/StateSwitch.razor | 34 +++++++++++ KoogleApp/Store/Player/Actions.cs | 4 +- KoogleApp/Store/Player/Reducers.cs | 25 ++++++-- KoogleApp/Store/Player/Selectors.cs | 14 ++--- KoogleApp/Store/Player/State.cs | 6 +- 8 files changed, 122 insertions(+), 68 deletions(-) create mode 100644 KoogleApp/Components/Controls/StateSwitch.razor diff --git a/KoogleApp/Components/Controls/PlayerExpenseList.razor b/KoogleApp/Components/Controls/PlayerExpenseList.razor index 481d557..bfc584b 100644 --- a/KoogleApp/Components/Controls/PlayerExpenseList.razor +++ b/KoogleApp/Components/Controls/PlayerExpenseList.razor @@ -7,7 +7,7 @@ @implements IDisposable @implements KoogleApp.Services.IMyHandle -@inject IState PlayersState +@inject IState PlayersState @* @inject SharedDataService DataService; *@ @inject IMyEventAggregator EventAggregator; @@ -22,7 +22,7 @@ else RowClass="cursor-pointer" RowClassFunc="@SelectedRowClassFunc" T="PlayerExpense" OnRowClick="RowClickEvent" @ref="mudTable"> - Strafen @_player.Name + Strafen @PlayersState.Value.Name @@ -48,7 +48,7 @@ else @code { - private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); + // private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); private PlayerExpense selectedItem1 = null; private List? _expenses = null; diff --git a/KoogleApp/Components/Controls/PlayerPanel.razor b/KoogleApp/Components/Controls/PlayerPanel.razor index 21eb6dc..fc88d8f 100644 --- a/KoogleApp/Components/Controls/PlayerPanel.razor +++ b/KoogleApp/Components/Controls/PlayerPanel.razor @@ -4,27 +4,38 @@ @using KoogleApp.Services; @using KoogleApp.Store.Player +@inherits FluxorComponent -@inject IState PlayersState +@inject IDispatcher Dispatcher +@* @inject IState PlayersState *@ +@inject IState PlayerState - +@if (@PlayerState.Value != null) +{ + - - - @_player?.Name - todo: @available - - + + + @PlayerState.Value.Name + + @(PlayerState.Value.Available? "anwesend": "abwesend") + + - - - - - - + + + + + + + +} @code { - private bool available = true; - private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); + // private bool available = true; + // private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value); } diff --git a/KoogleApp/Components/Controls/PlayersPanel.razor b/KoogleApp/Components/Controls/PlayersPanel.razor index 75ff272..0cea328 100644 --- a/KoogleApp/Components/Controls/PlayersPanel.razor +++ b/KoogleApp/Components/Controls/PlayersPanel.razor @@ -5,13 +5,14 @@ @using KoogleApp.Services @using KoogleApp.Store.Player + @inherits FluxorComponent @implements IMyHandle -@implements IDisposable -@inject IMyEventAggregator _eventAggregator +@inject IMyEventAggregator EventAggregator @inject IState PlayersState +@inject IState PlayerState @inject IDispatcher Dispatcher @* @inject SharedDataService _dataService *@ @@ -19,7 +20,6 @@ @if (PlayersState.Value != null) { @@ -37,11 +37,13 @@ @code { - private MudList _list; + private PlayerState _selectedValue; - public PlayerState? SelectedValue; - - private List? _players; + public PlayerState? SelectedValue + { + get => _selectedValue; + set => _selectedValue = value; + } protected override async Task OnAfterRenderAsync(bool firstRender) { @@ -51,51 +53,41 @@ { Dispatcher.Dispatch(new LoadPlayersAction()); } - // _players = await _dataService.GetAllAsync(); - // StateHasChanged(); } } private async Task OnClick(MouseEventArgs obj) { - Dispatcher.Dispatch(new SelectPlayerAction(SelectedValue.Id)); - // await _dataService.SetSelectedPlayerAsync(SelectedValue); + Dispatcher.Dispatch(new SelectPlayerAction(SelectedValue)); + + await EventAggregator.PublishAsync(new GameViewChangedMessage(GameView.Player) { Scope = EventScope.Circuit }); - 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) + public Task HandleAsync(PlayerViewChangedMessage message) { - // if (message.Sender == this) - // { - // return; - // } - // SelectedValue = await _dataService.GetSelectedPlayerAsync(); - - // StateHasChanged(); - - - + SelectedValue = PlayerState.Value; + StateHasChanged(); + return Task.CompletedTask; } protected override void OnInitialized() { - _eventAggregator.Subscribe(this); - + EventAggregator.Subscribe(this); base.OnInitialized(); } - - public void Dispose() + protected override ValueTask DisposeAsyncCore(bool disposing) { - _eventAggregator.Unsubscribe(this); + EventAggregator.Unsubscribe(this); + return base.DisposeAsyncCore(disposing); } + } diff --git a/KoogleApp/Components/Controls/StateSwitch.razor b/KoogleApp/Components/Controls/StateSwitch.razor new file mode 100644 index 0000000..6fca31b --- /dev/null +++ b/KoogleApp/Components/Controls/StateSwitch.razor @@ -0,0 +1,34 @@ +@inherits FluxorComponent + +@typeparam TState +@inject IState State + + + +@code { + private bool SwitchValue + { + get => ValueSelector.Invoke(State.Value); + set => OnValueChanged?.Invoke(value); + } + + [Parameter, EditorRequired] + public Func ValueSelector + { + get; + set; + } = null!; + + [Parameter, EditorRequired] + public Action OnValueChanged + { + get; + set; + } = null!; + + + [Parameter] + public Color Color { get; set; } + +} diff --git a/KoogleApp/Store/Player/Actions.cs b/KoogleApp/Store/Player/Actions.cs index a72514a..a62cdde 100644 --- a/KoogleApp/Store/Player/Actions.cs +++ b/KoogleApp/Store/Player/Actions.cs @@ -4,5 +4,7 @@ public record PlayersLoadedAction(List Players); - public record SelectPlayerAction(int PlayerId); + public record SelectPlayerAction(PlayerState? Player); + + public record ChangePlayerAvailableAction(int PlayerId, bool IsAvailable); } diff --git a/KoogleApp/Store/Player/Reducers.cs b/KoogleApp/Store/Player/Reducers.cs index 3a97791..1c353b0 100644 --- a/KoogleApp/Store/Player/Reducers.cs +++ b/KoogleApp/Store/Player/Reducers.cs @@ -1,4 +1,5 @@ using Fluxor; +using System; namespace KoogleApp.Store.Player { @@ -8,18 +9,32 @@ namespace KoogleApp.Store.Player public static PlayersState OnPlayersLoaded(PlayersState state, PlayersLoadedAction action) { 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(); return state with { Players = players, Loaded = true}; } [ReducerMethod] - public static PlayersState OnSelectPlayerAction( - PlayersState state, - SelectPlayerAction action) + public static PlayerState OnSelectPlayerAction(PlayerState 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(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 }; + } } } diff --git a/KoogleApp/Store/Player/Selectors.cs b/KoogleApp/Store/Player/Selectors.cs index 3a3416f..783af82 100644 --- a/KoogleApp/Store/Player/Selectors.cs +++ b/KoogleApp/Store/Player/Selectors.cs @@ -1,13 +1,13 @@ namespace KoogleApp.Store.Player { - public class PlayersSelector + public static class PlayersSelector { - public static PlayerState? SelectedPlayer(PlayersState state) - { - if (state.SelectedPlayer == 0) - return null; + //public static PlayerState? SelectedPlayer(PlayersState state) + //{ + // if (state. == null) + // return null; - return state.Players.FirstOrDefault(_ => _.Id == state.SelectedPlayer); - } + // return state.Players.FirstOrDefault(_ => _.Id == state.SelectedPlayer.Id); + //} } } diff --git a/KoogleApp/Store/Player/State.cs b/KoogleApp/Store/Player/State.cs index e453243..363f843 100644 --- a/KoogleApp/Store/Player/State.cs +++ b/KoogleApp/Store/Player/State.cs @@ -3,16 +3,16 @@ namespace KoogleApp.Store.Player { [FeatureState] - public record PlayersState(bool Loaded, List Players, int SelectedPlayer) + public record PlayersState(bool Loaded, List Players) { - public PlayersState() : this(Loaded:false, Players: new List(), SelectedPlayer:0) + public PlayersState() : this(Loaded:false, Players: new List()) {} } [FeatureState] public record PlayerState(string Name, int Id, bool Available) { - public PlayerState(): this(Name:"",0,true) + public PlayerState(): this(Name:"",0,false) {} } }