Odoo Flutter Mobile App using EKIKA's API Framework
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

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;
}
}