Boutique

La page Boutique (ShopPage) permet aux utilisateurs d'acheter des éléments cosmétiques (avatars, profils) en utilisant la monnaie virtuelle gagnée en jouant.

ShopPage

Type : ConsumerStatefulWidget
State : _ShopPageState extends ConsumerState(ShopPage)

Propriétés

Propriété Type Description
_showInsufficientFundsPopup bool Contrôle l'affichage du popup de fonds insuffisants
_insufficientFundsMessage String Message d'erreur pour fonds insuffisants
_showConfirmPurchasePopup bool Contrôle l'affichage du popup de confirmation d'achat
_confirmPurchaseMessage String Message de confirmation d'achat
_selectedItemForPurchase ShopItemEntity? Article sélectionné pour l'achat
_isLoading bool Indique si une opération d'achat est en cours

Méthodes

initState()

Description : Initialise la page et charge le profil utilisateur si nécessaire.
Actions : Appelle _loadUserProfileIfNeeded()
Retour : void

_loadUserProfileIfNeeded()

Description : Charge le profil utilisateur si pas déjà chargé.
Retour : Future

bool _isPurchased(String itemId)

Description : Vérifie si un article a déjà été acheté.
Paramètres :

Retour : bool (true si acheté)

bool _canAfford(int itemPrice)

Description : Vérifie si l'utilisateur a suffisamment de monnaie virtuelle.
Paramètres :

Retour : bool (true si suffisant)

_onPurchaseAttempt(ShopItemEntity item)

Description : Gère la tentative d'achat d'un article.
Paramètres :

Flux :

  1. Vérifie les fonds via shopNotifier.checkFunds()
  2. Affiche le popup de confirmation ou de fonds insuffisants
  3. Met à jour l'état de chargement

Retour : Future

void _closeInsufficientFundsPopup()

Description : Ferme le popup de fonds insuffisants.
Retour : void

void _closeConfirmPurchasePopup()

Description : Ferme le popup de confirmation d'achat.
Retour : void

_confirmPurchase()

Description : Confirme et effectue l'achat de l'article sélectionné.
Flux :

  1. Appelle shopNotifier.purchaseItem()
  2. Recharge le profil utilisateur en cas de succès
  3. Affiche un message d'erreur en cas d'échec

Retour : Future

void _goBack()

Description : Retourne à la page d'accueil.
Navigation : AppRoutes.home.path
Retour : void

Widget _buildHeader(...)

Description : Construit l'en-tête de la page avec titre, bouton retour, aide et solde.
Retour : Widget

Widget _buildBackButton(...)

Description : Construit le bouton de retour (coin supérieur gauche).
Retour : Widget

Widget _buildUserBalance(int balance, bool isTheme2)

Description : Construit l'affichage du solde de monnaie virtuelle.
Paramètres :

Retour : Widget

Widget _buildLoadingOverlay()

Description : Construit l'overlay de chargement pendant les transactions.
Retour : Widget

Widget _buildShopGrid()

Description : Construit la grille des articles de la boutique avec layout personnalisé.
Layout :

Retour : Widget

Éléments visuels

En-tête

Grille d'articles

États des cartes

Popups

Composants utilisés

ShopItemWidget

Widget affichant un article de la boutique.

Propriétés

Propriété Type Description
item ShopItemEntity Article à afficher
isPurchased bool Indique si l'article est déjà acheté
canAfford bool Indique si l'utilisateur peut se le permettre
onTap VoidCallback Callback du clic sur l'article

OneButtonPopup

Popup modal avec un seul bouton.

Propriétés

Propriété Type Description
message String Message à afficher
buttonText String? Texte du bouton (défaut: "OK")
onButtonPressed VoidCallback? Callback du bouton

TwoButtonPopup

Popup modal avec deux boutons (confirmation/annulation).

Propriétés

Propriété Type Description
message String Message à afficher
confirmText String Texte du bouton de confirmation
cancelText String Texte du bouton d'annulation
onConfirm VoidCallback Callback de confirmation
onCancel VoidCallback Callback d'annulation

UserProfileWidget

Widget de profil utilisateur.

ChatboxWidget

Widget de chat flottant.

HelpButtonWidget

Bouton d'aide contextuelle.

HelpPopupWidget

Popup d'aide avec contenu Markdown.

Providers utilisés

shopNotifierProvider

Type : StateNotifierProvider(ShopNotifier, ShopState)

Provider gérant l'état de la boutique.

ShopState

Propriété Type Description
isLoading bool Indique si une opération est en cours
errorMessage String? Message d'erreur

ShopNotifier - Méthodes

checkFunds(String idToken, String itemId)

Description : Vérifie si l'utilisateur a suffisamment de fonds pour acheter un article.
Paramètres :

Retour : Future(FundsCheckResult?) (canAfford: bool)

purchaseItem(String idToken, String itemId)

Description : Effectue l'achat d'un article.
Paramètres :

Retour : Future(PurchaseResult?) (success: bool, message: String, newBalance: int?)

userProfileProvider

Type : Provider(UserProfileEntity?)

Provider fournissant le profil utilisateur actuel.

UserProfileEntity

Propriété Type Description
virtualCurrencyBalance int Solde de monnaie virtuelle
purchaseHistory List(String) Liste des IDs d'articles achetés
username String Nom d'utilisateur

userNotifierProvider

Type : StateNotifierProvider(UserNotifier, UserState)

Provider gérant le profil utilisateur.

translationProvider

Type : Provider(TranslationWrapper)

Provider pour la gestion de l'internationalisation.

themeNotifierProvider

Type : StateNotifierProvider(ThemeNotifier, ThemeState)

Provider gérant le thème actif.

helpPopupProvider

Type : StateNotifierProvider(HelpPopupNotifier, HelpPopupState)

Provider gérant le popup d'aide.

Articles de la boutique

Les articles sont définis dans shopItems (fichier shop_item_model.dart) et incluent :

Types d'articles

  1. Avatar Cyberpunk

    • ID: avatar_cyberpunk
    • Prix: 500 coins
    • Type: Avatar
  2. Avatar Neon

    • ID: avatar_neon
    • Prix: 750 coins
    • Type: Avatar
  3. Avatar Futuriste

    • ID: avatar_futuristic
    • Prix: 1000 coins
    • Type: Avatar
  4. Profil Bronze

    • ID: profile_bronze
    • Prix: 300 coins
    • Type: Profil
  5. Profil Argent

    • ID: profile_silver
    • Prix: 600 coins
    • Type: Profil
  6. Profil Or

    • ID: profile_gold
    • Prix: 900 coins
    • Type: Profil
  7. Profil Diamant

    • ID: profile_diamond
    • Prix: 1500 coins
    • Type: Profil

Use Cases

L'architecture Clean utilise les use cases suivants :

Navigation

Validation et gestion d'erreurs

Messages d'erreur

Flux d'achat

  1. Clic sur "ACHETER"
  2. Vérification des fonds via API
  3. Si suffisant → Popup de confirmation
  4. Confirmation → Achat via API
  5. Succès → Rechargement du profil + mise à jour de l'affichage
  6. Échec → Affichage de l'erreur