medora-provider/lib/screens/patientDashboard/registrationScreens/patient_registration_screen.dart
DhanshCOSQ ec433190c4 UI complete (#2)
UI complete for patient registration

Co-authored-by: Benoy Bose <benoybose@gmail.com>
Reviewed-on: cosqnet/telemednet#2
Reviewed-by: Benoy Bose <benoybose@cosq.net>
Co-authored-by: DhanshCOSQ <dhanshas@cosq.net>
Co-committed-by: DhanshCOSQ <dhanshas@cosq.net>
2024-10-31 06:04:36 +00:00

227 lines
6.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:telemednet/route_names.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
class PatientRegistrationScreen extends StatefulWidget {
const PatientRegistrationScreen({super.key});
@override
State<PatientRegistrationScreen> createState() =>
_PatientRegistrationScreenState();
}
class _PatientRegistrationScreenState extends State<PatientRegistrationScreen> {
final TextEditingController _nameController = TextEditingController();
final TextEditingController _phoneController = TextEditingController();
String? _gender;
DateTime? _dateOfBirth;
File? _image;
final ImagePicker _picker = ImagePicker();
Future<void> _getImage(ImageSource source) async {
final XFile? pickedFile = await _picker.pickImage(source: source);
if (pickedFile != null) {
setState(() {
_image = File(pickedFile.path);
});
}
}
void _showImageSourceActionSheet(BuildContext context) {
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return SafeArea(
child: Wrap(
children: <Widget>[
ListTile(
leading: const Icon(Icons.photo_library),
title: const Text('Choose from Gallery'),
onTap: () {
_getImage(ImageSource.gallery);
Navigator.pop(context);
},
),
ListTile(
leading: const Icon(Icons.photo_camera),
title: const Text('Take a Photo'),
onTap: () {
_getImage(ImageSource.camera);
Navigator.pop(context);
},
),
],
),
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Profile'),
actions: [
IconButton(
icon: const Icon(Icons.check, color: Colors.blue),
onPressed: () {
// Save profile logic here
},
),
],
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(
child: Column(
children: [
GestureDetector(
onTap: () => _showImageSourceActionSheet(context),
child: CircleAvatar(
radius: 50,
backgroundImage:
_image != null ? FileImage(_image!) : null,
child: _image == null
? const Icon(Icons.person, size: 50)
: null,
),
),
TextButton(
onPressed: () => _showImageSourceActionSheet(context),
child: const Text('Upload picture',
style: TextStyle(color: Colors.blue)),
),
],
),
),
const SizedBox(height: 20),
_buildTextField('Name', _nameController),
_buildTextField('Phone number', _phoneController),
_buildDropdownField('Gender', _gender, ['Male', 'Female', 'Other'],
(value) {
setState(() => _gender = value);
}),
_buildDateField('Date of Birth', _dateOfBirth),
_buildNavigationField('Address'),
_buildNavigationField('Family members'),
],
),
),
);
}
Widget _buildTextField(String label, TextEditingController controller) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
TextField(
controller: controller,
decoration: const InputDecoration(
border: UnderlineInputBorder(),
),
),
const SizedBox(height: 20),
],
);
}
Widget _buildDropdownField(String label, String? value, List<String> items,
Function(String?) onChanged) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
DropdownButton<String>(
value: value,
isExpanded: true,
hint: Text('Select $label'),
onChanged: onChanged,
items: items.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
const SizedBox(height: 20),
],
);
}
Widget _buildDateField(String label, DateTime? date) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(date != null
? DateFormat('dd/MM/yyyy').format(date)
: 'Select date'),
IconButton(
icon: const Icon(Icons.calendar_today, color: Colors.blue),
onPressed: () async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: date ?? DateTime.now(),
firstDate: DateTime(1900),
lastDate: DateTime.now(),
);
if (picked != null && picked != date) {
setState(() {
_dateOfBirth = picked;
});
}
},
),
],
),
const Divider(),
const SizedBox(height: 20),
],
);
}
Widget _buildNavigationField(String label) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(label,
style:
const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
IconButton(
icon: const Icon(Icons.chevron_right, color: Colors.blue),
onPressed: () {
if (label == 'Address') {
Navigator.of(context)
.pushNamed(RouteNames.patientAdressScreen);
} else {
Navigator.of(context)
.pushNamed(RouteNames.patientFamilyMembersScreen);
}
},
),
],
),
const Divider(),
const SizedBox(height: 20),
],
);
}
}