Page de Rejoindre

La page de Rejoindre (JoinPage) affiche la liste des parties publiques disponibles et permet aux utilisateurs de rejoindre une partie existante via un code ou depuis la liste.

JoinPage

Type : ConsumerStatefulWidget
State : _JoinPageState extends ConsumerState(JoinPage)

Propriétés

Propriété Type Description
isJoinCodePopupActive bool Contrôle l'affichage du popup de saisie de code
focusNodes List(FocusNode) Liste des focus nodes pour les 4 champs de code
textControllers List(TextEditingController) Contrôleurs pour les 4 champs de code
_refreshTimer Timer? Timer pour le rafraîchissement automatique des parties (toutes les 10s)
_imageCache Map(String, Uint8List) Cache pour les images de grille

Méthodes

initState()

Description : Initialise la page, configure les écouteurs et lance le rafraîchissement automatique.
Actions :

  1. Crée 4 FocusNodes et TextEditingControllers pour le code
  2. Configure les écouteurs Socket.IO (drop-in, game list)
  3. Charge la liste des parties disponibles
  4. Lance le timer de rafraîchissement (10 secondes)
  5. Charge la liste des amis

Retour : void

dispose()

Description : Libère les ressources (timer, focus nodes, controllers).
Retour : void

_loadFriends()

Description : Charge la liste des amis de l'utilisateur.
Retour : Future

bool _isFriendWithHost(String adminName)

Description : Vérifie si l'utilisateur est ami avec l'hôte de la partie.
Paramètres :

Retour : bool

bool _canJoinGame(AvailableGameModel game, List friendsList)

Description : Vérifie si l'utilisateur peut rejoindre une partie.
Validation :

Retour : bool

void _setupGameListListener()

Description : Configure l'écouteur pour les mises à jour de la liste de parties.
Comportement : Met à jour le jeu sélectionné si des changements sont détectés
Retour : void

void _setupDropInListener()

Description : Configure l'écouteur pour le drop-in (rejoindre une partie en cours).
Event : onDropInGameData
Action : Navigue directement vers GameViewPage avec les données de la partie
Retour : void

void _onCodeInputChange(String value, int index)

Description : Gère la saisie d'un chiffre du code.
Comportement : Déplace le focus au champ suivant après saisie
Retour : void

void _onCodeBackspace(int index)

Description : Gère le backspace sur un champ vide.
Comportement : Retourne au champ précédent
Retour : void

void _showJoinCodePopup()

Description : Affiche le popup de saisie de code.
Retour : void

void _closeJoinCodePopup()

Description : Ferme le popup et réinitialise les champs.
Retour : void

_onJoinWithCode()

Description : Rejoint une partie via le code saisi.
Flux :

  1. Valide que le code a 4 chiffres
  2. Appelle joinGameNotifier.joinGameByCode(code)
  3. Si succès, navigue vers CharacterCreationPage
  4. Si échec, affiche message d'erreur

Retour : Future

_onJoinGame(AvailableGameModel game)

Description : Rejoint une partie depuis la liste.
Flux :

  1. Sélectionne la partie
  2. Appelle joinGameNotifier.joinGame(gameCode)
  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

Widget _buildGameCard(AvailableGameModel game)

Description : Construit une carte de partie disponible.
Contenu :

Retour : Widget

Widget _buildCodePopup()

Description : Construit le popup de saisie de code à 4 chiffres.
Retour : Widget

Éléments visuels

En-tête

Liste des parties

Carte de partie

Overlays

Cas particuliers

Composants utilisés

CodeInputFormatter

TextInputFormatter personnalisé pour gérer le backspace sur champ vide.

Propriétés

Propriété Type Description
index int Index du champ
onBackspaceOnEmpty Function(int) Callback appelé quand backspace sur champ vide

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

joinGameNotifierProvider

Type : StateNotifierProvider(JoinGameNotifier, JoinGameState)

Provider gérant la logique de rejoindre une partie.

JoinGameState

Propriété Type Description
availableGames List(AvailableGameModel) Liste des parties disponibles
selectedGame AvailableGameModel? Partie sélectionnée
isLoading bool Si le chargement est en cours
errorMessage String? Message d'erreur

JoinGameNotifier - Méthodes

loadAvailableGames()

Description : Charge la liste des parties disponibles.
Retour : Future

Future joinGame(String gameCode)

Description : Rejoint une partie par son code.
Retour : Future(Map(String, dynamic)?) (contient gameCode, status, etc.)

Future joinGameByCode(String code)

Description : Rejoint une partie via un code à 4 chiffres.
Retour : Future(Map(String, dynamic)?)

void selectGame(AvailableGameModel? game)

Description : Sélectionne une partie.
Retour : void

waitingRoomNotifierProvider

Type : StateNotifierProvider(WaitingRoomNotifier, WaitingRoomState)

Provider gérant la salle d'attente (utilisé pour le drop-in).

WaitingRoomNotifier - Méthodes

void setCurrentGame(OnGoingGameModel game)

Description : Définit la partie actuelle.
Retour : void

void setCurrentPlayer(PlayerModel player)

Description : Définit le joueur actuel.
Retour : void

waitingRoomSocketDataSourceProvider

Type : Provider(WaitingRoomSocketDataSource)

Provider fournissant la source de données Socket.IO de la salle d'attente.

WaitingRoomSocketDataSource - Méthodes

onDropInGameData()

Description : Stream émettant les données de partie pour le drop-in.
Retour : Stream(OnGoingGameModel)

friendsNotifierProvider

Type : StateNotifierProvider(FriendsNotifier, FriendsState)

Provider gérant la liste des amis.

FriendsState

Propriété Type Description
friends List(FriendUserEntity) Liste des amis

userProfileProvider

Type : Provider(UserProfileEntity?)

Provider du profil utilisateur.

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

Events écoutés

dropInGameData

Description : Reçu quand un joueur rejoint une partie en cours (drop-in).
Payload : OnGoingGameModel
Action : Navigation directe vers GameViewPage avec les données de la partie

gameListUpdated (implicite)

Description : Déclenché quand la liste des parties change.
Action : Recharge automatiquement la liste

Navigation

Rafraîchissement automatique

Timer : 10 secondes
Action : Recharge la liste des parties disponibles
Comportement : Continue même si l'utilisateur est dans la page

Filtrage des parties

Critères pour afficher une partie

  1. Visibilité :

    • Public : Toujours affiché
    • Amis : Affiché seulement si ami avec l'hôte
  2. État :

    • En attente : Toujours rejoignable (si pas pleine/verrouillée)
    • En cours : Rejoignable seulement si drop-in/drop-out activé
  3. Capacité :

    • Pas pleine : Rejoignable
    • Pleine : Non rejoignable
  4. Verrouillage :

    • Non verrouillée : Rejoignable
    • Verrouillée : Non rejoignable

Modèle de données

AvailableGameModel

Propriété Type Description
code String Code de la partie (4 chiffres)
gameName String Nom du jeu
adminName String Nom de l'hôte
visibility String "public" ou "friends"
dropInOut bool Si drop-in/drop-out activé
entryFee int Droit d'entrée
activePlayers int Nombre de joueurs actifs
maxPlayers int Nombre maximum de joueurs
status String "waiting" ou "started"
isLocked bool Si la partie est verrouillée
isFull bool Si la partie est pleine
gridImage String? Image de la grille en base64

Gestion du cache d'images

Le cache _imageCache stocke les images de grille décodées pour éviter de décoder la même image plusieurs fois, améliorant ainsi les performances lors du scroll de la liste.