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

View File

@ -4,27 +4,38 @@
@using KoogleApp.Services;
@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">
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
<MudText Typo="Typo.h4">@_player?.Name</MudText>
<MudSwitch @bind-Value="available">todo: @available</MudSwitch>
</MudPaper>
</MudItem>
<MudItem xs="12">
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
<MudText Typo="Typo.h4">@PlayerState.Value.Name</MudText>
<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>
</MudItem>
<MudItem xs="12">
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
<PlayerExpenseList/>
</MudPaper>
</MudItem>
</MudGrid>
<MudItem xs="12">
<MudPaper Class="d-flex align-center justify-center mud-width-full py-0">
<PlayerExpenseList/>
</MudPaper>
</MudItem>
</MudGrid>
}
@code {
private bool available = true;
private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value);
// private bool available = true;
// private PlayerState? _player => PlayersSelector.SelectedPlayer(PlayersState.Value);
}

View File

@ -5,13 +5,14 @@
@using KoogleApp.Services
@using KoogleApp.Store.Player
@inherits FluxorComponent
@implements IMyHandle<PlayerViewChangedMessage>
@implements IDisposable
@inject IMyEventAggregator _eventAggregator
@inject IMyEventAggregator EventAggregator
@inject IState<PlayersState> PlayersState
@inject IState<PlayerState> PlayerState
@inject IDispatcher Dispatcher
@* @inject SharedDataService _dataService *@
@ -19,7 +20,6 @@
@if (PlayersState.Value != null)
{
<MudList T="PlayerState" Color="@Color.Info"
@ref="_list"
@bind-SelectedValue="SelectedValue"
SelectionMode="SelectionMode.SingleSelection">
@ -37,11 +37,13 @@
@code {
private MudList<PlayerState> _list;
private PlayerState _selectedValue;
public PlayerState? SelectedValue;
private List<Player>? _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);
}
}

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 SelectPlayerAction(int PlayerId);
public record SelectPlayerAction(PlayerState? Player);
public record ChangePlayerAvailableAction(int PlayerId, bool IsAvailable);
}

View File

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

View File

@ -3,16 +3,16 @@
namespace KoogleApp.Store.Player
{
[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]
public record PlayerState(string Name, int Id, bool Available)
{
public PlayerState(): this(Name:"",0,true)
public PlayerState(): this(Name:"",0,false)
{}
}
}