Marco
13bcfb1131
Show checkmate screen, once the server sends the 'gameEnded' message. Additionally, show an icon that lets users copy the passphrase to the clipboard.
106 lines
2.7 KiB
Dart
106 lines
2.7 KiB
Dart
import 'package:mchess/api/move.dart';
|
|
|
|
enum MessageType {
|
|
boardState,
|
|
move,
|
|
invalidMove,
|
|
colorDetermined,
|
|
gameEnded;
|
|
|
|
String toJson() => name;
|
|
static MessageType fromJson(String json) => values.byName(json);
|
|
}
|
|
|
|
enum ApiColor {
|
|
black,
|
|
white;
|
|
|
|
String toJson() => name;
|
|
static ApiColor fromJson(String json) => values.byName(json);
|
|
}
|
|
|
|
class ApiWebsocketMessage {
|
|
final MessageType type;
|
|
final ApiMove? move;
|
|
final ApiColor? turnColor;
|
|
final ApiColor? playerColor;
|
|
final String? reason;
|
|
final String? position;
|
|
final ApiCoordinate? squareInCheck;
|
|
|
|
ApiWebsocketMessage({
|
|
required this.type,
|
|
required this.move,
|
|
required this.turnColor,
|
|
required this.playerColor,
|
|
required this.reason,
|
|
required this.position,
|
|
required this.squareInCheck,
|
|
});
|
|
|
|
factory ApiWebsocketMessage.fromJson(Map<String, dynamic> json) {
|
|
final type = MessageType.fromJson(json['messageType']);
|
|
ApiWebsocketMessage ret;
|
|
switch (type) {
|
|
case MessageType.boardState:
|
|
ret = ApiWebsocketMessage(
|
|
type: type,
|
|
move: ApiMove.fromJson(json['move']),
|
|
turnColor: ApiColor.fromJson(json['turnColor']),
|
|
reason: null,
|
|
position: json['position'],
|
|
squareInCheck: null,
|
|
playerColor: ApiColor.fromJson(json['playerColor']),
|
|
);
|
|
case MessageType.colorDetermined:
|
|
ret = ApiWebsocketMessage(
|
|
type: type,
|
|
move: null,
|
|
turnColor: null,
|
|
reason: null,
|
|
position: null,
|
|
squareInCheck: null,
|
|
playerColor: ApiColor.fromJson(json['playerColor']),
|
|
);
|
|
break;
|
|
case MessageType.move:
|
|
ret = ApiWebsocketMessage(
|
|
type: type,
|
|
move: ApiMove.fromJson(json['move']),
|
|
turnColor: null,
|
|
reason: null,
|
|
position: json['position'],
|
|
squareInCheck: json['squareInCheck'],
|
|
playerColor: null);
|
|
break;
|
|
case MessageType.invalidMove:
|
|
ret = ApiWebsocketMessage(
|
|
type: type,
|
|
move: ApiMove.fromJson(json['move']),
|
|
turnColor: null,
|
|
reason: json['reason'],
|
|
position: null,
|
|
squareInCheck: json['squareInCheck'],
|
|
playerColor: null,
|
|
);
|
|
case MessageType.gameEnded:
|
|
ret = ApiWebsocketMessage(
|
|
type: type,
|
|
move: null,
|
|
turnColor: null,
|
|
reason: json['reason'],
|
|
position: null,
|
|
squareInCheck: null,
|
|
playerColor: null,
|
|
);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
'messageType': type,
|
|
'move': move,
|
|
'color': turnColor,
|
|
};
|
|
}
|