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>
227 lines
6.9 KiB
Dart
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),
|
|
],
|
|
);
|
|
}
|
|
}
|