Fix routing and move handling

This commit is contained in:
Marco 2023-12-25 17:50:58 +01:00
parent 17ac437f5b
commit ba947ae5e4
11 changed files with 24 additions and 136 deletions

View File

@ -44,7 +44,7 @@ class ApiWebsocketMessage {
case MessageType.boardState:
ret = ApiWebsocketMessage(
type: type,
move: null,
move: ApiMove.fromJson(json['move']),
turnColor: ApiColor.fromJson(json['turnColor']),
reason: null,
position: json['position'],

View File

@ -27,7 +27,7 @@ class ChessApp extends StatelessWidget {
useMaterial3: true,
),
routerConfig: ChessAppRouter.getInstance().router,
title: 'mChess',
title: 'mChess 0.1339',
),
);
}

View File

@ -10,9 +10,7 @@ class ChessSquareOuterDragTarget extends StatelessWidget {
final ChessPiece containedPiece;
const ChessSquareOuterDragTarget(
{super.key,
required this.coordinate,
required this.containedPiece});
{super.key, required this.coordinate, required this.containedPiece});
@override
Widget build(BuildContext context) {

View File

@ -67,12 +67,9 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
void moveAndPositionHandler(
ReceivedBoardState event, Emitter<ChessBoardState> emit) {
turnColor = state.newTurnColor == ChessColor.white
? ChessColor.black
: ChessColor.white;
ChessMove? move;
if (event.startSquare != null && event.endSquare != null) {
if (event.startSquare != ChessCoordinate.none() &&
event.endSquare != ChessCoordinate.none()) {
move = ChessMove(from: event.startSquare!, to: event.endSquare!);
ChessPositionManager.getInstance()
.recordMove(event.startSquare, event.endSquare, event.position);

View File

@ -95,6 +95,15 @@ class ChessPositionManager {
return _instance;
}
static ChessPosition _getDebugPostion() {
ChessPosition pos = {};
pos[ChessCoordinate(7, 7)] =
ChessPiece(ChessPieceClass.pawn, ChessColor.white);
return pos;
}
static ChessPosition _getStartingPosition() {
ChessPosition pos = {};

View File

@ -68,7 +68,7 @@ class ServerConnection {
}
void handleIncomingData(dynamic data) {
log("Data received:");
log('${DateTime.now()}: Data received:');
log(data);
var apiMessage = ApiWebsocketMessage.fromJson(jsonDecode(data));
@ -82,7 +82,7 @@ class ServerConnection {
break;
case MessageType.move:
handleIncomingMoveMessage(apiMessage);
log('ERROR: move message received');
break;
case MessageType.invalidMove:
@ -119,24 +119,6 @@ class ServerConnection {
myColor: ChessColor.fromApiColor(apiMessage.playerColor!)));
}
void handleIncomingMoveMessage(ApiWebsocketMessage apiMessage) {
if (apiMessage.position != null) {
var move = ChessMove.fromApiMove(apiMessage.move!);
ChessBloc.getInstance().add(
ReceivedBoardState(
startSquare: move.from,
endSquare: move.to,
position: ChessPositionManager.getInstance()
.fromPGNString(apiMessage.position!),
squareInCheck: ChessCoordinate.fromApiCoordinate(
apiMessage.squareInCheck ?? const ApiCoordinate(col: 0, row: 0)),
),
);
} else {
log('Error: no position received');
}
}
void handleInvalidMoveMessage(ApiWebsocketMessage apiMessage) {
log("invalid move message received, with move: ${apiMessage.move.toString()}");
ChessBloc.getInstance().add(

View File

@ -37,9 +37,9 @@ class _ChessGameState extends State<ChessGame> {
child: Container(
margin: const EdgeInsets.all(10),
child: BlocListener<PromotionBloc, PromotionState>(
listener: (context, state) {
listener: (listenerContext, state) {
if (state.showPromotionDialog) {
promotionDialogBuilder(context, state.colorMoved);
promotionDialogBuilder(listenerContext, state.colorMoved);
}
},
child: BlocBuilder<ChessBloc, ChessBoardState>(
@ -55,7 +55,7 @@ class _ChessGameState extends State<ChessGame> {
floatingActionButton: FloatingActionButton(
onPressed: () {
ServerConnection.getInstance().disconnectExistingConnection();
context.push('/');
GoRouter.of(context).goNamed('lobbySelector');
},
child: const Icon(Icons.cancel),
),

View File

@ -70,7 +70,7 @@ class _HostGameWidgetState extends State<HostGameWidget> {
listener: (context, state) {
// We wait for our opponent to connect
if (state.opponentConnected) {
context.push('/game', extra: chessGameArgs);
context.goNamed('game', extra: chessGameArgs);
}
},
child: Column(
@ -98,7 +98,7 @@ class _HostGameWidgetState extends State<HostGameWidget> {
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.cancel),
onPressed: () {
context.push('/');
context.pop();
},
),
);

View File

@ -74,7 +74,7 @@ class _LobbySelectorState extends State<LobbySelector> {
TextButton(
child: const Text('Host'),
onPressed: () {
context.push('/host');
context.push('/host'); //replaces joinOrHostDialog
},
),
TextButton(
@ -137,7 +137,7 @@ class _LobbySelectorState extends State<LobbySelector> {
);
if (!chessGameArgs.isValid()) {
context.push('/');
context.goNamed('lobbySelector');
const snackBar = SnackBar(
backgroundColor: Colors.amberAccent,
content: Text("Game information is corrupted"),
@ -146,7 +146,7 @@ class _LobbySelectorState extends State<LobbySelector> {
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
context.push('/game', extra: chessGameArgs);
context.pushReplacement('/game', extra: chessGameArgs);
}
Future<PlayerInfo?> joinPrivateGame() async {

View File

@ -1,91 +0,0 @@
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:http/http.dart';
import 'package:mchess/api/register.dart';
import 'package:mchess/pages/chess_game.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class PrepareRandomGameWidget extends StatefulWidget {
const PrepareRandomGameWidget({super.key});
@override
State<PrepareRandomGameWidget> createState() =>
_PrepareRandomGameWidgetState();
}
class _PrepareRandomGameWidgetState extends State<PrepareRandomGameWidget> {
late Future randomGameResponse;
@override
void initState() {
randomGameResponse = registerForRandomGame();
goToGameWhenResponseIsHere(randomGameResponse as Future<PlayerInfo?>);
super.initState();
}
void goToGameWhenResponseIsHere(Future<PlayerInfo?> resp) {
resp.then((value) {
if (value == null) return;
context.push(
'/game',
extra: ChessGameArguments(
lobbyID: value.lobbyID!,
playerID: value.playerID!,
passphrase: value.passphrase),
);
});
}
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: SizedBox(
height: 100,
width: 100,
child: CircularProgressIndicator(),
),
),
);
}
Future<PlayerInfo?> registerForRandomGame() async {
String addr;
Response response;
if (kDebugMode) {
addr = 'http://localhost:8080/api/random';
} else {
addr = 'https://chess.sw-gross.de:9999/api/random';
}
try {
response = await http
.get(Uri.parse(addr), headers: {"Accept": "application/json"});
} catch (e) {
if (!context.mounted) return null;
const snackBar = SnackBar(
backgroundColor: Colors.amberAccent,
content: Text("mChess server is not responding. Try again or give up"),
);
Future.delayed(const Duration(seconds: 2), () {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context).showSnackBar(snackBar);
context.pop();
});
return null;
}
if (response.statusCode == 200) {
log(response.body);
return PlayerInfo.fromJson(jsonDecode(response.body));
}
return null;
}
}

View File

@ -2,7 +2,6 @@ import 'package:go_router/go_router.dart';
import 'package:mchess/pages/chess_game.dart';
import 'package:mchess/pages/lobby_selector.dart';
import 'package:mchess/pages/host_game.dart';
import 'package:mchess/pages/prepare_random_game.dart';
class ChessAppRouter {
static final ChessAppRouter _instance = ChessAppRouter._internal();
@ -22,12 +21,6 @@ class ChessAppRouter {
return const LobbySelector();
},
),
GoRoute(
path: '/prepareRandom',
name: 'prepareRandom',
builder: (context, state) {
return const PrepareRandomGameWidget();
}),
GoRoute(
path: '/host',
name: 'host',