Skip to content

Commit

Permalink
Merge branch 'from-position-challenge' of https://github.com/HaonRekc…
Browse files Browse the repository at this point in the history
…ef/lichess-mobile into HaonRekcef-from-position-challenge
  • Loading branch information
veloce committed Jul 5, 2024
2 parents 336c560 + 4a9fa97 commit 75f6acf
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 18 deletions.
3 changes: 2 additions & 1 deletion lib/src/model/challenge/challenge.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,9 @@ class ChallengeRequest
if (clock != null)
'clock.increment': clock!.increment.inSeconds.toString(),
if (days != null) 'days': days.toString(),
'rated': rated.toString(),
'rated': variant == Variant.fromPosition ? 'false' : rated.toString(),
'variant': variant.name,
if (variant == Variant.fromPosition) 'fen': initialFen,
if (sideChoice != SideChoice.random) 'color': sideChoice.name,
};
}
Expand Down
109 changes: 92 additions & 17 deletions lib/src/view/play/challenge_screen.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import 'dart:async';

import 'package:chessground/chessground.dart' as cg;
import 'package:dartchess/dartchess.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:lichess_mobile/src/constants.dart';
import 'package:lichess_mobile/src/model/account/account_repository.dart';
import 'package:lichess_mobile/src/model/challenge/challenge.dart';
import 'package:lichess_mobile/src/model/challenge/challenge_preferences.dart';
Expand All @@ -14,6 +18,8 @@ import 'package:lichess_mobile/src/utils/l10n_context.dart';
import 'package:lichess_mobile/src/utils/navigation.dart';
import 'package:lichess_mobile/src/view/game/game_screen.dart';
import 'package:lichess_mobile/src/widgets/adaptive_choice_picker.dart';
import 'package:lichess_mobile/src/widgets/adaptive_text_field.dart';
import 'package:lichess_mobile/src/widgets/board_preview.dart';
import 'package:lichess_mobile/src/widgets/buttons.dart';
import 'package:lichess_mobile/src/widgets/expanded_section.dart';
import 'package:lichess_mobile/src/widgets/feedback.dart';
Expand Down Expand Up @@ -57,6 +63,25 @@ class _ChallengeBody extends ConsumerStatefulWidget {

class _ChallengeBodyState extends ConsumerState<_ChallengeBody> {
Future<void>? _pendingCreateGame;
final _controller = TextEditingController();

String? textInput;

@override
void initState() {
super.initState();
_controller.addListener(() {
setState(() {
textInput = _controller.text;
});
});
}

@override
void dispose() {
_controller.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
Expand All @@ -65,7 +90,7 @@ class _ChallengeBodyState extends ConsumerState<_ChallengeBody> {
final isValidTimeControl =
preferences.timeControl != ChallengeTimeControlType.clock ||
preferences.clock.time > Duration.zero ||
preferences.clock.increment >= Duration.zero;
preferences.clock.increment > Duration.zero;

return accountAsync.when(
data: (account) {
Expand Down Expand Up @@ -271,7 +296,11 @@ class _ChallengeBodyState extends ConsumerState<_ChallengeBody> {
onPressed: () {
showChoicePicker(
context,
choices: [Variant.standard, Variant.chess960],
choices: [
Variant.standard,
Variant.chess960,
Variant.fromPosition,
],
selectedItem: preferences.variant,
labelBuilder: (Variant variant) => Text(variant.label),
onSelectedItemChanged: (Variant variant) {
Expand All @@ -285,7 +314,24 @@ class _ChallengeBodyState extends ConsumerState<_ChallengeBody> {
),
),
ExpandedSection(
expand: preferences.rated == false,
expand: preferences.variant == Variant.fromPosition,
child: SmallBoardPreview(
orientation: preferences.sideChoice == SideChoice.black
? cg.Side.black
: cg.Side.white,
fen: textInput ?? kEmptyFen,
description: AdaptiveTextField(
maxLines: 5,
placeholder: context.l10n.pasteTheFenStringHere,
controller: _controller,
readOnly: true,
onTap: _getClipboardData,
),
),
),
ExpandedSection(
expand: preferences.rated == false ||
preferences.variant == Variant.fromPosition,
child: PlatformListTile(
harmonizeCupertinoTitleStyle: true,
title: Text(context.l10n.side),
Expand All @@ -311,17 +357,20 @@ class _ChallengeBodyState extends ConsumerState<_ChallengeBody> {
),
),
if (account != null)
PlatformListTile(
harmonizeCupertinoTitleStyle: true,
title: Text(context.l10n.rated),
trailing: Switch.adaptive(
applyCupertinoTheme: true,
value: preferences.rated,
onChanged: (bool value) {
ref
.read(challengePreferencesProvider.notifier)
.setRated(value);
},
ExpandedSection(
expand: preferences.variant != Variant.fromPosition,
child: PlatformListTile(
harmonizeCupertinoTitleStyle: true,
title: Text(context.l10n.rated),
trailing: Switch.adaptive(
applyCupertinoTheme: true,
value: preferences.rated,
onChanged: (bool value) {
ref
.read(challengePreferencesProvider.notifier)
.setRated(value);
},
),
),
),
const SizedBox(height: 20),
Expand All @@ -333,15 +382,23 @@ class _ChallengeBodyState extends ConsumerState<_ChallengeBody> {
child: FatButton(
semanticsLabel: context.l10n.challengeChallengeToPlay,
onPressed: timeControl == ChallengeTimeControlType.clock
? isValidTimeControl
? isValidTimeControl &&
((textInput != '' && textInput != null) ||
preferences.variant !=
Variant.fromPosition)
? () {
pushPlatformRoute(
context,
rootNavigator: true,
builder: (BuildContext context) {
return GameScreen(
challenge: preferences
.makeRequest(widget.user),
challenge: preferences.makeRequest(
widget.user,
preferences.variant !=
Variant.fromPosition
? null
: textInput,
),
);
},
);
Expand Down Expand Up @@ -374,6 +431,24 @@ class _ChallengeBodyState extends ConsumerState<_ChallengeBody> {
),
);
}

Future<void> _getClipboardData() async {
final ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain);
if (data != null) {
try {
Chess.fromSetup(Setup.parseFen(data.text!.trim()));
_controller.text = data.text!;
} catch (_, __) {
if (mounted) {
showPlatformSnackbar(
context,
context.l10n.invalidFen,
type: SnackBarType.error,
);
}
}
}
}
}

String _daysLabel(num days) {
Expand Down

0 comments on commit 75f6acf

Please sign in to comment.