MIF_E31211879/lib/profile/editprofile.dart

608 lines
24 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:piring/bloc/nav/bottom_nav.dart';
import 'package:piring/model/user.dart';
import 'package:piring/profile/profile.dart';
import 'package:shared_preferences/shared_preferences.dart';
class EditProfile extends StatefulWidget {
const EditProfile({super.key});
@override
State<EditProfile> createState() => _EditProfileState();
}
class _EditProfileState extends State<EditProfile> {
String selectedGender = 'Laki-Laki'; // Default jenis kelamin
DateTime selectedDate = DateTime.now(); // Default tanggal lahir
String inputText = '';
TextEditingController _usernameController = TextEditingController();
TextEditingController jabatanController = TextEditingController();
TextEditingController namaController = TextEditingController();
TextEditingController tanggalLahirController = TextEditingController();
TextEditingController tinggiBadanController = TextEditingController();
TextEditingController beratBadanController = TextEditingController();
TextEditingController alamatController = TextEditingController();
TextEditingController kecamatanController = TextEditingController();
TextEditingController kabupatenController = TextEditingController();
TextEditingController provinsiController = TextEditingController();
TextEditingController jenisKelaminController = TextEditingController();
TextEditingController noTelpController = TextEditingController();
TextEditingController emailController = TextEditingController();
TextEditingController umurController = TextEditingController();
String? _validateNotEmpty(String? value) {
if (value == null || value.isEmpty) {
return 'Harus diisi';
}
return null; // Data valid
}
XFile? _imageFile;
Future<void> _getImageFromGallery() async {
final picker = ImagePicker();
final pickedFile = await picker.pickImage(source: ImageSource.gallery);
if (pickedFile != null) {
setState(() {
_imageFile = pickedFile;
});
// Simpan path gambar yang dipilih
_saveImagePath(pickedFile.path);
}
}
Future<void> _saveImagePath(String imagePath) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('profile_image', imagePath);
}
Future<void> loadProfileImage() async {
final prefs = await SharedPreferences.getInstance();
final imagePath = prefs.getString('profile_image');
if (imagePath != null) {
setState(() {
_imageFile = XFile(imagePath);
});
}
}
final scaffoldKey = GlobalKey<ScaffoldState>();
int Id = 0; // Awalnya set ke 0 atau nilai default lainnya
String Nama = '';
String username = '';
String email = '';
String notelp = '';
String tinggi = '';
String berat = '';
String jekel = '';
String tglLahir = '';
String jabatan = '';
String umur = '';
String alamat = '';
String kecamatan = '';
String kabupaten = '';
String provinsi = '';
Future<void> loadUserData() async {
final prefs = await SharedPreferences.getInstance();
final userDataString = prefs.getString('user_data');
if (userDataString != null) {
final userData = UserData.fromJson(json.decode(userDataString));
print(userData.nama);
setState(() {
Id = userData.idUser; // Mengambil langsung nilai idUser dari userData
Nama = userData.nama;
username = userData.username;
email = userData.email;
notelp = userData.noTelp;
tinggi = userData.tinggiBadan;
berat = userData.beratBadan;
jekel = userData.jekel;
tglLahir = userData.tglLahir;
jabatan = userData.jabatan;
umur = userData.umur;
alamat = userData.alamat;
kecamatan = userData.kecamatan;
kabupaten = userData.kabupaten;
provinsi = userData.provinsi;
_usernameController.text = username;
jabatanController.text = jabatan;
tanggalLahirController.text = tglLahir;
emailController.text = email;
noTelpController.text = notelp;
tinggiBadanController.text = tinggi;
beratBadanController.text = berat;
selectedGender = jekel;
umurController.text = umur;
alamatController.text = alamat;
kecamatanController.text = kecamatan;
kabupatenController.text = kabupaten;
provinsiController.text = provinsi;
print(Id);
});
}
}
String clientId = "PKL2023";
String clientSecret = "PKLSERU";
String tokenUrl = "https://isipiringku.esolusindo.com/api/Token/token";
String accessToken = "";
Future<void> getToken() async {
try {
var response = await http.post(
Uri.parse(tokenUrl),
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: {
'grant_type': 'client_credentials',
'client_id': clientId,
'client_secret': clientSecret,
},
);
if (response.statusCode == 200) {
Map<String, dynamic> tokenData = jsonDecode(response.body);
accessToken = tokenData['access_token'];
print('Token Akses: $accessToken');
} else {
print('Gagal mendapatkan token: ${response.statusCode}');
}
} catch (e) {
print('Gagal mendapatkan token: $e');
}
}
void Updateprofile() async {
final apiUrl =
'https://isipiringku.esolusindo.com/api/UpdateProfil/UpdateProfil';
final Map<String, dynamic> data = {
'id_user': Id,
'username': username,
'jabatan': jabatanController.text,
'nama': Nama,
'tgl_lahir': tanggalLahirController.text,
'tinggi_badan': tinggiBadanController.text,
'berat_badan': beratBadanController.text,
'alamat': alamatController.text,
'kecamatan': kecamatanController.text,
'kabupaten': kabupatenController.text,
'provinsi': provinsiController.text,
'jekel': selectedGender,
'no_telp': noTelpController.text,
'email': emailController.text,
'umur': umurController.text,
};
try {
final response = await http.post(
Uri.parse(apiUrl),
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $accessToken', // Menggunakan token OAuth2
},
);
if (response.statusCode == 200) {
// Update berhasil, lakukan sesuatu di sini
print('Update berhasil');
print(response.body);
UserData updatedProfile = UserData(
idUser: Id,
username: username,
jabatan: jabatan,
nama: Nama,
tglLahir: tanggalLahirController.text,
tinggiBadan: tinggi,
beratBadan: berat,
alamat: alamat,
kecamatan: kecamatan,
kabupaten: kabupaten,
provinsi: provinsi,
jekel: selectedGender,
noTelp: notelp,
email: email,
umur: umur,
tglDaftar: '',
);
saveUserProfile(updatedProfile);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => Profile(),
),
);
} else {
// Update gagal, tampilkan pesan kesalahan atau lakukan sesuatu yang sesuai
print('Update gagal. Status code: ${response.statusCode}');
}
} catch (error) {
// Terjadi kesalahan dalam proses Update
print('Terjadi kesalahan: $error');
}
}
Future<void> saveUserProfile(UserData updateprofile) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('user_data', json.encode(updateprofile.toJson()));
// Setel nilai model User sesuai perubahan
username = updateprofile.username;
email = updateprofile.email;
notelp = updateprofile.noTelp;
tinggi = updateprofile.tinggiBadan;
berat = updateprofile.beratBadan;
selectedGender = updateprofile.jekel;
tglLahir = updateprofile.tglLahir;
jabatan = updateprofile.jabatan;
umur = updateprofile.umur;
alamat = updateprofile.alamat;
kecamatan = updateprofile.kecamatan;
kabupaten = updateprofile.kabupaten;
provinsi = updateprofile.provinsi;
// dan set nilai-nilai lain sesuai kebutuhan
}
@override
void initState() {
super.initState();
getToken();
loadUserData();
loadProfileImage();
}
@override
void dispose() {
// Hapus controller ketika widget tidak lagi digunakan
_usernameController.dispose();
jabatanController.dispose();
umurController.dispose();
emailController.dispose();
tinggiBadanController.dispose();
beratBadanController.dispose();
tanggalLahirController.dispose();
jenisKelaminController.dispose();
alamatController.dispose();
kecamatanController.dispose();
kabupatenController.dispose();
provinsiController.dispose();
noTelpController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
bottomNavigationBar: BottomNavBar(selected: 4),
body: SingleChildScrollView(
child: Stack(
children: [
Container(
height: 130,
width: double.infinity,
decoration: const BoxDecoration(color: Colors.amber),
),
SafeArea(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 15.0),
child: Container(
width: MediaQuery.of(context).size.width,
child: Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(padding: EdgeInsets.only(top: 64)),
SizedBox(height: 20),
Center(
child: Container(
width: MediaQuery.of(context).size.height * 0.4,
height: 30,
decoration: BoxDecoration(
color: const Color.fromARGB(255, 98, 182, 250),
borderRadius: BorderRadius.circular(30),
boxShadow: kElevationToShadow[1],
),
padding: const EdgeInsets.symmetric(
horizontal: 5,
vertical: 0,
),
child: Center(
child: Text(
'EditProfile',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
),
),
SizedBox(height: 10),
Container(
alignment: Alignment.topCenter,
child: GestureDetector(
onTap: () {
print("Tapped on circle image");
_getImageFromGallery();
},
child: Container(
width: 120,
height: 120,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
shape: BoxShape.circle,
),
child: _imageFile != null
? Image.file(
File(_imageFile!.path),
fit: BoxFit.cover,
)
: Icon(
Icons.camera_alt,
size: 40.0,
color: Colors.orange,
),
),
),
),
TextFormField(
decoration: InputDecoration(labelText: 'Username'),
controller: _usernameController,
onChanged: (value) {
setState(() {
// Perbarui nilai variabel username saat pengguna mengubah input
username = value;
});
},
),
SizedBox(height: 10),
Row(
children: [
Expanded(
child: TextFormField(
decoration:
InputDecoration(labelText: 'Email'),
controller: emailController,
onChanged: (value) {
setState(() {
email = value;
});
},
),
),
SizedBox(width: 10),
Expanded(
child: TextFormField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: 'Nomor Telepon'),
controller: noTelpController,
onChanged: (value) {
setState(() {
notelp = value;
});
},
),
),
],
),
SizedBox(
height: 10,
),
Row(
children: [
Expanded(
child: TextFormField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: "Tinggi Badan"),
controller: tinggiBadanController,
onChanged: (value) {
setState(() {
tinggi = value;
});
},
),
),
SizedBox(width: 10),
Expanded(
child: TextFormField(
keyboardType: TextInputType.number,
decoration:
InputDecoration(labelText: 'Berat Badan'),
controller: beratBadanController,
onChanged: (value) {
setState(() {
berat = value;
});
},
),
),
],
),
SizedBox(height: 10),
Row(
children: [
Expanded(
child: DropdownButtonFormField<String>(
decoration: InputDecoration(
labelText: 'Jenis Kelamin',
hintText: 'Jenis Kelamin'),
value: selectedGender,
onChanged: (value) {
// Tambahkan kode untuk menangani perubahan jenis kelamin
setState(() {
selectedGender = value!;
});
},
items: ['Laki-Laki', 'Perempuan']
.map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
),
SizedBox(width: 10),
Expanded(
child: TextFormField(
decoration: InputDecoration(
labelText: 'Tanggal Lahir'),
controller: tanggalLahirController,
onTap: () async {
// Tambahkan kode untuk menampilkan date picker
final DateTime? pickedDate =
await showDatePicker(
context: context,
initialDate: selectedDate,
firstDate: DateTime(1900),
lastDate: DateTime.now(),
);
if (pickedDate != null &&
pickedDate != selectedDate) {
setState(() {
selectedDate = pickedDate;
tanggalLahirController.text =
DateFormat('yyyy-MM-dd')
.format(selectedDate);
});
}
},
),
),
],
),
SizedBox(height: 10),
Row(
children: [
Expanded(
child: TextFormField(
decoration:
InputDecoration(labelText: 'Pekerjaan'),
controller: jabatanController,
onChanged: (value) {
setState(() {
jabatan = value;
});
},
),
),
SizedBox(width: 10),
Expanded(
child: TextFormField(
keyboardType: TextInputType.number,
decoration:
InputDecoration(labelText: 'Umur'),
controller: umurController,
onChanged: (value) {
setState(() {
umur = value;
});
},
),
),
],
),
SizedBox(height: 10),
Row(
children: [
Expanded(
child: TextFormField(
decoration:
InputDecoration(labelText: 'Alamat'),
controller: alamatController,
onChanged: (value) {
setState(() {
alamat = value;
});
},
),
),
SizedBox(width: 10),
Expanded(
child: TextFormField(
decoration:
InputDecoration(labelText: 'Kecamatan'),
controller: kecamatanController,
onChanged: (value) {
setState(() {
kecamatan = value;
});
},
),
),
],
),
SizedBox(height: 10),
Row(
children: [
Expanded(
child: TextFormField(
decoration:
InputDecoration(labelText: 'Kabupaten'),
controller: kabupatenController,
onChanged: (value) {
setState(() {
kabupaten = value;
});
},
),
),
SizedBox(width: 10),
Expanded(
child: TextFormField(
decoration:
InputDecoration(labelText: 'Provinsi'),
controller: provinsiController,
onChanged: (value) {
setState(() {
provinsi = value;
});
},
),
),
],
),
SizedBox(
height: 5,
),
Center(
child: Container(
child: ElevatedButton(
onPressed: () {
Updateprofile();
},
child: Text('Simpan'),
),
))
],
),
],
),
),
),
),
],
),
),
);
}
}