@using Shogi.Contracts.Api @using Shogi.Contracts.Types; @using System.Text.RegularExpressions; @inject IShogiApi ShogiApi @inject AccountState Account; @inject PromotePrompt PromotePrompt;
@for (var rank = 1; rank < 10; rank++) { foreach (var file in Files) { var position = $"{file}{rank}"; var piece = session?.BoardState.Board[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 { static readonly string[] Files = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I" }; [Parameter] public string? SessionName { get; set; } WhichPlayer Perspective => Account.User?.Id == session?.Player1 ? WhichPlayer.Player1 : WhichPlayer.Player2; Session? session; 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; } } string? selectedPosition; WhichPiece? selectedPiece; protected override async Task OnParametersSetAsync() { if (!string.IsNullOrWhiteSpace(SessionName)) { this.session = await ShogiApi.GetSession(SessionName); } } bool ShouldPromptForPromotion(string position) { if (Perspective == WhichPlayer.Player1 && Regex.IsMatch(position, ".[7-9]")) { return true; } if (Perspective == WhichPlayer.Player2 && Regex.IsMatch(position, ".[1-3]")) { return true; } return false; } async void OnClickTile(Piece? piece, string position) { if (SessionName == null) return; if (selectedPosition == null) { selectedPosition = position; return; } else if (selectedPosition == position) { selectedPosition = null; return; } else if (piece != null) { if (ShouldPromptForPromotion(position) || ShouldPromptForPromotion(selectedPosition)) { PromotePrompt.Show(SessionName, new MovePieceCommand { From = selectedPosition, To = position }); } else { await ShogiApi.PostMove(SessionName, new MovePieceCommand { From = selectedPosition, IsPromotion = false, To = position }); } } } void OnClickHand(Piece piece) { selectedPiece = piece.WhichPiece; } }