import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../core/api/api_error_mapper.dart'; import '../../auth/data/auth_providers.dart'; import '../data/profile_repository.dart'; import '../domain/user_profile.dart'; class ProfileScreen extends ConsumerStatefulWidget { const ProfileScreen({super.key}); @override ConsumerState createState() => _ProfileScreenState(); } class _ProfileScreenState extends ConsumerState { final _formKey = GlobalKey(); bool _isLoading = true; bool _isSaving = false; String? _error; UserProfile? _profile; late final TextEditingController _emailCtrl; late final TextEditingController _firstNameCtrl; late final TextEditingController _lastNameCtrl; @override void initState() { super.initState(); _emailCtrl = TextEditingController(); _firstNameCtrl = TextEditingController(); _lastNameCtrl = TextEditingController(); _loadProfile(); } @override void dispose() { _emailCtrl.dispose(); _firstNameCtrl.dispose(); _lastNameCtrl.dispose(); super.dispose(); } Future _loadProfile() async { setState(() { _isLoading = true; _error = null; }); try { final profile = await ref.read(profileRepositoryProvider).getMe(); if (!mounted) return; setState(() { _profile = profile; _emailCtrl.text = profile.email; _firstNameCtrl.text = profile.firstName ?? ''; _lastNameCtrl.text = profile.lastName ?? ''; }); } catch (e) { if (!mounted) return; setState(() => _error = mapErrorToUserMessage(e, context)); } finally { if (mounted) setState(() => _isLoading = false); } } Future _save() async { if (!_formKey.currentState!.validate()) return; setState(() => _isSaving = true); try { final updated = await ref.read(profileRepositoryProvider).updateMe( email: _emailCtrl.text.trim(), firstName: _firstNameCtrl.text.trim().isEmpty ? null : _firstNameCtrl.text.trim(), lastName: _lastNameCtrl.text.trim().isEmpty ? null : _lastNameCtrl.text.trim(), ); if (!mounted) return; setState(() => _profile = updated); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Profil sparad!')), ); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(mapErrorToUserMessage(e, context))), ); } finally { if (mounted) setState(() => _isSaving = false); } } Future _logout() async { await ref.read(authStateProvider.notifier).logout(); } @override Widget build(BuildContext context) { final theme = Theme.of(context); return Scaffold( appBar: AppBar( title: const Text('Profil'), actions: [], // Utloggningsikonen tas bort här eftersom den redan finns i AppShell ), body: _isLoading ? const Center(child: CircularProgressIndicator()) : _error != null ? Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ Text(_error!, style: TextStyle(color: theme.colorScheme.error)), const SizedBox(height: 16), FilledButton(onPressed: _loadProfile, child: const Text('Försök igen')), ], ), ) : SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Read-only username Text('Användarnamn', style: theme.textTheme.labelMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant)), const SizedBox(height: 4), Text(_profile?.username ?? '', style: theme.textTheme.bodyLarge), const Divider(height: 32), // Role badge if (_profile?.isAdmin == true) Chip( label: const Text('Admin'), avatar: const Icon(Icons.shield_outlined, size: 16), backgroundColor: theme.colorScheme.primaryContainer, labelStyle: TextStyle(color: theme.colorScheme.onPrimaryContainer), ), if (_profile?.isAdmin == true) const SizedBox(height: 16), // Editable fields TextFormField( controller: _emailCtrl, decoration: const InputDecoration( labelText: 'E-post', border: OutlineInputBorder(), ), keyboardType: TextInputType.emailAddress, validator: (v) { if (v == null || v.isEmpty) return 'Ange en e-postadress'; if (!RegExp(r'^[^@]+@[^@]+\.[^@]+').hasMatch(v)) return 'Ogiltig e-postadress'; return null; }, ), const SizedBox(height: 16), TextFormField( controller: _firstNameCtrl, decoration: const InputDecoration( labelText: 'Förnamn', border: OutlineInputBorder(), ), ), const SizedBox(height: 16), TextFormField( controller: _lastNameCtrl, decoration: const InputDecoration( labelText: 'Efternamn', border: OutlineInputBorder(), ), ), const SizedBox(height: 32), SizedBox( width: double.infinity, child: FilledButton( onPressed: _isSaving ? null : _save, child: _isSaving ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('Spara'), ), ), ], ), ), ), ); } }