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.
210 lines
6.9 KiB
210 lines
6.9 KiB
4 months ago
|
import 'package:flutter/material.dart';
|
||
|
import 'secureStorage.dart';
|
||
|
import 'homepage.dart';
|
||
|
import 'contactService.dart';
|
||
|
import 'model/contactDetail.dart';
|
||
|
import 'dart:convert';
|
||
|
import 'dart:typed_data';
|
||
|
|
||
|
class ContatcDetailPage extends StatefulWidget {
|
||
|
late ContactDetail contact ;
|
||
|
late ContactService contactService;
|
||
|
ContatcDetailPage({Key? key, required this.contact, required this.contactService}) : super(key: key);
|
||
|
|
||
|
@override
|
||
|
_ContatcDetailPageState createState() => _ContatcDetailPageState();
|
||
|
}
|
||
|
|
||
|
|
||
|
class _ContatcDetailPageState extends State<ContatcDetailPage> {
|
||
|
late TextEditingController _nameController;
|
||
|
late TextEditingController _emailController;
|
||
|
late TextEditingController _phoneController;
|
||
|
late TextEditingController _streetController;
|
||
|
late TextEditingController _street2Controller;
|
||
|
late TextEditingController _cityController;
|
||
|
late TextEditingController _countryController;
|
||
|
|
||
|
|
||
|
// Future<ContactDetail> getContactDetailValues() async {
|
||
|
// final response = await _contactService.contactDetailRequest();
|
||
|
// final ContactDetail contactResult = ContactDetail.fromJson(response);
|
||
|
// print(contactResult);
|
||
|
// return contactResult;
|
||
|
// }
|
||
|
|
||
|
@override
|
||
|
void initState() {
|
||
|
super.initState();
|
||
|
_nameController = TextEditingController(text: widget.contact.name.toString());
|
||
|
_emailController = TextEditingController(text: widget.contact.email.toString());
|
||
|
_phoneController = TextEditingController(text: widget.contact.phone.toString());
|
||
|
_streetController = TextEditingController(text: widget.contact.street.toString());
|
||
|
_street2Controller = TextEditingController(text: widget.contact.street2.toString());
|
||
|
_cityController = TextEditingController(text: widget.contact.city.toString());
|
||
|
_countryController = TextEditingController(text: widget.contact.country.toString());
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
void dispose() {
|
||
|
_nameController.dispose();
|
||
|
_emailController.dispose();
|
||
|
_phoneController.dispose();
|
||
|
_streetController.dispose();
|
||
|
_cityController.dispose();
|
||
|
_countryController.dispose();
|
||
|
super.dispose();
|
||
|
}
|
||
|
|
||
|
getCircleAvatar(image) {
|
||
|
if (image != null && image != false){
|
||
|
Uint8List imageBytes = base64.decode(image);
|
||
|
ImageProvider imageProvider = MemoryImage(imageBytes);
|
||
|
return CircleAvatar(
|
||
|
backgroundImage: imageProvider,
|
||
|
radius: 50,
|
||
|
);
|
||
|
}
|
||
|
else{
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Future<void> _deleteContact(BuildContext context) async {
|
||
|
final response = await widget.contactService.contactDeleteRequest(id: widget.contact.id);// Replace with your API endpoint
|
||
|
if (response['data']['delete'] == 'Success') {
|
||
|
final apikey = await userCreds.read(key: 'api-key');
|
||
|
Navigator.push(
|
||
|
context, MaterialPageRoute(builder: (_) => HomePage(apikey:apikey.toString()))
|
||
|
); // Go back to contact list page after successful delete
|
||
|
} else {
|
||
|
// Show error message if delete fails
|
||
|
showDialog(
|
||
|
context: context,
|
||
|
builder: (context) => AlertDialog(
|
||
|
title: Text('Error'),
|
||
|
content: Text('Failed to delete contact. Please try again.'),
|
||
|
actions: [
|
||
|
TextButton(
|
||
|
onPressed: () {
|
||
|
Navigator.pop(context);
|
||
|
},
|
||
|
child: Text('OK'),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return Scaffold(
|
||
|
appBar: AppBar(
|
||
|
title: Text('Contact Details'),
|
||
|
actions: [
|
||
|
IconButton(
|
||
|
icon: Icon(Icons.save),
|
||
|
onPressed: () async {
|
||
|
// Save changes and navigate back
|
||
|
print('update clicked with name${widget.contact.name}');
|
||
|
final ContactDetail updatedrResult = await _saveUpdateChanges();
|
||
|
print(updatedrResult);
|
||
|
setState(() {
|
||
|
widget.contact = updatedrResult;
|
||
|
});
|
||
|
},
|
||
|
),
|
||
|
IconButton(
|
||
|
icon: Icon(Icons.delete),
|
||
|
onPressed:() {
|
||
|
showDialog(
|
||
|
context: context,
|
||
|
builder: (context) => AlertDialog(
|
||
|
title: Text('Confirm Delete'),
|
||
|
content: Text('Are you sure you want to delete this contact?'),
|
||
|
actions: [
|
||
|
TextButton(
|
||
|
onPressed: (){
|
||
|
Navigator.pop(context);
|
||
|
},
|
||
|
child: Text('Cancel')
|
||
|
),
|
||
|
TextButton(
|
||
|
onPressed: () async {
|
||
|
await _deleteContact(context);
|
||
|
},
|
||
|
child: Text('Delete')
|
||
|
)
|
||
|
],
|
||
|
)
|
||
|
);
|
||
|
},
|
||
|
)
|
||
|
]
|
||
|
),
|
||
|
body: SingleChildScrollView(
|
||
|
padding: EdgeInsets.all(16.0),
|
||
|
child: Column(
|
||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||
|
children: [
|
||
|
Center(
|
||
|
child: getCircleAvatar(widget.contact.image1920),
|
||
|
),
|
||
|
SizedBox(height: 16),
|
||
|
TextFormField(
|
||
|
controller: _nameController,
|
||
|
decoration: InputDecoration(labelText: 'Name'),
|
||
|
),
|
||
|
TextFormField(
|
||
|
controller: _emailController,
|
||
|
decoration: InputDecoration(labelText: 'Email'),
|
||
|
),
|
||
|
TextFormField(
|
||
|
controller: _phoneController,
|
||
|
decoration: InputDecoration(labelText: 'Phone'),
|
||
|
),
|
||
|
SizedBox(height: 16),
|
||
|
Text(
|
||
|
'Address:',
|
||
|
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
|
||
|
),
|
||
|
TextFormField(
|
||
|
controller: _streetController,
|
||
|
decoration: InputDecoration(labelText: 'Street'),
|
||
|
),
|
||
|
TextFormField(
|
||
|
controller: _street2Controller,
|
||
|
decoration: InputDecoration(labelText: 'Street2'),
|
||
|
),
|
||
|
TextFormField(
|
||
|
controller: _cityController,
|
||
|
decoration: InputDecoration(labelText: 'City'),
|
||
|
),
|
||
|
TextFormField(
|
||
|
controller: _countryController,
|
||
|
decoration: InputDecoration(labelText: 'Country'),
|
||
|
readOnly: true,
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Future<ContactDetail> _saveUpdateChanges() async {
|
||
|
final updatedContact = ContactDetail(
|
||
|
id: widget.contact.id,
|
||
|
name: _nameController.text,
|
||
|
email: _emailController.text,
|
||
|
phone: _phoneController.text,
|
||
|
image1920: widget.contact.image1920,
|
||
|
street: _streetController.text,
|
||
|
street2: _street2Controller.text,
|
||
|
city: _cityController.text,
|
||
|
country: _countryController.text,
|
||
|
);
|
||
|
final newUpdatedContacts = await widget.contactService.contactUpdateRequest(contact: updatedContact);
|
||
|
return newUpdatedContacts;
|
||
|
}
|
||
|
}
|