Marco
7a51e71767
Additionally, we set some groundwork for storing the game data (lobby id, player id, passphrase) in permanent storage in order to reconnect with it later.
103 lines
2.5 KiB
Dart
103 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:mchess/chess_bloc/chess_bloc.dart';
|
|
|
|
import 'package:mchess/chess/chess_board.dart';
|
|
import 'package:mchess/chess_bloc/promotion_bloc.dart';
|
|
import 'package:mchess/connection/ws_connection.dart';
|
|
import 'package:mchess/utils/chess_utils.dart';
|
|
import 'package:mchess/utils/widgets/promotion_dialog.dart';
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
class ChessGame extends StatefulWidget {
|
|
final UuidValue playerID;
|
|
final UuidValue lobbyID;
|
|
final String? passphrase;
|
|
const ChessGame(
|
|
{required this.playerID,
|
|
required this.lobbyID,
|
|
required this.passphrase,
|
|
super.key});
|
|
|
|
@override
|
|
State<ChessGame> createState() => _ChessGameState();
|
|
}
|
|
|
|
class _ChessGameState extends State<ChessGame> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: Center(
|
|
child: Container(
|
|
margin: const EdgeInsets.all(10),
|
|
child: BlocListener<PromotionBloc, PromotionState>(
|
|
listener: (context, state) {
|
|
if (state.showPromotionDialog) {
|
|
promotionDialogBuilder(context, state.colorMoved);
|
|
}
|
|
},
|
|
child: BlocBuilder<ChessBloc, ChessBoardState>(
|
|
builder: (context, state) {
|
|
return ChessBoard(
|
|
boardState: state,
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
),
|
|
floatingActionButton: FloatingActionButton(
|
|
onPressed: () {
|
|
ServerConnection.getInstance().disconnectExistingConnection();
|
|
context.push('/');
|
|
},
|
|
child: const Icon(Icons.cancel),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> promotionDialogBuilder(BuildContext context, ChessColor color) {
|
|
return showDialog<void>(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (BuildContext context) {
|
|
return PromotionDialog(
|
|
sideColor: color,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
class ChessGameArguments {
|
|
final UuidValue lobbyID;
|
|
final UuidValue playerID;
|
|
final String? passphrase;
|
|
|
|
ChessGameArguments({
|
|
required this.lobbyID,
|
|
required this.playerID,
|
|
required this.passphrase,
|
|
});
|
|
|
|
bool isValid() {
|
|
try {
|
|
lobbyID.validate();
|
|
playerID.validate();
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
|
|
if (passphrase == null) return false;
|
|
if (passphrase!.isEmpty) return false;
|
|
|
|
return true;
|
|
}
|
|
}
|