You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.4 KiB
Dart
116 lines
3.4 KiB
Dart
|
2 months ago
|
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
||
|
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
||
|
|
import 'package:flutter/material.dart';
|
||
|
|
import 'package:flutter/services.dart';
|
||
|
|
|
||
|
|
class PhoneNumberInput extends StatefulWidget {
|
||
|
|
final void Function(String fullNumber)? onChanged;
|
||
|
|
final TextEditingController textController;
|
||
|
|
|
||
|
|
const PhoneNumberInput({Key? key, this.onChanged, required this.textController}) : super(key: key);
|
||
|
|
|
||
|
|
@override
|
||
|
|
State<PhoneNumberInput> createState() => _PhoneNumberInputState();
|
||
|
|
}
|
||
|
|
|
||
|
|
class _PhoneNumberInputState extends State<PhoneNumberInput> {
|
||
|
|
String _selectedCountryCode = '+966';
|
||
|
|
final List<String> _countryCodes = ['+966', '+971', '+1', '+44', '+91'];
|
||
|
|
|
||
|
|
void _onCountryCodeChanged(String? code) {
|
||
|
|
if (code != null) {
|
||
|
|
setState(() {
|
||
|
|
_selectedCountryCode = code;
|
||
|
|
});
|
||
|
|
_notifyChanged();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void _onPhoneChanged(String value) {
|
||
|
|
_notifyChanged();
|
||
|
|
}
|
||
|
|
|
||
|
|
void _notifyChanged() {
|
||
|
|
if (widget.onChanged != null) {
|
||
|
|
widget.onChanged!(
|
||
|
|
'$_selectedCountryCode${widget.textController.text}',
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
void dispose() {
|
||
|
|
widget.textController.dispose();
|
||
|
|
super.dispose();
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
return Container(
|
||
|
|
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10),
|
||
|
|
decoration: BoxDecoration(
|
||
|
|
color: const Color(0xFFF4F5F7),
|
||
|
|
borderRadius: BorderRadius.circular(16),
|
||
|
|
),
|
||
|
|
child: Row(
|
||
|
|
children: [
|
||
|
|
// Country Code Dropdown
|
||
|
|
DropdownButtonHideUnderline(
|
||
|
|
child: DropdownButton<String>(
|
||
|
|
value: _selectedCountryCode,
|
||
|
|
items: _countryCodes
|
||
|
|
.map(
|
||
|
|
(code) => DropdownMenuItem(
|
||
|
|
value: code,
|
||
|
|
child: code.toText16(color: mainPurple, isBold: true),
|
||
|
|
),
|
||
|
|
)
|
||
|
|
.toList(),
|
||
|
|
onChanged: _onCountryCodeChanged,
|
||
|
|
icon: const Icon(
|
||
|
|
Icons.keyboard_arrow_down_rounded,
|
||
|
|
color: mainPurple,
|
||
|
|
),
|
||
|
|
),
|
||
|
|
),
|
||
|
|
const SizedBox(width: 8),
|
||
|
|
// Phone number input
|
||
|
|
Expanded(
|
||
|
|
child: TextField(
|
||
|
|
onTapOutside: (event) {
|
||
|
|
FocusScope.of(context).unfocus();
|
||
|
|
},
|
||
|
|
controller: widget.textController,
|
||
|
|
keyboardType: TextInputType.number,
|
||
|
|
textInputAction: TextInputAction.done,
|
||
|
|
maxLength: 10,
|
||
|
|
inputFormatters: <TextInputFormatter>[
|
||
|
|
FilteringTextInputFormatter.allow(RegExp(r'^\d*\.?\d*$')),
|
||
|
|
],
|
||
|
|
decoration: const InputDecoration(
|
||
|
|
counterStyle: TextStyle(
|
||
|
|
height: double.minPositive,
|
||
|
|
),
|
||
|
|
counterText: "",
|
||
|
|
hintText: '5xxxxxxxx',
|
||
|
|
border: InputBorder.none,
|
||
|
|
hintStyle: TextStyle(
|
||
|
|
color: Colors.black38,
|
||
|
|
letterSpacing: 2,
|
||
|
|
),
|
||
|
|
),
|
||
|
|
style: const TextStyle(
|
||
|
|
fontSize: 18,
|
||
|
|
fontWeight: FontWeight.bold,
|
||
|
|
letterSpacing: 2,
|
||
|
|
color: Colors.black,
|
||
|
|
),
|
||
|
|
onChanged: _onPhoneChanged,
|
||
|
|
),
|
||
|
|
),
|
||
|
|
],
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|