import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_appauth/flutter_appauth.dart'; import '../config/intra_config.dart'; import '../services/intra_auth_service.dart'; /// Écran temporaire étape 2 : valider OAuth + token unique (/v2/me). class AuthScreen extends StatefulWidget { const AuthScreen({super.key}); @override State createState() => _AuthScreenState(); } class _AuthScreenState extends State { final _auth = IntraAuthService.instance; bool _loading = false; String? _error; String? _login; Future _connect() async { setState(() { _loading = true; _error = null; _login = null; }); try { await _auth.signIn(); final me = await _auth.fetchMe(); if (!mounted) return; setState(() { _login = me['login'] as String?; _error = null; }); } on FlutterAppAuthUserCancelledException { if (!mounted) return; setState(() => _error = 'Connexion annulée'); } on FlutterAppAuthPlatformException catch (e) { final d = e.platformErrorDetails; if (!mounted) return; setState(() { _error = d.errorDescription ?? d.error ?? d.errorDebugDescription ?? e.message ?? 'Échec OAuth (UID, SECRET, redirect Intra)'; }); } on PlatformException catch (e) { if (!mounted) return; setState(() => _error = e.message ?? 'Erreur OAuth'); } catch (e) { if (!mounted) return; setState(() => _error = e.toString()); } finally { if (mounted) { setState(() => _loading = false); } } } void _disconnect() { _auth.signOut(); setState(() => _login = null); } @override Widget build(BuildContext context) { if (!IntraConfig.isConfigured) { return Scaffold( appBar: AppBar(title: const Text('Swifty Companion')), body: const Padding( padding: EdgeInsets.all(24), child: Text( 'Fichier .env manquant ou incomplet.\n' 'Copie swiftyCompanion/.env vers swifty_companion/.env ' '(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI).', ), ), ); } return Scaffold( appBar: AppBar( title: const Text('Swifty Companion'), backgroundColor: const Color(0xFF00BABC), foregroundColor: Colors.black, ), body: Padding( padding: const EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Text( 'Étape 2 — Connexion API 42', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), const SizedBox(height: 8), Text( _auth.isAuthenticated ? 'Token actif (réutilisé pour /v2/me)' : 'Connecte-toi une fois ; le token servira pour toutes les requêtes.', ), const SizedBox(height: 24), if (_login != null) ...[ Text('Connecté : $_login', style: const TextStyle(fontSize: 16)), const SizedBox(height: 16), OutlinedButton(onPressed: _disconnect, child: const Text('Déconnexion')), ] else FilledButton( onPressed: _loading ? null : _connect, child: _loading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('Se connecter avec 42'), ), if (_error != null) ...[ const SizedBox(height: 16), Text(_error!, style: TextStyle(color: Theme.of(context).colorScheme.error)), ], const Spacer(), Text( 'Config (.env dans swifty_companion/)\n' 'Redirect : ${IntraConfig.redirectUri}\n' 'CLIENT_ID …${IntraConfig.clientIdSuffix}\n' 'Après modification du .env : arrêter l’app puis flutter run (pas hot reload).', style: Theme.of(context).textTheme.bodySmall, ), ], ), ), ); } }