@using Shogi.Contracts.Types; @inject PromotePrompt PromotePrompt; @inject AccountState AccountState;
@if (IsSpectating) { }
@for (var rank = 1; rank < 10; rank++) { foreach (var file in Files) { var position = $"{file}{rank}"; var piece = Session?.BoardState.Board[position]; var isSelected = piece != null && SelectedPosition == position;
} }
9 8 7 6 5 4 3 2 1
A B C D E F G H I

Do you wish to promote?

@if (Session != null) { }
@code { [Parameter] public bool IsSpectating { get; set; } = false; [Parameter] public WhichPlayer Perspective { get; set; } [Parameter] public Session? Session { get; set; } [Parameter] public string? SelectedPosition { get; set; } // TODO: Exchange these OnClick actions for events like "SelectionChangedEvent" and "MoveFromBoardEvent" and "MoveFromHandEvent". [Parameter] public Func? OnClickTile { get; set; } [Parameter] public Func? OnClickHand { get; set; } [Parameter] public Func? OnClickJoinGame { get; set; } static readonly string[] Files = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I" }; private IReadOnlyCollection OpponentHand { get { if (this.Session == null) return Array.Empty(); return Perspective == WhichPlayer.Player1 ? this.Session.BoardState.Player1Hand : this.Session.BoardState.Player2Hand; } } IReadOnlyCollection UserHand { get { if (this.Session == null) return Array.Empty(); return Perspective == WhichPlayer.Player1 ? this.Session.BoardState.Player1Hand : this.Session.BoardState.Player2Hand; } } private Action OnClickTileInternal(Piece? piece, string position) => () => OnClickTile?.Invoke(piece, position); private Action OnClickHandInternal(Piece piece) => () => OnClickHand?.Invoke(piece); private Action OnClickJoinGameInternal() => () => OnClickJoinGame?.Invoke(); }