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<EditProfilePage> {
String? firstName;
String? lastName;
String? email;
String? phone;
@override
void initState() {
super.initState();
loadUserData();
}
Future<void> 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,
));
}