import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../../../core/services/auth_service.dart'; import '../../../../core/theme/app_colors.dart'; /// Profile edit page for settings class ProfileEditPage extends ConsumerStatefulWidget { const ProfileEditPage({super.key}); @override ConsumerState createState() => _ProfileEditPageState(); } class _ProfileEditPageState extends ConsumerState { final _formKey = GlobalKey(); final _nameController = TextEditingController(); final _phoneController = TextEditingController(); final _bioController = TextEditingController(); bool _isLoading = false; @override void initState() { super.initState(); _loadUserData(); } @override void dispose() { _nameController.dispose(); _phoneController.dispose(); _bioController.dispose(); super.dispose(); } Future _loadUserData() async { final user = AuthService.currentUser; if (user != null) { setState(() { _nameController.text = user.displayName ?? ''; }); } } Future _saveProfile() async { if (!_formKey.currentState!.validate()) { return; } setState(() { _isLoading = true; }); try { final user = AuthService.currentUser; if (user != null) { await user.updateDisplayName(_nameController.text); await user.reload(); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Perfil atualizado com sucesso!'), backgroundColor: AppColors.primaryTeal, ), ); context.pop(); } } } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Erro ao atualizar perfil: $e'), backgroundColor: AppColors.error, ), ); } } finally { if (mounted) { setState(() { _isLoading = false; }); } } } @override Widget build(BuildContext context) { final user = AuthService.currentUser; return PopScope( canPop: false, onPopInvokedWithResult: (didPop, result) { if (!didPop) { context.pop(); } }, child: Scaffold( body: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ Theme.of(context).colorScheme.background, Theme.of(context).colorScheme.primary.withOpacity(0.1), Theme.of(context).colorScheme.secondary.withOpacity(0.05), Theme.of(context).colorScheme.background, ], ), ), child: SafeArea( child: Column( children: [ // Custom AppBar Padding( padding: const EdgeInsets.all(16.0), child: Row( children: [ IconButton( icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: () => context.pop(), ), const Expanded( child: Text( 'Editar Perfil', style: TextStyle( color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold, ), ), ), ], ), ), // Form content Expanded( child: SingleChildScrollView( padding: const EdgeInsets.all(16), child: Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: Theme.of(context).colorScheme.surface, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: Theme.of( context, ).colorScheme.shadow.withOpacity(0.1), blurRadius: 10, offset: const Offset(0, 4), ), ], ), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Avatar section Center( child: Column( children: [ Container( width: 80, height: 80, decoration: BoxDecoration( gradient: const LinearGradient( colors: [ Color(0xFF82C9BD), Color(0xFF6BA8A0), ], ), borderRadius: BorderRadius.circular(40), ), child: const Icon( Icons.person, color: Colors.white, size: 40, ), ), const SizedBox(height: 16), Text( user?.displayName ?? 'Utilizador', style: TextStyle( color: Theme.of( context, ).colorScheme.onSurface, fontSize: 16, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4), Text( user?.email ?? '', style: TextStyle( color: Theme.of( context, ).colorScheme.onSurfaceVariant, fontSize: 14, ), ), ], ), ), const SizedBox(height: 32), // Name field Text( 'Nome', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.onSurface, ), ), const SizedBox(height: 8), TextFormField( controller: _nameController, decoration: InputDecoration( hintText: 'Introduza o seu nome', filled: true, fillColor: Theme.of( context, ).colorScheme.surface, border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide.none, ), contentPadding: const EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), ), validator: (value) { if (value == null || value.isEmpty) { return 'Por favor introduza o seu nome'; } return null; }, ), const SizedBox(height: 24), // Phone field (optional) Text( 'Telefone (opcional)', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.onSurface, ), ), const SizedBox(height: 8), TextFormField( controller: _phoneController, keyboardType: TextInputType.phone, decoration: InputDecoration( hintText: 'Introduza o seu telefone', filled: true, fillColor: Theme.of( context, ).colorScheme.surface, border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide.none, ), contentPadding: const EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), ), ), const SizedBox(height: 24), // Bio field (optional) Text( 'Bio (opcional)', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.onSurface, ), ), const SizedBox(height: 8), TextFormField( controller: _bioController, maxLines: 3, decoration: InputDecoration( hintText: 'Conte um pouco sobre si', filled: true, fillColor: Theme.of( context, ).colorScheme.surface, border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide.none, ), contentPadding: const EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), ), ), const SizedBox(height: 32), // Save button SizedBox( width: double.infinity, child: ElevatedButton( onPressed: _isLoading ? null : _saveProfile, style: ElevatedButton.styleFrom( backgroundColor: AppColors.primaryTeal, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric( vertical: 16, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: _isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, valueColor: AlwaysStoppedAnimation( Colors.white, ), ), ) : const Text( 'Guardar', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ], ), ), ), ), ), ], ), ), ), ), ); } }