react-chessboard-ui 2.10.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,6 +16,7 @@ declare type ChessBoardProps = {
16
16
  arrows?: (ArrowCoords & {
17
17
  color?: string;
18
18
  })[];
19
+ toggleTurn?: boolean;
19
20
  };
20
21
  export declare const ChessBoard: FC<ChessBoardProps>;
21
22
  export {};
@@ -6,12 +6,14 @@ declare type UseChessBoardInteractiveProps = {
6
6
  onChange: (moveData: MoveData) => void;
7
7
  onEndGame: (result: GameResult) => void;
8
8
  onClickByChessBoard?: (data: ClickData) => void;
9
+ toggleTurn?: boolean;
9
10
  };
10
11
  export declare const useChessBoardInteractive: (props: UseChessBoardInteractiveProps) => {
11
12
  fromPos: CellPos;
12
13
  newMove: ChangeMove;
13
14
  animated: boolean;
14
15
  movesTrail: [CellPos, CellPos];
16
+ invalidFEN: boolean;
15
17
  boardConfig: ChessBoardConfig;
16
18
  markedCells: CellPos[];
17
19
  grabbingPos: CellPos;
@@ -31,6 +33,7 @@ export declare const useChessBoardInteractive: (props: UseChessBoardInteractiveP
31
33
  handleClick: (cellPos: CellPos, viewOnly?: boolean) => void;
32
34
  clearFromPos: () => void;
33
35
  handleGrabEnd: (cellPos: CellPos, withTransition?: boolean) => void;
36
+ setInvalidFEN: import("react").Dispatch<import("react").SetStateAction<boolean>>;
34
37
  handleGrabbing: (x: number, y: number) => void;
35
38
  endRenderArrow: ([x, y]: CellPos) => void;
36
39
  setActualState: import("react").Dispatch<import("react").SetStateAction<Cell[][]>>;
@@ -27,6 +27,7 @@ export declare const partFENtoState: (notation: string) => Cell[][];
27
27
  export declare const FENtoGameState: (FEN: string, reversed?: boolean) => {
28
28
  boardState: Cell[][];
29
29
  currentColor: FigureColor;
30
+ invalidFEN?: boolean;
30
31
  };
31
32
  /**
32
33
  * Возвращает FEN битое поле из состояние доски
package/dist/index.css CHANGED
@@ -148,6 +148,47 @@
148
148
  align-items: center;
149
149
  }
150
150
 
151
+ ._jyC3- {
152
+ z-index: 102;
153
+ position: absolute;
154
+ top: 0;
155
+ right: 0;
156
+ bottom: 0;
157
+ left: 0;
158
+ -webkit-backdrop-filter: blur(4px);
159
+ backdrop-filter: blur(4px);
160
+ display: flex;
161
+ justify-content: center;
162
+ align-items: center;
163
+ }
164
+
165
+ ._8urIN {
166
+ padding: 12px 14px;
167
+ border: 1px solid #f4b8b8;
168
+ border-radius: 6px;
169
+ background: #fff1f1;
170
+ color: #8a1f1f;
171
+ font-size: 14px;
172
+ line-height: 1.5;
173
+ }
174
+
175
+ ._8urIN a {
176
+ color: #b42318;
177
+ font-weight: 600;
178
+ text-decoration: underline;
179
+ text-underline-offset: 2px;
180
+ cursor: pointer;
181
+ }
182
+
183
+ ._8urIN a:hover {
184
+ color: #7a1712;
185
+ }
186
+
187
+ ._3p5AF {
188
+ color: #6b6b6b !important;
189
+ font-size: 12px;
190
+ }
191
+
151
192
  ._1RqCc {
152
193
  width: 100%;
153
194
  height: 100%;
package/dist/index.js CHANGED
@@ -1491,6 +1491,8 @@ var prepareCastlingByFEN = function prepareCastlingByFEN(castlingNotation, state
1491
1491
  preparedState[preparedState.length - 1][preparedState.length - 1].figure = _extends({}, preparedState[preparedState.length - 1][preparedState.length - 1].figure, {
1492
1492
  touched: false
1493
1493
  });
1494
+ }
1495
+ if (!!preparedState[preparedState.length - 1][4].figure) {
1494
1496
  preparedState[preparedState.length - 1][4].figure = _extends({}, preparedState[preparedState.length - 1][4].figure, {
1495
1497
  touched: false
1496
1498
  });
@@ -1501,6 +1503,8 @@ var prepareCastlingByFEN = function prepareCastlingByFEN(castlingNotation, state
1501
1503
  preparedState[preparedState.length - 1][0].figure = _extends({}, preparedState[preparedState.length - 1][0].figure, {
1502
1504
  touched: false
1503
1505
  });
1506
+ }
1507
+ if (!!preparedState[preparedState.length - 1][4].figure) {
1504
1508
  preparedState[preparedState.length - 1][4].figure = _extends({}, preparedState[preparedState.length - 1][4].figure, {
1505
1509
  touched: false
1506
1510
  });
@@ -1511,6 +1515,8 @@ var prepareCastlingByFEN = function prepareCastlingByFEN(castlingNotation, state
1511
1515
  preparedState[0][preparedState.length - 1].figure = _extends({}, preparedState[0][preparedState.length - 1].figure, {
1512
1516
  touched: false
1513
1517
  });
1518
+ }
1519
+ if (!!preparedState[0][4].figure) {
1514
1520
  preparedState[0][4].figure = _extends({}, preparedState[0][4].figure, {
1515
1521
  touched: false
1516
1522
  });
@@ -1521,6 +1527,8 @@ var prepareCastlingByFEN = function prepareCastlingByFEN(castlingNotation, state
1521
1527
  preparedState[0][0].figure = _extends({}, preparedState[0][0].figure, {
1522
1528
  touched: false
1523
1529
  });
1530
+ }
1531
+ if (!!preparedState[0][4].figure) {
1524
1532
  preparedState[0][4].figure = _extends({}, preparedState[0][4].figure, {
1525
1533
  touched: false
1526
1534
  });
@@ -1555,39 +1563,47 @@ var partFENtoState = function partFENtoState(notation) {
1555
1563
  });
1556
1564
  };
1557
1565
  var FENtoGameState = function FENtoGameState(FEN, reversed) {
1558
- var gameState = {
1559
- boardState: [],
1560
- currentColor: 'white'
1561
- };
1562
- var _FEN$split = FEN.split(' '),
1563
- stateNotaion = _FEN$split[0],
1564
- currentColor = _FEN$split[1],
1565
- FENcastling = _FEN$split[2],
1566
- beatedField = _FEN$split[3],
1567
- _ = _FEN$split.slice(4);
1568
- var preparedStateNotation = '';
1569
- for (var i = 0; i < stateNotaion.length; i++) {
1570
- if (!isNaN(parseInt(stateNotaion[i]))) {
1571
- var dotsCount = parseInt(stateNotaion[i]);
1572
- for (var dotI = 0; dotI < dotsCount; dotI++) preparedStateNotation += '.';
1573
- continue;
1574
- }
1575
- preparedStateNotation += stateNotaion[i];
1576
- }
1577
- gameState.boardState = partFENtoState(preparedStateNotation);
1578
- gameState.currentColor = currentColor === 'w' ? 'white' : 'black';
1579
- gameState.boardState = prepareCastlingByFEN(FENcastling, gameState.boardState);
1580
- if (beatedField !== '-') {
1581
- var posBeatedCell = getPositionByFEN(beatedField);
1582
- gameState.boardState[posBeatedCell[0]][posBeatedCell[1]] = _extends({}, gameState.boardState[posBeatedCell[0]][posBeatedCell[1]], {
1583
- beated: true
1584
- });
1566
+ try {
1567
+ var gameState = {
1568
+ boardState: [],
1569
+ currentColor: 'white'
1570
+ };
1571
+ var _FEN$split = FEN.split(' '),
1572
+ stateNotaion = _FEN$split[0],
1573
+ currentColor = _FEN$split[1],
1574
+ FENcastling = _FEN$split[2],
1575
+ beatedField = _FEN$split[3],
1576
+ _ = _FEN$split.slice(4);
1577
+ var preparedStateNotation = '';
1578
+ for (var i = 0; i < stateNotaion.length; i++) {
1579
+ if (!isNaN(parseInt(stateNotaion[i]))) {
1580
+ var dotsCount = parseInt(stateNotaion[i]);
1581
+ for (var dotI = 0; dotI < dotsCount; dotI++) preparedStateNotation += '.';
1582
+ continue;
1583
+ }
1584
+ preparedStateNotation += stateNotaion[i];
1585
+ }
1586
+ gameState.boardState = partFENtoState(preparedStateNotation);
1587
+ gameState.currentColor = currentColor === 'w' ? 'white' : 'black';
1588
+ gameState.boardState = prepareCastlingByFEN(FENcastling, gameState.boardState);
1589
+ if (beatedField !== '-') {
1590
+ var posBeatedCell = getPositionByFEN(beatedField);
1591
+ gameState.boardState[posBeatedCell[0]][posBeatedCell[1]] = _extends({}, gameState.boardState[posBeatedCell[0]][posBeatedCell[1]], {
1592
+ beated: true
1593
+ });
1594
+ }
1595
+ if (reversed) return {
1596
+ boardState: JSChessEngine.reverseChessBoard(gameState.boardState),
1597
+ currentColor: gameState.currentColor
1598
+ };
1599
+ return gameState;
1600
+ } catch (_unused) {
1601
+ return {
1602
+ boardState: INITIAL_CELLS,
1603
+ currentColor: 'white',
1604
+ invalidFEN: true
1605
+ };
1585
1606
  }
1586
- if (reversed) return {
1587
- boardState: JSChessEngine.reverseChessBoard(gameState.boardState),
1588
- currentColor: gameState.currentColor
1589
- };
1590
- return gameState;
1591
1607
  };
1592
1608
  var getBeatedCellFENfromState = function getBeatedCellFENfromState(state) {
1593
1609
  var beatedFieldFEN = '-';
@@ -1679,7 +1695,7 @@ var stateToFEN = function stateToFEN(state, currentColor, countMoves) {
1679
1695
  return positionsFEN + " " + colorFEN + " " + casttlingFEN + " " + beatedFieldFEN + " " + blackMoves + " " + countMoves;
1680
1696
  };
1681
1697
 
1682
- var styles = {"chessBoard":"_3XI6H","figuresLayout":"_2SyRK","controlLayout":"_3OVc8","controlLayoutGrabbing":"_G0IIl","interactiveLayout":"_3THn5","selectedSquare":"_1YsOr","pickedSquare":"_3MMcp","checkedSquare":"_KLkVN","interactiveCell":"_27yHq","possibleMoveMark":"_UYGA_","row":"_2XKSc","piece":"_2QHnf","holdedPiece":"_3z25q","bluredPiece":"_10meo","hiddenFigureEffect":"_2YKzU","arrow":"_12Bbd","arrowEnd":"_1BC3I","piecePicker":"_3gVhA","piecePickerItem":"_3EtmA","chessBoardPiecePicker":"_2xZM1","movesTrail":"_1RqCc","lightSquare":"_1B0qo","darkSquare":"_1NBqS"};
1698
+ var styles = {"chessBoard":"_3XI6H","figuresLayout":"_2SyRK","controlLayout":"_3OVc8","controlLayoutGrabbing":"_G0IIl","interactiveLayout":"_3THn5","selectedSquare":"_1YsOr","pickedSquare":"_3MMcp","checkedSquare":"_KLkVN","interactiveCell":"_27yHq","possibleMoveMark":"_UYGA_","row":"_2XKSc","piece":"_2QHnf","holdedPiece":"_3z25q","bluredPiece":"_10meo","hiddenFigureEffect":"_2YKzU","arrow":"_12Bbd","arrowEnd":"_1BC3I","piecePicker":"_3gVhA","piecePickerItem":"_3EtmA","chessBoardPiecePicker":"_2xZM1","chessBoardInvalidFenMessage":"_jyC3-","fenErrorMessage":"_8urIN","fenErrorMessageClose":"_3p5AF","movesTrail":"_1RqCc","lightSquare":"_1B0qo","darkSquare":"_1NBqS"};
1683
1699
 
1684
1700
  var CHESS_PIECES_MAP = {
1685
1701
  'pawn-white': function pawnWhite(size) {
@@ -2312,7 +2328,9 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2312
2328
  var config = props.config,
2313
2329
  onChange = props.onChange,
2314
2330
  onEndGame = props.onEndGame,
2315
- onClickByChessBoard = props.onClickByChessBoard;
2331
+ onClickByChessBoard = props.onClickByChessBoard,
2332
+ _props$toggleTurn = props.toggleTurn,
2333
+ toggleTurn = _props$toggleTurn === void 0 ? true : _props$toggleTurn;
2316
2334
  var _useState = React.useState(DEFAULT_CHESSBORD_CONFIG),
2317
2335
  boardConfig = _useState[0],
2318
2336
  setBoardConfig = _useState[1];
@@ -2382,6 +2400,9 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2382
2400
  var _useState23 = React.useState(false),
2383
2401
  animated = _useState23[0],
2384
2402
  setAnimated = _useState23[1];
2403
+ var _useState24 = React.useState(false),
2404
+ invalidFEN = _useState24[0],
2405
+ setInvalidFEN = _useState24[1];
2385
2406
  var clearFromPos = function clearFromPos() {
2386
2407
  return setFromPos([-1, -1]);
2387
2408
  };
@@ -2395,7 +2416,7 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2395
2416
  return setClickPossibleMoves([]);
2396
2417
  };
2397
2418
  var toggleCurrentColor = function toggleCurrentColor() {
2398
- return setCurrentColor(function (prevColor) {
2419
+ if (toggleTurn) setCurrentColor(function (prevColor) {
2399
2420
  return prevColor === 'white' ? 'black' : 'white';
2400
2421
  });
2401
2422
  };
@@ -2511,8 +2532,10 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2511
2532
  var _JSChessEngine$change = JSChessEngine.changeState(actualState, figure, to, from, boardReversed),
2512
2533
  updatedCells = _JSChessEngine$change.updatedCells,
2513
2534
  attackedPos = _JSChessEngine$change.attackedPos;
2514
- var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2515
- setLinesWithCheck(linesCheck);
2535
+ if (toggleTurn) {
2536
+ var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2537
+ setLinesWithCheck(linesCheck);
2538
+ }
2516
2539
  setActualState(updatedCells);
2517
2540
  if (figure.type === 'pawn' && (to[1] === 0 || to[1] === actualState.length - 1)) {
2518
2541
  setTargetPos(to);
@@ -2546,8 +2569,10 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2546
2569
  figure = _change$move.figure;
2547
2570
  var _JSChessEngine$change2 = JSChessEngine.changeState(actualState, figure, to, from, boardReversed),
2548
2571
  updatedCells = _JSChessEngine$change2.updatedCells;
2549
- var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2550
- setLinesWithCheck(linesCheck);
2572
+ if (toggleTurn) {
2573
+ var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2574
+ setLinesWithCheck(linesCheck);
2575
+ }
2551
2576
  var updatedChange = _extends({}, change, {
2552
2577
  move: boardReversed ? JSChessEngine.reverseMove(change.move) : change.move
2553
2578
  });
@@ -2568,8 +2593,10 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2568
2593
  var _JSChessEngine$change3 = JSChessEngine.changeState(actualState, figure, to, from, boardReversed),
2569
2594
  updatedCells = _JSChessEngine$change3.updatedCells,
2570
2595
  attackedPos = _JSChessEngine$change3.attackedPos;
2571
- var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2572
- setLinesWithCheck(linesCheck);
2596
+ if (toggleTurn) {
2597
+ var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2598
+ setLinesWithCheck(linesCheck);
2599
+ }
2573
2600
  setActualState(updatedCells);
2574
2601
  if (figure.type === 'pawn' && (to[1] === 0 || to[1] === actualState.length - 1)) {
2575
2602
  setTargetPos(to);
@@ -2600,8 +2627,11 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2600
2627
  var _JSChessEngine$change4 = JSChessEngine.changeState(actualState, figure, to, from, boardReversed),
2601
2628
  updatedCells = _JSChessEngine$change4.updatedCells,
2602
2629
  attackedPos = _JSChessEngine$change4.attackedPos;
2603
- var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2604
- setLinesWithCheck(linesCheck);
2630
+ var linesCheck = [];
2631
+ if (toggleTurn) {
2632
+ linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
2633
+ setLinesWithCheck(linesCheck);
2634
+ }
2605
2635
  if (fromPos[0] !== -1) {
2606
2636
  var figureFromPos = updatedCells[fromPos[1]][fromPos[0]].figure;
2607
2637
  if (!figureFromPos || figureFromPos.type !== holdedFigure.type || figureFromPos.color !== holdedFigure.color) {
@@ -2816,7 +2846,9 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2816
2846
  var handleUpdateFEN = function handleUpdateFEN(FEN, reversed) {
2817
2847
  var _FENtoGameState = FENtoGameState(FEN, reversed),
2818
2848
  boardState = _FENtoGameState.boardState,
2819
- currentColor = _FENtoGameState.currentColor;
2849
+ currentColor = _FENtoGameState.currentColor,
2850
+ invalidFEN = _FENtoGameState.invalidFEN;
2851
+ setInvalidFEN(invalidFEN);
2820
2852
  cleanAllForFigure();
2821
2853
  setAnimated(false);
2822
2854
  setInitialState(boardState);
@@ -2831,6 +2863,7 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2831
2863
  newMove: newMove,
2832
2864
  animated: animated,
2833
2865
  movesTrail: movesTrail,
2866
+ invalidFEN: invalidFEN,
2834
2867
  boardConfig: boardConfig,
2835
2868
  markedCells: markedCells,
2836
2869
  grabbingPos: grabbingPos,
@@ -2850,6 +2883,7 @@ var useChessBoardInteractive = function useChessBoardInteractive(props) {
2850
2883
  handleClick: handleClick,
2851
2884
  clearFromPos: clearFromPos,
2852
2885
  handleGrabEnd: handleGrabEnd,
2886
+ setInvalidFEN: setInvalidFEN,
2853
2887
  handleGrabbing: handleGrabbing,
2854
2888
  endRenderArrow: endRenderArrow,
2855
2889
  setActualState: setActualState,
@@ -3043,17 +3077,21 @@ var ChessBoard = function ChessBoard(props) {
3043
3077
  _props$moveArrows = props.moveArrows,
3044
3078
  moveArrows = _props$moveArrows === void 0 ? [] : _props$moveArrows,
3045
3079
  _props$arrows = props.arrows,
3046
- arrows = _props$arrows === void 0 ? [] : _props$arrows;
3080
+ arrows = _props$arrows === void 0 ? [] : _props$arrows,
3081
+ _props$toggleTurn = props.toggleTurn,
3082
+ toggleTurn = _props$toggleTurn === void 0 ? true : _props$toggleTurn;
3047
3083
  var _useChessBoardInterac = useChessBoardInteractive({
3048
3084
  onChange: onChange,
3049
3085
  onEndGame: onEndGame,
3050
3086
  onClickByChessBoard: onClick,
3051
- config: config
3087
+ config: config,
3088
+ toggleTurn: toggleTurn
3052
3089
  }),
3053
3090
  fromPos = _useChessBoardInterac.fromPos,
3054
3091
  newMove = _useChessBoardInterac.newMove,
3055
3092
  animated = _useChessBoardInterac.animated,
3056
3093
  movesTrail = _useChessBoardInterac.movesTrail,
3094
+ invalidFEN = _useChessBoardInterac.invalidFEN,
3057
3095
  boardConfig = _useChessBoardInterac.boardConfig,
3058
3096
  markedCells = _useChessBoardInterac.markedCells,
3059
3097
  grabbingPos = _useChessBoardInterac.grabbingPos,
@@ -3068,6 +3106,7 @@ var ChessBoard = function ChessBoard(props) {
3068
3106
  markCell = _useChessBoardInterac.markCell,
3069
3107
  handleClick = _useChessBoardInterac.handleClick,
3070
3108
  handleGrabEnd = _useChessBoardInterac.handleGrabEnd,
3109
+ setInvalidFEN = _useChessBoardInterac.setInvalidFEN,
3071
3110
  handleGrabbing = _useChessBoardInterac.handleGrabbing,
3072
3111
  endRenderArrow = _useChessBoardInterac.endRenderArrow,
3073
3112
  setPlayerColor = _useChessBoardInterac.setPlayerColor,
@@ -3106,6 +3145,10 @@ var ChessBoard = function ChessBoard(props) {
3106
3145
  color: arrow.color
3107
3146
  };
3108
3147
  });
3148
+ var handleHideInvalidFENmessage = function handleHideInvalidFENmessage(event) {
3149
+ event.preventDefault();
3150
+ setInvalidFEN(false);
3151
+ };
3109
3152
  return React__default.createElement("div", {
3110
3153
  className: styles.chessBoard
3111
3154
  }, React__default.createElement(ChessBoardCellsLayout, {
@@ -3151,7 +3194,17 @@ var ChessBoard = function ChessBoard(props) {
3151
3194
  color: currentColor,
3152
3195
  forPawnTransform: true,
3153
3196
  onSelect: handleSelectFigurePicker
3154
- })));
3197
+ })), invalidFEN && React__default.createElement("div", {
3198
+ className: styles.chessBoardInvalidFenMessage
3199
+ }, React__default.createElement("div", {
3200
+ className: styles.fenErrorMessage,
3201
+ role: "alert"
3202
+ }, React__default.createElement("div", null, "Invalid FEN notation. The default board position was used instead.", " ", React__default.createElement("a", {
3203
+ href: "/docs/fen-errors"
3204
+ }, "See common FEN problems"), "."), React__default.createElement("div", null, React__default.createElement("a", {
3205
+ className: styles.fenErrorMessageClose,
3206
+ onClick: handleHideInvalidFENmessage
3207
+ }, "Hide this message")))));
3155
3208
  };
3156
3209
 
3157
3210
  exports.ALL_FIGURES = ALL_FIGURES;