KoogleApp/KoogleApp/Components/Dialogs/StartGameDialog.razor

124 lines
3.8 KiB
Plaintext

@using KoogleApp.Games
@using KoogleApp.Model
@using KoogleApp.Services
@using KoogleApp.Store.DayFeature
@using KoogleApp.Store.Game.Setup
@using KoogleApp.Store.Game.ThrowPanel
@using KoogleApp.Components.Controls
@using KoogleApp.Store.Player
@using Dispatcher = Fluxor.Dispatcher
@inherits FluxorComponent
@inject GameTypeService GameTypeService
@inject IState<SetupState> SetupState
@inject IState<PlayersState> PlayersState
@inject IState<DayState> DayState
@inject IDispatcher Dispatcher
<MudDialog Style="height: 800px; width:600px">
<TitleContent>
<MudText Typo="Typo.h6">
<MudIcon Icon="@Icons.Material.Filled.Start" Class="mr-3 mb-n1" />Neues Spiel starten?
</MudText>
</TitleContent>
<DialogContent>
<MudSelect T="IKnownGame" Label="Spiel" @bind-Value="_selectedGameType" HelperText="Wähle ein Spiel aus"
Converter="converter"
OpenIcon="@Icons.Material.Filled.Mode" AdornmentColor="Color.Primary">
@foreach (var item in _gameTypes)
{
<MudSelectItem T="IKnownGame" Value="@(item)">@item.Name</MudSelectItem>
}
</MudSelect>
<MudGrid>
@if (_selectedSetupComponentType is not null)
{
<MudItem xs="12">
<h4 class="mt-2">Spieleinstellungen auswählen:</h4>
</MudItem>
<MudItem xs="12">
<PlayerSelect @bind-SelectedValues="Players"/>
</MudItem>
<DynamicComponent Type="_selectedSetupComponentType"/>
}
</MudGrid>
</DialogContent>
<DialogActions>
<MudButton OnClick="Cancel">Abbrechen</MudButton>
<MudButton Color="Color.Primary" OnClick="Start">Start</MudButton>
</DialogActions>
</MudDialog>
@code {
Converter<IKnownGame> converter = new Converter<IKnownGame>
{
SetFunc = value => value?.Name,
GetFunc = text => null,
};
public IEnumerable<PlayerState> Players { get; set; }
[CascadingParameter]
private IMudDialogInstance MudDialog { get; set; }
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
_gameTypes.AddRange(GameTypeService.GetGameTypes());
Players = PlayersState.Value.Players.Where(p => DayState.Value.PlayerIds.Contains(p.Id)).ToList();
StateHasChanged();
}
}
Type? _selectedSetupComponentType => _selectedGameType?.SetupComponentType;
IKnownGame? _selectedGameType
{
get => SetupState.Value.Game;
set => Dispatcher.Dispatch(new SetGameAction(value));
}
private readonly List<IKnownGame> _gameTypes = [];
int[] PlayerIds => Players.Select(p => p.Id).ToArray();
public ThrowMode ThrowMode { get; set; }
[Parameter]
public string Description { get; set; } = "";
private void Cancel() => MudDialog.Cancel();
private void Start()
{
var setupModel = Activator.CreateInstance(_selectedGameType.SetupModelType) as IGameSetupModel;
setupModel.ParticipantsMode = SetupState.Value.ParticipantsMode;
setupModel.ThrowMode = SetupState.Value.ThrowMode;
setupModel.ThrowsPerRound = SetupState.Value.ThrowsPerRound;
setupModel.Participants = PlayerIds;
setupModel.DayId = DayState.Value.Id;
setupModel.KnownGameType = SetupState.Value.Game.GetType().Name;
// MudDialog.Close(DialogResult.Ok(new StartParams(
// DayState.Value.Id,
// SetupState.Value.ThrowMode,
// SetupState.Value.ThrowsPerRound,
// PlayerIds,
// SetupState.Value.ParticipantsMode,
// SetupState.Value.Game.GetType().Name
// )));
MudDialog.Close(DialogResult.Ok(setupModel));
}
}