import 'package:covas_mobile/classes/MyDrawer.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; import 'dart:convert'; import 'dart:io'; import '../classes/MyDrawer.dart'; import '../pages/LoginDemo.dart'; import '../classes/alert.dart'; import '../classes/eventAdded.dart'; import '../variable/globals.dart' as globals; import '../classes/ad_helper.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; import '../classes/auth_service.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:covas_mobile/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import '../locale_provider.dart'; // Créé void main() async { WidgetsFlutterBinding.ensureInitialized(); await MobileAds.instance.initialize(); runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: EditProfile(), ); } } class EditProfile extends StatefulWidget { const EditProfile({super.key}); @override _EditProfileState createState() => _EditProfileState(); } class _EditProfileState extends State with ShowAlertDialog, ShowEventDialog { BannerAd? _bannerAd; final AuthService _authService = AuthService(); TextEditingController inputUserName = TextEditingController(); TextEditingController inputName = TextEditingController(); TextEditingController inputFirstName = TextEditingController(); TextEditingController inputEmail = TextEditingController(); TextEditingController inputBirth = TextEditingController(); TextEditingController inputPassword = TextEditingController(); TextEditingController inputPasswordConfirmed = TextEditingController(); onTapFunctionDatePicker({required BuildContext context}) async { DateTime initialDate = DateTime.parse(formatDate(inputBirth.text)); DateTime? pickedDate = await showDatePicker( context: context, firstDate: DateTime(1900), initialDate: initialDate, lastDate: DateTime(2104)); if (pickedDate == null) return; inputBirth.text = DateFormat("dd/MM/yyyy").format(pickedDate); } convertNulltoEmptyString(var check) { if (check == null) { return ""; } return check; } convertNulltoArray(List check) { if (check == null) { return []; } return check; } String formatDate(String date) { var splitedDate = date.split("/"); var day = splitedDate[0]; var month = splitedDate[1]; var year = splitedDate[2]; return "${year}-${month}-${day}"; } Future _updateProfile(BuildContext context) async { var username = inputUserName.text; var firstName = inputFirstName.text; var name = inputName.text; var email = inputEmail.text; var password = inputPassword.text; var confirmedPassword = inputPasswordConfirmed.text; var birth = DateTime.parse(formatDate(inputBirth.text)); if ((password.isNotEmpty) && (confirmedPassword.isNotEmpty)) { if (password != confirmedPassword) { showAlertDialog( context, AppLocalizations.of(context)?.error ?? "Error", AppLocalizations.of(context)?.different_password_error ?? "Different password"); return; } } var urlPut = Uri.parse("${globals.api}/users/me"); SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; if (accessToken.isNotEmpty) { var responsePut = await http.put(urlPut, headers: { HttpHeaders.cookieHeader: 'access_token=${accessToken}', HttpHeaders.acceptHeader: 'application/json, text/plain, */*', HttpHeaders.contentTypeHeader: 'application/json' }, body: jsonEncode({ 'name': name, 'username': username, 'firstName': firstName, 'password': password, 'email': email, 'roles': '', 'birth': birth.toString() })); print(responsePut.statusCode); if (responsePut.statusCode == 200) { showEventDialog(context, AppLocalizations.of(context)?.user_update ?? "Your user updated"); Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => EditProfile())); return; } final messages = { 400: AppLocalizations.of(context)?.request_error ?? "Poorly constructed query", 406: AppLocalizations.of(context)?.incorrect_password ?? "Incorrect password", 404: AppLocalizations.of(context)?.unknown_user ?? "Unknown user", 403: AppLocalizations.of(context)?.disabled_user ?? "Disabled user", 410: AppLocalizations.of(context)?.invalid_token ?? "Invalid token", 500: AppLocalizations.of(context)?.internal_error_server ?? "Internal error server" }; final text = messages[responsePut.statusCode] ?? AppLocalizations.of(context)?.unknown_error_auth ?? "Unknown error auth"; showAlertDialog( context, AppLocalizations.of(context)?.error ?? "Error", text); } else { Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => LoginDemo())); } } Future _getInfoProfile() async { var urlGet = Uri.parse("${globals.api}/users/me"); SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; if (accessToken.isNotEmpty) { var responseGet = await http.get(urlGet, headers: { HttpHeaders.cookieHeader: 'access_token=${accessToken}', HttpHeaders.acceptHeader: 'application/json, text/plain, */*', HttpHeaders.contentTypeHeader: 'application/json' }); print(responseGet.statusCode); if (responseGet.statusCode == 200) { var body = json.decode(utf8.decode(responseGet.bodyBytes)); setState(() { inputName.text = body["name"]; inputFirstName.text = body["firstName"]; inputUserName.text = body["username"]; inputEmail.text = body["email"]; inputBirth.text = DateFormat("dd/MM/yyyy").format(DateTime.parse(body["birth"])); }); return; } final messages = { 400: AppLocalizations.of(context)?.request_error ?? "Poorly constructed query", 406: AppLocalizations.of(context)?.incorrect_password ?? "Incorrect password", 404: AppLocalizations.of(context)?.unknown_user ?? "Unknown user", 403: AppLocalizations.of(context)?.disabled_user ?? "Disabled user", 410: AppLocalizations.of(context)?.invalid_token ?? "Invalid token", 500: AppLocalizations.of(context)?.internal_error_server ?? "Internal error server" }; final text = messages[responseGet.statusCode] ?? AppLocalizations.of(context)?.unknown_error_auth ?? "Unknown error auth"; showAlertDialog( context, AppLocalizations.of(context)?.error ?? "Error", text); } else { Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => LoginDemo())); } } @override void initState() { super.initState(); _authService.checkTokenStatus(context); AdHelper.createBannerAd(() => setState(() {})).then((ad) { setState(() { _bannerAd = ad; }); }); _getInfoProfile(); } final _formKey = GlobalKey(); String? _validateField(String? value) { return value!.isEmpty ? AppLocalizations.of(context)?.required_input ?? "Required input" : null; } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( title: Text( AppLocalizations.of(context)?.update_profile ?? "Update profile"), backgroundColor: Colors.blue, foregroundColor: Colors.white, ), drawer: MyDrawer(), body: Form( key: _formKey, child: SingleChildScrollView( child: Column( children: [ _bannerAd == null ? SizedBox.shrink() : SizedBox( height: _bannerAd!.size.height.toDouble(), width: _bannerAd!.size.width.toDouble(), child: AdWidget(ad: _bannerAd!)), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextFormField( controller: inputUserName, validator: (value) => _validateField(value), decoration: InputDecoration( border: OutlineInputBorder(), labelText: AppLocalizations.of(context)?.name, hintText: AppLocalizations.of(context)?.edit_pseudo ?? "Edit pseudo"), ), ), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextFormField( controller: inputPassword, obscureText: true, decoration: InputDecoration( border: OutlineInputBorder(), labelText: AppLocalizations.of(context)?.password ?? "Password", hintText: AppLocalizations.of(context)?.enter_password ?? "Enter a password"), ), ), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextFormField( controller: inputPasswordConfirmed, obscureText: true, decoration: InputDecoration( border: OutlineInputBorder(), labelText: AppLocalizations.of(context)?.password_confirmed ?? "Must confirm password", hintText: AppLocalizations.of(context)?.password_confirmed ?? "Must confirm password"), ), ), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextFormField( controller: inputName, validator: (value) => _validateField(value), decoration: InputDecoration( border: OutlineInputBorder(), labelText: AppLocalizations.of(context)?.last_name ?? "Last name", hintText: AppLocalizations.of(context)?.edit_last_name ?? "Edit last name"), ), ), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextFormField( controller: inputFirstName, validator: (value) => _validateField(value), decoration: InputDecoration( border: OutlineInputBorder(), labelText: AppLocalizations.of(context)?.first_name ?? "First name", hintText: AppLocalizations.of(context)?.edit_first_name ?? "Edit first name"), ), ), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextFormField( controller: inputEmail, validator: (value) => _validateField(value), decoration: InputDecoration( border: OutlineInputBorder(), labelText: AppLocalizations.of(context)?.email ?? "Email", hintText: AppLocalizations.of(context)?.edit_email ?? "Edit email"), ), ), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextFormField( controller: inputBirth, readOnly: true, validator: (value) => _validateField(value), decoration: InputDecoration( border: OutlineInputBorder(), labelText: AppLocalizations.of(context)?.birth_date, hintText: AppLocalizations.of(context)?.edit_birth ?? "Click to select a birth date"), onTap: () => onTapFunctionDatePicker(context: context)), ), SizedBox( height: 30, ), Container( height: 50, width: 250, decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(20)), child: TextButton( onPressed: () { if (_formKey.currentState!.validate()) { _updateProfile(context); } }, child: Text( AppLocalizations.of(context)?.update_profile ?? "Update profile ", style: TextStyle(color: Colors.white, fontSize: 25), ), ), ) ], ), ), )); } }