Edit User profile

This commit is contained in:
2021-03-31 22:10:42 +02:00
parent 2e4bc65cbb
commit 54fc7e33aa
13 changed files with 480 additions and 98 deletions
+14 -2
View File
@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:le_kiosque_by_gcs/model/user.dart';
import 'package:le_kiosque_by_gcs/services/auth/auth.dart';
import 'package:le_kiosque_by_gcs/services/firestore/user_service.dart';
import 'package:provider/provider.dart';
import '../custom/custom_elevated_button.dart';
@@ -9,8 +11,13 @@ class AuthView extends StatelessWidget {
Future<void> _signWithGoogle(context) async {
final auth = Provider.of<Auth>(context, listen: false);
final userService = Provider.of<UserService>(context, listen: false);
try {
await auth.signInWithGoogle();
final firebaseUser = await auth.signInWithGoogle();
if (firebaseUser.metadata.creationTime == firebaseUser.metadata.lastSignInTime) {
final kiosqueUser = toKiosqueUser(firebaseUser);
await userService.save(kiosqueUser);
}
} catch (e) {
print("Error $e");
}
@@ -18,8 +25,13 @@ class AuthView extends StatelessWidget {
Future<void> _signInWithFacebook(context) async {
final auth = Provider.of<Auth>(context, listen: false);
final userService = Provider.of<UserService>(context, listen: false);
try {
await auth.signInWithFacebook();
final firebaseUser = await auth.signInWithFacebook();
if (firebaseUser.metadata.creationTime == firebaseUser.metadata.lastSignInTime) {
final kiosqueUser = toKiosqueUser(firebaseUser);
await userService.save(kiosqueUser);
}
} catch (e) {
print("Error $e");
}
-24
View File
@@ -1,24 +0,0 @@
import 'package:flutter/material.dart';
class EditProfileView extends StatefulWidget {
@override
_EditProfileViewState createState() => _EditProfileViewState();
}
class _EditProfileViewState extends State<EditProfileView> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
iconTheme: IconThemeData(
color: Color(0xFF545454), //change your color here
)
),
body: Container(
width: double.infinity,
),
);
}
}
+249
View File
@@ -0,0 +1,249 @@
import 'package:country_picker/country_picker.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:le_kiosque_by_gcs/model/user.dart';
import 'package:le_kiosque_by_gcs/services/firestore/user_service.dart';
import 'package:le_kiosque_by_gcs/ui/custom/profile_picture.dart';
class EditProfileView extends StatefulWidget {
final UserService userService;
const EditProfileView({
Key key,
@required this.userService,
}) : super(key: key);
@override
_EditProfileViewState createState() => _EditProfileViewState();
}
class _EditProfileViewState extends State<EditProfileView> {
TextEditingController _countryController = TextEditingController();
TextEditingController _cityController = TextEditingController();
TextEditingController _dateController = TextEditingController();
TextEditingController _genderController = TextEditingController();
DateTime _selectedDate;
final _formKey = GlobalKey<FormState>();
KiosqueUser currentUser;
void _submitForm(KiosqueUser user) async {
if (_validateAndSaveForm()) {
user.country = _countryController.text.toString();
user.city = _cityController.text.toString();
user.gender = _genderController.text.toString();
user.birthDay = _selectedDate;
await widget.userService.save(user);
Navigator.of(context).pop();
}
}
bool _validateAndSaveForm() {
final formState = _formKey.currentState;
if (formState.validate()) {
formState.save();
return true;
} else {
return false;
}
}
Future<void> _selectDate(BuildContext context) async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(1900, 8),
lastDate: DateTime(2101),
);
final stringDate = DateFormat.yMMMd().format(picked);
_selectedDate = picked;
_dateController.text = stringDate;
}
@override
Widget build(BuildContext context) {
return StreamBuilder<KiosqueUser>(
stream: widget.userService
.getCurrentUser(FirebaseAuth.instance.currentUser.uid),
builder: (_, snapshot) {
if (snapshot.hasData) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
iconTheme: IconThemeData(
color: Color(0xFF545454), //change your color here
),
),
body: SingleChildScrollView(
child: Column(
children: [
Row(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child:
ProfilePicture(imageUrl: snapshot.data.profileUrl),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
snapshot.data.displayName,
style: TextStyle(
fontSize: 26,
color: Colors.black,
),
),
Row(
children: [
Padding(
padding: const EdgeInsets.only(
top: 10,
right: 10,
bottom: 10,
),
child: Icon(
Icons.location_on,
color: Color(0xFFA5A5A5),
size: 17,
),
),
Text(
snapshot.data.city ?? "No location",
style: TextStyle(color: Colors.grey),
)
],
)
],
)
],
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
TextFormField(
controller: _countryController,
readOnly: true,
validator: (value) => value.isEmpty ? 'Ne doit pas être vide ! !' : null,
onTap: () => _showCountryPicker(context),
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: 'Pays',
labelText: "Pays",
hoverColor: Colors.black,
),
),
SizedBox(height: 16),
TextFormField(
controller: _cityController,
validator: (value) => value.isEmpty ? 'Ne doit pas être vide ! !' : null,
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: 'Ville',
labelText: "Ville",
hoverColor: Colors.black,
),
),
SizedBox(height: 16),
TextFormField(
validator: (value) => value.isEmpty ? 'Ne doit pas être vide ! !' : null,
controller: _genderController,
onTap: () => _showGenderDialog(),
readOnly: true,
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: 'Genre',
labelText: "Genre",
hoverColor: Colors.black,
),
),
SizedBox(height: 16),
TextFormField(
readOnly: true,
validator: (value) => value.isEmpty ? 'Ne doit pas être vide ! !' : null,
controller: _dateController,
onTap: () => _selectDate(context),
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: 'Date de naissance',
labelText: "Date de naissance",
hoverColor: Colors.black,
),
),
SizedBox(height: 16),
SizedBox(
height: 50,
child: ElevatedButton(
onPressed: () => _submitForm(snapshot.data),
child: Text("Enregistrer"),
),
)
],
),
),
)
],
),
),
);
} else {
return Scaffold(
body: Center(
child: Text("Problème de connexion !"),
),
);
}
},
);
}
void _showGenderDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Genre"),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text("Homme"),
onTap: () {
_genderController.text = "Homme";
Navigator.of(context).pop();
},
),
ListTile(
title: Text("Femme"),
onTap: () {
_genderController.text = "Femme";
Navigator.of(context).pop();
},
)
],
),
);
},
);
}
void _showCountryPicker(BuildContext context) {
showCountryPicker(
context: context,
showPhoneCode: false,
onSelect: (Country country) {
setState(() {
_countryController.text = country.displayNameNoCountryCode;
});
},
);
}
}
+14 -17
View File
@@ -6,29 +6,26 @@ import 'package:le_kiosque_by_gcs/ui/view/main.dart';
import 'package:provider/provider.dart';
class LandingPageView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final auth = Provider.of<Auth>(context, listen: false);
return StreamBuilder<User>(
stream: auth.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
if (snapshot.data == null) {
return AuthView();
} else {
return MainView();
}
}
else {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
stream: auth.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
if (snapshot.data == null) {
return AuthView();
} else {
return MainView();
}
} else {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
},
);
}
}
+9 -2
View File
@@ -2,12 +2,15 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:le_kiosque_by_gcs/model/news.dart';
import 'package:le_kiosque_by_gcs/services/auth/auth.dart';
import 'package:le_kiosque_by_gcs/services/auth/main_auth.dart';
import 'package:le_kiosque_by_gcs/ui/view/home.dart';
import 'package:le_kiosque_by_gcs/ui/view/news/news.dart';
import 'package:le_kiosque_by_gcs/ui/view/profile.dart';
import 'package:le_kiosque_by_gcs/ui/view/search/search.dart';
import 'package:le_kiosque_by_gcs/ui/view/setting/setting.dart';
import 'package:le_kiosque_by_gcs/ui/view/subscription/subscription.dart';
import 'package:provider/provider.dart';
class MainView extends StatefulWidget {
@override
@@ -33,9 +36,13 @@ class _MainViewState extends State<MainView> {
}
_showSettingView(BuildContext context) {
final auth = Provider.of<Auth>(context, listen: false);
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => SettingView(),
builder: (context) => Provider(
create: (context) => MainAuth(),
child: SettingView(auth: auth),
),
),
);
}
@@ -43,7 +50,7 @@ class _MainViewState extends State<MainView> {
void _showSearchView(BuildContext context) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => SearchView(),
builder: (context) => SearchView(),
),
);
}
+60 -36
View File
@@ -1,9 +1,12 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:le_kiosque_by_gcs/model/magazine.dart';
import 'package:le_kiosque_by_gcs/model/user.dart';
import 'package:le_kiosque_by_gcs/services/firestore/user_service.dart';
import 'package:le_kiosque_by_gcs/ui/custom/item_mag_large.dart';
import 'package:le_kiosque_by_gcs/ui/custom/profile_picture.dart';
import 'package:le_kiosque_by_gcs/ui/view/edit_profil.dart';
import 'package:le_kiosque_by_gcs/ui/view/editprofile/edit_profil.dart';
import 'package:provider/provider.dart';
class ProfileView extends StatefulWidget {
@override
@@ -92,48 +95,69 @@ class _ProfileViewState extends State<ProfileView> {
}
Widget _buildProfileHeader() {
final imageUrl = FirebaseAuth.instance.currentUser.photoURL;
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: ProfilePicture(imageUrl: imageUrl),
),
),
Text(
"Eric Ampire",
style: TextStyle(
fontSize: 26,
color: Colors.black,
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(
Icons.location_on,
color: Color(0xFFA5A5A5),
size: 17,
),
final userService = Provider.of<UserService>(context, listen: false);
return StreamBuilder<KiosqueUser>(
stream: userService.getCurrentUser(FirebaseAuth.instance.currentUser.uid),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Scaffold(
body: Center(
child: Text("Une erreur s'est produite"),
),
Text(
"Lubumbashi",
style: TextStyle(color: Colors.grey),
)
],
)
],
);
}
if (snapshot.hasData) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: ProfilePicture(imageUrl: snapshot.data.profileUrl),
),
),
Text(
snapshot.data.displayName,
style: TextStyle(
fontSize: 26,
color: Colors.black,
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(
Icons.location_on,
color: Color(0xFFA5A5A5),
size: 17,
),
),
Text(
snapshot.data.city ?? "No location",
style: TextStyle(color: Colors.grey),
)
],
)
],
);
} else {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
},
);
}
_showEditProfileView(BuildContext context) {
final userService = Provider.of<UserService>(context, listen: false);
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) => EditProfileView(),
builder: (BuildContext context) => EditProfileView(userService: userService),
),
);
}