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 :

  1. Efface le jeu sélectionné précédent
  2. Charge la liste des jeux via _ensureGamesLoaded()
  3. 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 :

  1. Sauvegarde le nom du jeu sélectionné
  2. Recharge les jeux via reloadPlayableGamesSilently()
  3. Si le jeu existe toujours, met à jour la référence
  4. 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 :

  1. Sélectionne le jeu via provider
  2. Réinitialise les paramètres de configuration
  3. 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 :

  1. Valide les paramètres
  2. Appelle gameConfigNotifier.createGame()
  3. Si succès, navigue vers CharacterCreationPage
  4. 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

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

Carrousel de jeux

Options de configuration
  1. Visibilité :

    • Public : Visible par tous
    • Amis : Visible seulement par les amis
  2. Drop-in/Drop-out :

    • Toggle switch
    • Permet aux joueurs de rejoindre/quitter en cours de partie
  3. 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
  4. 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

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 :

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

Layout du carrousel

Structure

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

Gestion d'erreurs

Messages d'erreur possibles