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
		
	
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: AppColors.mainPurple, isBold: true),
 | 
						|
                    ),
 | 
						|
                  )
 | 
						|
                  .toList(),
 | 
						|
              onChanged: _onCountryCodeChanged,
 | 
						|
              icon: const Icon(
 | 
						|
                Icons.keyboard_arrow_down_rounded,
 | 
						|
                color: AppColors.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,
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
        ],
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |