Implement initial focus mode disabling game

This commit is contained in:
Hank Grabowski 2024-07-24 13:35:07 -04:00
parent 8db6383818
commit 6e8904e10c
2 changed files with 113 additions and 16 deletions

View file

@ -12,6 +12,7 @@ final _options = {
'30 minutes': const Duration(minutes: 30),
'15 minutes': const Duration(minutes: 15),
'5 minutes': const Duration(minutes: 5),
'1 minute': const Duration(minutes: 1),
};
class FocusModeMenuItem extends ConsumerWidget {

View file

@ -1,9 +1,58 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:relatica/models/focus_mode_data.dart';
import 'package:relatica/riverpod_controllers/focus_mode.dart';
import 'package:relatica/routes.dart';
import '../controls/focus_mode_status_headline.dart';
import '../controls/padding.dart';
import '../models/focus_mode_data.dart';
import '../riverpod_controllers/focus_mode.dart';
import '../routes.dart';
import '../utils/snackbar_builder.dart';
class GameState {
final int maxNumber;
final int number;
final int? lastGuess;
String get hint {
if (lastGuess == null) {
return 'Guess a number between 0 and $maxNumber';
}
if (lastGuess! < number) {
return '$lastGuess is too low. Guess a higher number';
}
if (lastGuess! > number) {
return '$lastGuess is too high. Guess a lower number';
}
return 'You got it!';
}
bool get found => number == lastGuess;
const GameState({
required this.number,
required this.maxNumber,
this.lastGuess,
});
GameState update(int lastGuess) => GameState(
number: number,
maxNumber: maxNumber,
lastGuess: lastGuess,
);
factory GameState.newGame(int maxNumber) =>
GameState(number: Random().nextInt(maxNumber), maxNumber: maxNumber);
}
const _maxNumber = 100;
const introMessage =
"If you guess the number I've picked from 0 to $_maxNumber you may disable focus mode...";
class DisableFocusModeScreen extends ConsumerStatefulWidget {
const DisableFocusModeScreen({super.key});
@ -15,27 +64,74 @@ class DisableFocusModeScreen extends ConsumerStatefulWidget {
class _DisableFocusModeScreenState
extends ConsumerState<DisableFocusModeScreen> {
final formKey = GlobalKey<FormState>();
final guessController = TextEditingController();
var game = GameState.newGame(_maxNumber);
var message = introMessage;
@override
Widget build(BuildContext context) {
final focusMode = ref.watch(focusModeProvider);
if (!focusMode.enabled) {
context.go(ScreenPaths.timelines);
}
return Scaffold(
appBar: AppBar(
title: const Text('Unlock Focus Mode?'),
title: const Text('Disable Focus Mode?'),
),
body: Center(
child: Form(
key: formKey,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Text('Want to disable focus mode?'),
FocusModeStatusHeadline(disableTime: focusMode.disableTime),
Text(message),
const VerticalPadding(),
TextFormField(
controller: guessController,
keyboardType: TextInputType.number,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (value) => int.tryParse(value!) == null
? 'Please enter a number'
: null,
decoration: InputDecoration(
border: OutlineInputBorder(
borderSide: const BorderSide(),
borderRadius: BorderRadius.circular(5.0),
),
),
),
const VerticalPadding(),
ElevatedButton(
onPressed: () {
final valid = formKey.currentState?.validate() ?? false;
if (!valid) {
buildSnackbar(context,
'Please enter an integer between 0 and $_maxNumber');
return;
}
final guess = int.parse(guessController.text);
game = game.update(guess);
if (game.found) {
ref
.read(focusModeProvider.notifier)
.setMode(FocusModeData(false));
.setMode(const FocusModeData(false));
context.go(ScreenPaths.timelines);
} else {
setState(() {
message = game.hint;
});
}
},
child: Text('Disable'))
child: const Text('Guess'))
],
),
),
),
),
);
}
}