import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; import '../providers/auth_provider.dart'; import '../providers/user_profile_provider.dart'; import 'edit_profile_screen.dart'; import 'login_screen.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); @override State createState() => _SettingsScreenState(); } class _SettingsScreenState extends State { @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { final auth = Provider.of(context, listen: false); while (!auth.initialized) { await Future.delayed(const Duration(milliseconds: 100)); } final profileProvider = Provider.of(context, listen: false); profileProvider.init(context); await profileProvider.loadProfile(context); }); } Future _pickImage() async { final picked = await ImagePicker().pickImage( source: ImageSource.gallery, imageQuality: 80, ); if (picked != null) { final file = File(picked.path); final profileProvider = Provider.of(context, listen: false); profileProvider.init(context); final success = await profileProvider.updateProfileImage(context, file); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(success ? "Profile updated" : "Failed to update")), ); } } Future _logout() async { final auth = Provider.of(context, listen: false); final confirm = await showDialog( context: context, builder: (_) => AlertDialog( title: const Text("Logout"), content: const Text("Are you sure you want to logout?"), actions: [ TextButton( child: const Text("Cancel"), onPressed: () => Navigator.pop(context, false), ), TextButton( child: const Text("Logout", style: TextStyle(color: Colors.red)), onPressed: () => Navigator.pop(context, true), ), ], ), ); if (confirm == true) { await auth.logout(context); if (!mounted) return; Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (_) => const LoginScreen()), (route) => false, ); } } @override Widget build(BuildContext context) { final profileProvider = Provider.of(context); if (profileProvider.loading || profileProvider.profile == null) { return const Center(child: CircularProgressIndicator()); } final p = profileProvider.profile!; return SingleChildScrollView( padding: const EdgeInsets.all(18), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // ------------------ PROFILE IMAGE ------------------ Center( child: GestureDetector( onTap: _pickImage, child: CircleAvatar( radius: 55, backgroundImage: p.profileImage != null ? NetworkImage(p.profileImage!) : null, child: p.profileImage == null ? const Icon(Icons.person, size: 55) : null, ), ), ), const SizedBox(height: 25), // ------------------ PROFILE INFO ------------------ _infoRow("Customer ID", p.customerId), _infoRow("Name", p.customerName), _infoRow("Company", p.companyName), _infoRow("Email", p.email), _infoRow("Mobile", p.mobile), _infoRow("Address", p.address ?? "Not provided"), _infoRow("Pincode", p.pincode ?? "Not provided"), _infoRow("Status", p.status ?? "N/A"), _infoRow("Customer Type", p.customerType ?? "N/A"), const SizedBox(height: 40), Center( child: ElevatedButton( child: const Text("Edit Profile"), onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (_) => const EditProfileScreen()), ); }, ), ), // ------------------ LOGOUT BUTTON ------------------ Center( child: ElevatedButton.icon( style: ElevatedButton.styleFrom( backgroundColor: Colors.red, padding: const EdgeInsets.symmetric(horizontal: 28, vertical: 14), ), icon: const Icon(Icons.logout, color: Colors.white), label: const Text( "Logout", style: TextStyle(color: Colors.white, fontSize: 16), ), onPressed: _logout, ), ), const SizedBox(height: 30), ], ), ); } Widget _infoRow(String title, String value) { return Padding( padding: const EdgeInsets.only(bottom: 14), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title, style: const TextStyle( fontSize: 13, fontWeight: FontWeight.w600, color: Colors.grey)), const SizedBox(height: 4), Text(value, style: const TextStyle(fontSize: 16)), ], ), ); } }