Création de Partie
La page Création de Partie (GameCreationPage) permet aux utilisateurs de sélectionner un jeu existant et de configurer les paramètres d'une nouvelle partie.
GameCreationPage
Type : ConsumerStatefulWidget
State : _GameCreationPageState extends ConsumerState (GameCreationPage)
Propriétés
| Propriété | Type | Description |
|---|---|---|
currentIndex |
int |
Index de la page actuelle du carrousel de jeux |
_pageController |
PageController |
Contrôleur du carrousel de jeux |
isConfigPopupActive |
bool |
Contrôle l'affichage du popup de configuration |
selectedVisibility |
String |
Visibilité sélectionnée ("public" ou "friends") |
selectedDropInOut |
bool |
Si le drop-in/drop-out est activé |
entryFeeAmount |
int |
Montant du droit d'entrée (0-100) |
isCustomPriceMode |
bool |
Si le mode prix personnalisé est actif |
errorMessage |
String? |
Message d'erreur à afficher |
_priceFocusNode |
FocusNode |
Focus pour le champ de prix personnalisé |
Méthodes
initState()
Description : Initialise la page, charge les jeux et configure les écouteurs Socket.IO.
Actions :
- Efface le jeu sélectionné précédent
- Charge la liste des jeux via
_ensureGamesLoaded() - Configure l'écouteur
playableGamesUpdated
Retour : void
dispose()
Description : Libère les ressources et retire les écouteurs Socket.IO.
Retour : void
_ensureGamesLoaded()
Description : Charge les jeux si la liste est vide.
Retour : Future
_reloadGames()
Description : Recharge silencieusement la liste des jeux et préserve la sélection si possible.
Flux :
- Sauvegarde le nom du jeu sélectionné
- Recharge les jeux via
reloadPlayableGamesSilently() - Si le jeu existe toujours, met à jour la référence
- Sinon, désélectionne le jeu
Retour : Future
void _setupSocketListener()
Description : Configure l'écouteur Socket.IO pour les mises à jour de jeux.
Event : playableGamesUpdated
Retour : void
void _nextPage()
Description : Passe à la page suivante du carrousel.
Retour : void
void _previousPage()
Description : Revient à la page précédente du carrousel.
Retour : void
void _goToPage(int index)
Description : Va directement à une page du carrousel.
Retour : void
void _selectGame(GameEntity game)
Description : Sélectionne un jeu et affiche le popup de configuration.
Actions :
- Sélectionne le jeu via provider
- Réinitialise les paramètres de configuration
- Affiche le popup
Retour : void
void _openConfigPopup()
Description : Ouvre le popup de configuration.
Retour : void
void _closeConfigPopup()
Description : Ferme le popup de configuration.
Retour : void
_createGame()
Description : Crée la partie avec les paramètres configurés.
Flux :
- Valide les paramètres
- Appelle
gameConfigNotifier.createGame() - Si succès, navigue vers
CharacterCreationPage - Si échec, affiche message d'erreur
Retour : Future
void _showErrorPopup(String message)
Description : Affiche un popup d'erreur.
Retour : void
void _goBack()
Description : Retourne à la page d'accueil.
Retour : void
Widget _buildCarousel()
Description : Construit le carrousel de jeux avec PageView.
Layout : 3 jeux par page
Retour : Widget
Widget _buildGameCard(GameEntity game)
Description : Construit une carte de jeu.
Contenu : Aperçu de la grille, nom, description, bouton de sélection
Retour : Widget
Widget _buildGameIndicators()
Description : Construit les indicateurs de page (dots).
Retour : Widget
Widget _buildConfigPopup()
Description : Construit le popup de configuration de partie.
Retour : Widget
Éléments visuels
En-tête
- Bouton Retour : "←" vers HomePage
- Titre : "CRÉER UNE PARTIE" centré
Carrousel de jeux
- 3 jeux par page : Grid layout
- Cartes de jeu :
- Aperçu miniature de la grille
- Nom du jeu
- Description
- Taille de la grille
- Bouton "SÉLECTIONNER"
- Flèches de navigation : Gauche/Droite
- Indicateurs de page : Dots en bas
Popup de configuration
- Titre : "CONFIGURATION DE LA PARTIE"
- Aperçu du jeu sélectionné : Nom et grille
Options de configuration
-
Visibilité :
- Public : Visible par tous
- Amis : Visible seulement par les amis
-
Drop-in/Drop-out :
- Toggle switch
- Permet aux joueurs de rejoindre/quitter en cours de partie
-
Droit d'entrée :
- Boutons prédéfinis : 0, 25, 50, 100 coins
- Option "Personnalisé" avec champ de saisie
- Validation : 0-100 coins
- Formatter : Enlève les zéros de tête, bloque au max
-
Boutons d'action :
- ANNULER : Ferme le popup
- CRÉER : Crée la partie et navigue vers création de personnage
Validation
Droit d'entrée
- Min : 0 coins
- Max : 100 coins
- Formatter personnalisé :
_MaxValueFormatter(100)- Enlève les zéros de tête
- Bloque la saisie si > 100
- Accepte uniquement les chiffres
Composants utilisés
GameBoxWidget
Widget affichant une carte de jeu.
Propriétés
| Propriété | Type | Description |
|---|---|---|
game |
GameEntity |
Jeu à afficher |
onSelect |
VoidCallback |
Callback de sélection |
OneButtonPopup
Popup avec un seul bouton (erreurs).
UserProfileWidget
Widget de profil utilisateur.
ChatboxWidget
Widget de chat.
HelpButtonWidget
Bouton d'aide.
HelpPopupWidget
Popup d'aide.
Providers utilisés
gameNotifierProvider
Type : StateNotifierProvider (GameNotifier, GameState)
Provider gérant la liste des jeux disponibles.
GameState
| Propriété | Type | Description |
|---|---|---|
games |
List | Liste des jeux jouables |
selectedGame |
GameEntity? |
Jeu actuellement sélectionné |
isLoading |
bool |
Si le chargement est en cours |
errorMessage |
String? |
Message d'erreur |
GameNotifier - Méthodes
loadPlayableGames(String idToken)
Description : Charge la liste des jeux jouables.
Retour : Future
reloadPlayableGamesSilently(String idToken)
Description : Recharge les jeux sans indicateur de chargement.
Retour : Future
void selectGame(GameEntity game)
Description : Sélectionne un jeu.
Retour : void
void clearSelectedGame()
Description : Désélectionne le jeu actuel.
Retour : void
gameConfigNotifierProvider
Type : StateNotifierProvider (GameConfigNotifier, GameConfigState)
Provider gérant la configuration de partie.
GameConfigNotifier - Méthodes
Future createGame({...})
Description : Crée une nouvelle partie avec les paramètres spécifiés.
Paramètres :
idToken: Token FirebasegameName: Nom du jeuvisibility: "public" ou "friends"dropInOut: Si drop-in/drop-out activéentryFee: Droit d'entrée (0-100)
Retour : Future (Map contient gameCode, status, etc.)
translationProvider
Type : Provider (TranslationWrapper)
Provider de traduction.
themeNotifierProvider
Type : StateNotifierProvider (ThemeNotifier, ThemeState)
Provider de thème.
helpPopupProvider
Type : StateNotifierProvider (HelpPopupNotifier, HelpPopupState)
Provider d'aide.
Écouteurs Socket.IO
playableGamesUpdated
Description : Écouteur mis à jour quand un jeu est ajouté/supprimé/modifié.
Action : Recharge la liste des jeux et préserve la sélection
Navigation
- Retour :
AppRoutes.home.path→HomePage - Création réussie :
AppRoutes.characterCreation.path→CharacterCreationPage- Paramètres passés :
mode: "create"gameCode: Code de la partie crééegameStatus: Statut de la partiedropInOut: Si drop-in/drop-out activé
- Paramètres passés :
Layout du carrousel
Structure
- PageView avec
PageController - 3 jeux par page en Grid
- itemCount :
ceil(games.length / 3)
Navigation
- Flèches : Changent de page avec animation
- Indicateurs : Clic direct sur une page
- Swipe : Geste de balayage supporté
Formatter de prix personnalisé
class _MaxValueFormatter extends TextInputFormatter {
final int maxValue;
@override
TextEditingValue formatEditUpdate(oldValue, newValue) {
// Enlève les zéros de tête
// Bloque si > maxValue
// Retourne oldValue si invalide
}
}
Utilisation : Empêche la saisie de valeurs > 100 et nettoie les zéros de tête
Use Cases
- GetPlayableGamesUseCase : Récupérer les jeux jouables
Gestion d'erreurs
Messages d'erreur possibles
- Aucun jeu trouvé : "ERROR_MESSAGES.NO_GAMES_FOUND"
- Échec de création : Message du serveur ou erreur générique
- Jeu supprimé : Détecté via Socket.IO, désélection automatique