import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:hangman/provider/data.dart'; import 'package:hangman/screens/game.dart'; import 'package:hangman/utils/constants.dart'; import 'package:hangman/widgets/dialog_fetch_error.dart'; import 'package:hangman/widgets/my_app_bar.dart'; class Home extends StatelessWidget { const Home({super.key}); static const String id = 'home'; @override Widget build(BuildContext context) { final Data myProvider = Provider.of<Data>(context); void errorWord(context) { showDialog( context: context, builder: (_) => AlertDialog( title: const Text('Erreur inattendue'), content: const Text('Erreur inattendue à la récupération d\'un mot aléatoire.\n' 'Installer une nouvelle version de l\'application pourrait corriger cette anomalie.'), actions: <Widget>[ TextButton( child: const Text('Fermer'), onPressed: () => Navigator.of(context).pop(), ) ], ), ); } return Scaffold( appBar: MyAppBar(appBar: AppBar()), body: Builder( builder: (context) => Center( child: myProvider.searching == true ? PopScope( onPopInvoked: (didPop) {}, child: const Center( child: CircularProgressIndicator(), ), ) : SingleChildScrollView( padding: const EdgeInsets.all(15.0), child: SizedBox( height: MediaQuery.of(context).size.height / 1.25, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), child: FittedBox( fit: BoxFit.fitWidth, child: Text( 'LE PENDU', style: TextStyle( fontFamily: 'Tiza', fontSize: 28.0, color: Colors.grey[700], ), ), ), ), Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Text('Mode en ligne'), Switch( value: myProvider.gameModeValue, onChanged: (bool value) => myProvider.updateGameMode = value, activeTrackColor: const Color(board), activeColor: Colors.greenAccent[400], ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Text('Niveau'), DropdownButton<String>( value: myProvider.levelValue != '' ? myProvider.levelValue : onlineGameMode[myProvider.gameModeValue]?.first, items: onlineGameMode[myProvider.gameModeValue] ?.map<DropdownMenuItem<String>>((String value) { return DropdownMenuItem<String>( value: value, child: Text(value), ); }).toList(), onChanged: (String? value) => myProvider.updateLevel = value ?? '', ), ], ), ], ), TextButton.icon( style: TextButton.styleFrom( foregroundColor: Colors.white, backgroundColor: const Color(board), padding: const EdgeInsets.all(20.0), ), onPressed: () async { myProvider.resetGame(); myProvider.searching = true; bool control = true; await const Game().pickWord(context, myProvider); if (myProvider.secretWord == '' || myProvider.hiddenWord == '') { control = false; if (!context.mounted) return; var response = await Navigator.push( context, MaterialPageRoute( builder: (context) => const DialogFetchError(), ), ); if (response == false) { myProvider.searching = false; myProvider.resetGame(); } else { myProvider.setPrefGameMode = false; myProvider.setPrefLevel = defaultLevel; if (!context.mounted) return; await const Game().pickWord(context, myProvider); control = true; } } if (myProvider.secretWord == 'UNEXPECTED ERROR') { control = false; myProvider.resetGame(); if (!context.mounted) return; errorWord(context); } if (control) { if (!context.mounted) return; Navigator.pushNamed(context, Game.id) .then((value) => myProvider.searching = false); } }, icon: const Icon( Icons.check_box, color: Colors.white, size: 60.0, ), label: Column( children: [ const Text( 'JOUER', style: TextStyle( fontSize: 22.0, letterSpacing: 2.0, ), ), Text( 'Mode de jeu: ${myProvider.levelPref}', style: const TextStyle( fontSize: 10.0, fontWeight: FontWeight.w300, ), ), ], ), ), ], ), ), ), ), ), ); } }