import 'package:flutter/material.dart'; import 'package:pocketbase/pocketbase.dart'; import '../pocketbase_config.dart'; import '../services/session_client.dart'; import '../theme.dart'; /// Création d'un compte client : email + mot de passe + profil (nom, téléphone). /// Le code de fidélité et le QR sont générés automatiquement côté serveur. class SignupScreen extends StatefulWidget { const SignupScreen({super.key}); @override State createState() => _SignupScreenState(); } class _SignupScreenState extends State { final _formKey = GlobalKey(); final _nomCtrl = TextEditingController(); final _prenomCtrl = TextEditingController(); final _telCtrl = TextEditingController(); final _emailCtrl = TextEditingController(); final _mdpCtrl = TextEditingController(); bool _enCours = false; bool _voirMdp = false; String? _erreur; @override void dispose() { _nomCtrl.dispose(); _prenomCtrl.dispose(); _telCtrl.dispose(); _emailCtrl.dispose(); _mdpCtrl.dispose(); super.dispose(); } Future _inscription() async { if (!_formKey.currentState!.validate()) return; setState(() { _enCours = true; _erreur = null; }); try { final email = _emailCtrl.text.trim(); // Création du compte, puis connexion immédiate (pas de confirmation // d'email requise). On ne transmet PAS is_staff → compte client par défaut. await pb.collection('users').create(body: { 'email': email, 'password': _mdpCtrl.text, 'passwordConfirm': _mdpCtrl.text, }); await pb.collection('users').authWithPassword(email, _mdpCtrl.text); // Compte connecté → on crée le profil fidélité (nom + téléphone + code). // L'AuthGate basculera ensuite automatiquement vers l'accueil. await SessionClient.instance.creerProfil( nom: _nomCtrl.text, prenom: _prenomCtrl.text, telephone: _telCtrl.text, ); if (mounted) Navigator.of(context).pop(); } on ClientException catch (e) { if (mounted) { setState(() => _erreur = messageErreurPb(e, 'Impossible de créer le compte.')); } } catch (e) { if (mounted) setState(() => _erreur = 'Erreur : $e'); } finally { if (mounted) setState(() => _enCours = false); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Créer un compte')), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ TextFormField( controller: _nomCtrl, textCapitalization: TextCapitalization.words, decoration: const InputDecoration( labelText: 'Nom', prefixIcon: Icon(Icons.person_outline), ), validator: (v) => (v == null || v.trim().isEmpty) ? 'Nom obligatoire' : null, ), const SizedBox(height: 14), TextFormField( controller: _prenomCtrl, textCapitalization: TextCapitalization.words, decoration: const InputDecoration( labelText: 'Prénom', prefixIcon: Icon(Icons.badge_outlined), ), ), const SizedBox(height: 14), TextFormField( controller: _telCtrl, keyboardType: TextInputType.phone, decoration: const InputDecoration( labelText: 'Téléphone (facultatif)', prefixIcon: Icon(Icons.phone_outlined), ), ), const SizedBox(height: 14), TextFormField( controller: _emailCtrl, keyboardType: TextInputType.emailAddress, autofillHints: const [AutofillHints.email], decoration: const InputDecoration( labelText: 'Email', prefixIcon: Icon(Icons.mail_outline), ), validator: (v) => (v == null || !v.contains('@')) ? 'Email invalide' : null, ), const SizedBox(height: 14), TextFormField( controller: _mdpCtrl, obscureText: !_voirMdp, decoration: InputDecoration( labelText: 'Mot de passe', prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( icon: Icon( _voirMdp ? Icons.visibility_off : Icons.visibility), onPressed: () => setState(() => _voirMdp = !_voirMdp), ), ), validator: (v) => (v == null || v.length < 6) ? '6 caractères minimum' : null, onFieldSubmitted: (_) => _inscription(), ), if (_erreur != null) ...[ const SizedBox(height: 16), Text(_erreur!, textAlign: TextAlign.center, style: TextStyle(color: Colors.red.shade600)), ], const SizedBox(height: 24), FilledButton( onPressed: _enCours ? null : _inscription, child: _enCours ? const SizedBox( height: 22, width: 22, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white)) : const Text('Créer mon compte'), ), const SizedBox(height: 12), const Text( 'Votre QR code de fidélité sera généré automatiquement.', textAlign: TextAlign.center, style: TextStyle(fontSize: 13, color: AppTheme.grisTexte), ), ], ), ), ), ), ); } }