KoogleApp/src/Koogle.Web/Components/Game/GameBoardPanel.razor

86 lines
2.3 KiB
Plaintext

@using Fluxor
@using Koogle.Application.Games
@using Koogle.Domain.Interfaces
@using Koogle.Web.Store.GameState
@using MudBlazor
@inherits Fluxor.Blazor.Web.Components.FluxorComponent
@inject IState<GameState> GameState
@inject GameDefinitionRegistry GameRegistry
<MudPaper Class="pa-4">
@if (!GameState.Value.IsGameActive)
{
<MudAlert Severity="Severity.Info">
Kein aktives Spiel. Starte ein neues Spiel, um die Tafel zu sehen.
</MudAlert>
}
else if (string.IsNullOrEmpty(GameState.Value.GameTypeName))
{
<MudAlert Severity="Severity.Warning">
Spieltyp nicht erkannt.
</MudAlert>
}
else
{
@* Header with game type info *@
<MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween" Class="mb-4">
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
<MudIcon Icon="@Icons.Material.Filled.TableChart" />
<MudText Typo="Typo.h6">@_gameDefinition?.DisplayName Tafel</MudText>
</MudStack>
<MudChip T="string" Color="Color.Success" Size="Size.Small">
Aktiv
</MudChip>
</MudStack>
@* Dynamic game board component *@
@if (_gameDefinition?.BoardComponentType != null)
{
<DynamicComponent Type="@_gameDefinition.BoardComponentType" />
}
else
{
<MudAlert Severity="Severity.Warning">
Keine Tafel-Komponente für diesen Spieltyp verfügbar.
</MudAlert>
}
}
</MudPaper>
@code {
private IGameDefinition? _gameDefinition;
protected override void OnInitialized()
{
base.OnInitialized();
GameState.StateChanged += OnGameStateChanged;
UpdateGameDefinition();
}
private void OnGameStateChanged(object? sender, EventArgs e)
{
UpdateGameDefinition();
InvokeAsync(StateHasChanged);
}
private void UpdateGameDefinition()
{
var typeName = GameState.Value.GameTypeName;
if (!string.IsNullOrEmpty(typeName))
{
_gameDefinition = GameRegistry.Get(typeName);
}
else
{
_gameDefinition = null;
}
}
public void Dispose()
{
GameState.StateChanged -= OnGameStateChanged;
}
}