You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

442 lines
17 KiB

import 'dart:convert';
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:teso/GeneralWidgets/inputTextLimited.dart';
import 'package:teso/Pages/Sub_Pages/@Generic/Camera/Picture/TakeDP.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
import 'package:page_transition/page_transition.dart';
import 'package:provider/provider.dart';
import 'package:teso/Classes/TesoUser.dart';
import 'package:teso/GeneralWidgets/inputText.dart';
import 'package:teso/providers/user_provider.dart';
import 'package:teso/util/consts.dart';
class EditProfile extends StatefulWidget {
final TesoUser userProfile;
final List<CameraDescription> connectedCameras;
const EditProfile({Key key, this.userProfile, this.connectedCameras})
: super(key: key);
@override
_EditProfileState createState() =>
_EditProfileState(userProfile: this.userProfile);
}
enum AppState {
free,
picked,
cropped,
}
class _EditProfileState extends State<EditProfile> {
TesoUser userProfile;
_EditProfileState({this.userProfile});
AppState state;
bool imageAvailable = false;
File _image;
String thumb;
bool passed = false;
bool failed = false;
final picker = ImagePicker();
TextEditingController username = new TextEditingController();
TextEditingController firstname = new TextEditingController();
TextEditingController surname = new TextEditingController();
TextEditingController telephone = new TextEditingController();
TextEditingController email = new TextEditingController();
TextEditingController address = new TextEditingController();
TextEditingController description = new TextEditingController();
_imageSelection(context) async {
final pickedFile = await Navigator.push(
context,
PageTransition(
type: PageTransitionType.leftToRight,
child: TakeDP(connectedCameras: widget.connectedCameras),
));
if (pickedFile != null) {
_image = File(pickedFile.path);
setState(() {
_cropImage();
imageAvailable = true;
});
}
}
Future<Null> _cropImage() async {
ImageCropper imageCropper = new ImageCropper();
CroppedFile croppedFile = await imageCropper.cropImage(
sourcePath: _image.path,
cropStyle: CropStyle.circle,
aspectRatioPresets: Platform.isAndroid
? [CropAspectRatioPreset.original]
: [CropAspectRatioPreset.original]);
// [
// AndroidUiSettings(
// toolbarTitle: 'Teso Profile Picture',
// toolbarColor: Theme.of(context).colorScheme.secondary,
// toolbarWidgetColor: Colors.white,
// initAspectRatio: CropAspectRatioPreset.original,
// lockAspectRatio: false),
// iosUiSettings: IOSUiSettings(
// title: 'Teso Profile Picture',
// ))];
if (croppedFile != null) {
setState(() {
// _image = croppedFile.;
state = AppState.cropped;
imageAvailable = true;
});
} else {
_clearImage();
}
}
void _clearImage() {
setState(() {
_image = null;
state = AppState.free;
imageAvailable = false;
});
}
Future<void> _updateUser() async {
try {
String thumbnail;
if (_image != null) {
List<int> imageBytes = await _image.readAsBytes();
thumbnail = base64Encode(imageBytes);
} else if (thumb != null) {
thumbnail = thumb;
}
TesoUser updateuser = new TesoUser();
updateuser.userGUID = userProfile.userGUID;
updateuser.username = username.text;
updateuser.firstname = firstname.text;
updateuser.lastname = surname.text;
updateuser.address = address.text;
updateuser.description = description.text;
updateuser.email = email.text;
updateuser.phonenumber = telephone.text;
updateuser.gold = userProfile.gold;
updateuser.silver = userProfile.silver;
updateuser.friends = userProfile.friends;
updateuser.displaypicture = thumbnail;
updateuser.thumbnail_dp = userProfile.thumbnail_dp;
updateuser.country = userProfile.country;
updateuser.gender = userProfile.gender;
updateuser.dateOfBirth = userProfile.dateOfBirth;
print(updateuser.toString());
UserProvider userProvider =
Provider.of<UserProvider>(context, listen: false);
userProvider.updateUser(updateuser);
if (mounted) {
setState(() {
passed = true;
});
}
Future.delayed(const Duration(seconds: 5), () {
if (passed) {
if (mounted) {
setState(() {
passed = false;
});
}
}
});
} catch (e) {
print(e);
if (mounted) {
setState(() {
failed = true;
});
}
Future.delayed(const Duration(seconds: 5), () {
if (failed) {
if (mounted) {
setState(() {
failed = false;
});
}
}
});
}
}
@override
void initState() {
username.text = userProfile.username.toString();
firstname.text = userProfile.firstname;
surname.text = userProfile.lastname;
address.text = userProfile.address;
email.text = userProfile.email;
telephone.text = userProfile.phonenumber;
description.text = userProfile.description;
thumb = userProfile.thumbnail_dp;
super.initState();
}
@override
Widget build(BuildContext context) {
return AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle.light,
child: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Container(
height: MediaQuery.of(context).size.height * 0.9,
child: Scaffold(
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: new Wrap(
children: <Widget>[
new Container(
margin: EdgeInsets.only(
left: 20.0,
top: 10.0,
bottom: 10.0,
),
child: Row(
children: [
Container(
child: InkWell(
onTap: () => Navigator.pop(context),
child: Icon(Icons.close),
),
),
Expanded(
child: Container(
width: double.infinity,
child: Center(
child: Text(
"Edit Profile",
style: TextStyle(
fontSize: 17.0,
),
),
),
),
),
new Container(
margin: EdgeInsets.symmetric(
vertical: 0.0, horizontal: 20),
child: new Center(
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary:
Theme.of(context).colorScheme.secondary,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(25.0),
),
),
),
onPressed: () => _updateUser(),
child: Text("Done"),
),
),
)
],
)),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Divider(),
),
Visibility(
visible: passed,
child: Container(
margin: EdgeInsets.only(top: 10, bottom: 10),
color: Colors.green,
width: double.infinity,
height: 20,
child: Center(
child: Text(
'Profile updated successfully',
style: TextStyle(
color: Colors.white,
),
),
),
),
),
Visibility(
visible: failed,
child: Container(
margin: EdgeInsets.only(top: 10, bottom: 10),
color: Colors.red,
width: double.infinity,
height: 20,
child: Center(
child: Text(
'An error occurred',
style: TextStyle(
color: Colors.white,
),
),
),
),
),
Center(
child: InkWell(
onTap: () => _imageSelection(context),
child: Container(
//color: Theme.of(context).accentColor,
height: 130,
width: 130,
decoration: new BoxDecoration(
shape: BoxShape.circle,
color: Colors.grey[400],
),
child: _image == null && thumb == null
? Center(
child: Text(
username.text.characters
.characterAt(0)
.toString()
.toUpperCase(),
),
)
: _image == null && thumb == "null"
? Center(
child: Text(
username.text.characters
.characterAt(0)
.toString()
.toUpperCase(),
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
),
),
)
: _image != null
? Container(
height: 130,
width: 130,
decoration: BoxDecoration(
shape: BoxShape.circle,
),
child: ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(90.0),
topRight: Radius.circular(90.0),
bottomLeft: Radius.circular(90),
bottomRight: Radius.circular(90),
),
child: FadeInImage(
placeholder: AssetImage(
"assets/images/tesoDP/dp1.png"),
height: 130,
width: 130,
fit: BoxFit.fill,
image: FileImage(
File(
_image.path,
),
),
),
),
)
: Container(
height: 130,
width: 130,
decoration: BoxDecoration(
shape: BoxShape.circle,
),
child: ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(90.0),
topRight: Radius.circular(90.0),
bottomLeft: Radius.circular(90),
bottomRight: Radius.circular(90),
),
child: FadeInImage(
height: 130,
width: 130,
fit: BoxFit.fill,
image:
NetworkImage(userdpURL + thumb),
placeholder: AssetImage(
"assets/images/tesoDP/dp1.png"),
),
),
),
),
),
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20.0, vertical: 20.0),
child: Divider(),
),
new ListTile(
enabled: false,
title: buildInputContainer(
context, username, "Username", false),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Divider(),
),
new ListTile(
title: buildInputContainer(
context, firstname, "Firstname", true),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Divider(),
),
new ListTile(
title:
buildInputContainer(context, surname, "Lastname", true),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Divider(),
),
new ListTile(
title: buildInputContainerLimit(
context, description, "About You", true, 120),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Divider(),
),
new ListTile(
title: buildInputContainer(
context, email, "Contact (email)", true),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Divider(),
),
new ListTile(
title: buildInputContainer(
context, telephone, "Contact (phone number)", true),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Divider(),
),
// new ListTile(
// title:
// buildInputContainer(context, address, "Address", true),
// ),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 20.0),
// child: Divider(),
// ),
],
),
),
),
),
),
);
}
}