import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_application_1/Project/NavigationBar.dart'; import 'package:flutter_application_1/Project/ProfilePage/EditProfilePage/change_password.dart'; import 'package:flutter_application_1/Project/ProfilePage/EditProfilePage/confirm_password.dart'; import 'package:flutter_application_1/Project/ProfilePage/EditProfilePage/edit_image.dart'; import 'package:flutter_application_1/Project/ProfilePage/EditProfilePage/edit_name.dart'; import 'package:flutter_application_1/Project/ProfilePage/EditProfilePage/edit_phone.dart'; import 'package:flutter_application_1/Project/ProfilePage/widgets/display_image_widget.dart'; import 'package:flutter_application_1/Project/utils/colors.dart'; class EditProfilePage extends StatefulWidget { const EditProfilePage({super.key}); @override // ignore: library_private_types_in_public_api _EditProfilePageState createState() => _EditProfilePageState(); } class _EditProfilePageState extends State { String? firstName; String? lastName; String? email; String? phone; @override void initState() { super.initState(); loadUserData(); } Future loadUserData() async { final user = FirebaseAuth.instance.currentUser; final doc = await FirebaseFirestore.instance .collection('users') .doc(user?.uid) .get(); setState(() { firstName = doc.get('firstName'); lastName = doc.get('lastName'); email = doc.get('email'); phone = doc.get('phone'); }); } String? getFormattedPhone() { if (phone == null || phone!.isEmpty) { return null; } if (phone!.startsWith('+66')) { return '(+66) ${phone!.substring(3)}'; } else { return phone!; } } @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ AppBar( backgroundColor: Colors.transparent, elevation: 0, toolbarHeight: 10, ), Row( children: [ IconButton( icon: const Icon(Icons.arrow_back), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: ((context) => const MyBottomNavigationBar(getIndex: 3,)), ), ); }, ), const Expanded( child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0), child: Center( child: Padding( padding: EdgeInsets.only(bottom: 0), child: Text( 'Edit Profile', style: TextStyle( fontSize: 30, fontWeight: FontWeight.w700, color: Color.fromRGBO(0, 0, 0, 1), ), ), ), ), ), ), const SizedBox( width: 40, ), ], ),const SizedBox( height: 10, ), CircleAvatar( radius: 75, backgroundColor: kGreenLightColor, child: Stack( children: [ Positioned( bottom: 0, right: 0, child: GestureDetector( onTap: () { // handle edit profile picture logic here }, child: buildEditIcon(Colors.white), ), ), InkWell( onTap: () { Navigator.push( context, MaterialPageRoute( builder: ((context) => const EditImagePage())), ); }, child: const DisplayImage(), ), ], ), ), Padding( padding: const EdgeInsets.only(bottom: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Name', style: TextStyle( fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey, ), ), const SizedBox( height: 1, ), Container( width: 340, height: 40, decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, width: 1, ), ), ), child: Row( children: [ Expanded( child: TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: ((context) => const EditNameFormPage()), ), ); }, child: Text( '$firstName $lastName', style: const TextStyle(fontSize: 16, height: 1.4), ), ), ), const Icon( Icons.keyboard_arrow_right, color: Colors.grey, size: 40.0, ) ], ), ) ], ), ), Padding( padding: const EdgeInsets.only(bottom: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Phone', style: TextStyle( fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey, ), ), const SizedBox( height: 1, ), Container( width: 340, height: 40, decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, width: 1, ), ), ), child: Row( children: [ Expanded( child: TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: ((context) => const EditPhoneFormPage()), ), ); }, child: Text( getFormattedPhone() ?? '', style: const TextStyle(fontSize: 16, height: 1.4), ))), const Icon( Icons.keyboard_arrow_right, color: Colors.grey, size: 40.0, ) ], ), ) ], ), ), Padding( padding: const EdgeInsets.only(bottom: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Email', style: TextStyle( fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey, ), ), const SizedBox( height: 1, ), Container( width: 340, height: 40, decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, width: 1, ), ), ), child: Row( children: [ Expanded( child: TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: ((context) => const ConfirmPasswordPage()), ), ); }, child: Text( email ?? '', style: const TextStyle(fontSize: 16, height: 1.4), ))), const Icon( Icons.keyboard_arrow_right, color: Colors.grey, size: 40.0, ) ], ), ) ], ), ), const SizedBox( height: 10, ), Column( children: [ ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: kGreenLightColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(100), ), ), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: ((context) => const ChangePasswordPage())), ); }, child: const Text('Change Password', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w700, color: Colors.black, )), ), ], ) ], ), ); } // Refrshes the Page after updating user info. FutureOr onGoBack(dynamic value) { setState(() {}); } // Handles navigation and prompts refresh. void navigateSecondPage(Widget editForm) { Route route = MaterialPageRoute(builder: (context) => editForm); Navigator.push(context, route).then(onGoBack); } Widget buildEditIcon(Color color) => buildCircle( all: 8, child: Icon( Icons.edit, color: color, size: 20, )); // Builds/Makes Circle for Edit Icon on Profile Picture Widget buildCircle({ required Widget child, required double all, }) => ClipOval( child: Container( padding: EdgeInsets.all(all), color: Colors.white, child: child, )); }