import 'dart:async'; import 'dart:convert'; import 'dart:math'; import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/views/home/map_page_passenger.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/links.dart'; import 'package:SEFER/constant/style.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/views/auth/login_page.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart'; import '../../constant/box_name.dart'; import '../../main.dart'; import '../../views/auth/verify_email_page.dart'; import '../functions/sms_controller.dart'; class RegisterController extends GetxController { final formKey = GlobalKey(); final formKey3 = GlobalKey(); List countryCodes = ['+1', '+91', '+44']; String selectedCountryCode = '+1'; TextEditingController firstNameController = TextEditingController(); TextEditingController lastNameController = TextEditingController(); TextEditingController emailController = TextEditingController(); TextEditingController phoneController = TextEditingController(); TextEditingController passwordController = TextEditingController(); TextEditingController siteController = TextEditingController(); TextEditingController verfyCode = TextEditingController(); TextEditingController verifyCode = TextEditingController(); int remainingTime = 300; // 5 minutes in seconds bool isSent = false; bool isLoading = false; Timer? _timer; String birthDate = 'Birth Date'.tr; String gender = 'Male'.tr; @override void onInit() { super.onInit(); } void updateCountryCode(String newCode) { selectedCountryCode = newCode; update(); } void startTimer() { _timer?.cancel(); // Cancel any existing timer _timer = Timer.periodic(const Duration(seconds: 1), (timer) { if (remainingTime > 0) { remainingTime--; } else { timer.cancel(); } }); } getBirthDate() { Get.defaultDialog( title: 'Select Date'.tr, titleStyle: AppStyle.title, content: SizedBox( width: 300, child: CalendarDatePicker( initialDate: DateTime.now().subtract(const Duration(days: 14 * 365)), firstDate: DateTime.parse('1940-06-01'), lastDate: DateTime.now().subtract(const Duration(days: 14 * 365)), onDateChanged: (date) { // Get the selected date and convert it to a DateTime object DateTime dateTime = date; // Call the getOrders() function from the controller birthDate = dateTime.toString().split(' ')[0]; update(); }, // onDateChanged: (DateTime value) {}, ), ), confirm: MyElevatedButton(title: 'Ok'.tr, onPressed: () => Get.back())); } void changeGender(String value) { gender = value; update(); } bool isValidEgyptianPhoneNumber(String phoneNumber) { // Remove any whitespace from the phone number phoneNumber = phoneNumber.replaceAll(RegExp(r'\s+'), ''); // Check if the phone number has exactly 11 digits if (phoneNumber.length != 11) { return false; } // Check if the phone number starts with 010, 011, 012, or 015 RegExp validPrefixes = RegExp(r'^01[0125]\d{8}$'); return validPrefixes.hasMatch(phoneNumber); } bool isValidPhoneNumber(String phoneNumber) { // Remove any whitespace from the phone number phoneNumber = phoneNumber.replaceAll(RegExp(r'\s+'), ''); // Check if the phone number has at least 10 digits if (phoneNumber.length < 10) { return false; } // Check for valid prefixes (modify this to match your use case) RegExp validPrefixes = RegExp(r'^[0-9]+$'); // Check if the phone number contains only digits return validPrefixes.hasMatch(phoneNumber); } sendOtpMessage() async { SmsEgyptController smsEgyptController = Get.put(SmsEgyptController()); int randomNumber = Random().nextInt(100000) + 1; isLoading = true; update(); if (formKey3.currentState!.validate()) { if (box.read(BoxName.countryCode) == 'Egypt') { if (isValidEgyptianPhoneNumber(phoneController.text) == true) { var responseCheker = await CRUD() .post(link: AppLink.checkPhoneNumberISVerfiedPassenger, payload: { 'phone_number': '+2${phoneController.text}', 'email': box.read(BoxName.email), }); if (responseCheker != 'failure') { var d = jsonDecode(responseCheker); if (d['message'][0]['verified'].toString() == '1') { Get.snackbar('Phone number is verified before'.tr, '', backgroundColor: AppColor.greenColor); box.write(BoxName.isVerified, '1'); box.write(BoxName.phone, '+2${phoneController.text}'); Get.offAll(const MapPagePassenger()); } else { await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { 'phone_number': '+2${phoneController.text}', 'token': randomNumber.toString(), }); await smsEgyptController.sendSmsEgypt( phoneController.text.toString(), randomNumber.toString()); isSent = true; remainingTime = 300; // Reset to 5 minutes startTimer(); isLoading = false; update(); } } else { await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { 'phone_number': '+2${phoneController.text}', 'token': randomNumber.toString(), }); await smsEgyptController.sendSmsEgypt( phoneController.text.toString(), randomNumber.toString()); isSent = true; remainingTime = 300; // Reset to 5 minutes startTimer(); isLoading = false; update(); // Get.snackbar(responseCheker, 'message'); } } else if (isValidPhoneNumber(phoneController.text)) { await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { 'phone_number': '+${phoneController.text}', 'token': randomNumber.toString(), }); await smsEgyptController.sendWhatsAppAuth( phoneController.text, randomNumber.toString()); // await smsEgyptController.sendSmsEgypt( // phoneController.text.toString(), randomNumber.toString()); isSent = true; remainingTime = 300; // Reset to 5 minutes startTimer(); isLoading = false; update(); } else { Get.snackbar('Phone Number wrong'.tr, '', backgroundColor: AppColor.redColor, duration: const Duration(seconds: 5)); } } } } verifySMSCode() async { // if (formKey3.currentState!.validate()) { if (isValidEgyptianPhoneNumber(phoneController.text)) { var res = await CRUD().post(link: AppLink.verifyOtpMessage, payload: { 'phone_number': '+2${phoneController.text}', 'token': verifyCode.text.toString(), }); if (res != 'failure') { // var dec = jsonDecode(res); box.write(BoxName.phoneDriver, '+2${phoneController.text}'); var payload = { 'id': box.read(BoxName.passengerID), 'phone': '+2${phoneController.text}', 'email': box.read(BoxName.email), 'password': 'unknown', 'gender': 'unknown', 'birthdate': '2002-01-01', 'site': 'unknown', 'first_name': box.read(BoxName.name).toString().split(' ')[0], 'last_name': box.read(BoxName.name).toString().split(' ')[1], }; var res1 = await CRUD().post( link: AppLink.signUp, payload: payload, ); if (res1 != 'failure') { CRUD().post( link: '${AppLink.seferAlexandriaServer}/auth/signup.php', payload: payload, ); CRUD().post( link: '${AppLink.seferGizaServer}/auth/signup.php', payload: payload, ); box.write(BoxName.isVerified, '1'); box.write(BoxName.phone, '+2${phoneController.text}'); Get.offAll(const MapPagePassenger()); } } else { Get.snackbar( 'Error'.tr, "The email or phone number is already registered.".tr, backgroundColor: Colors.redAccent); } } else { var res = await CRUD().post(link: AppLink.verifyOtpMessage, payload: { 'phone_number': '+${phoneController.text}', 'token': verifyCode.text.toString(), }); if (res != 'failure') { // var dec = jsonDecode(res); box.write(BoxName.phoneDriver, '+${phoneController.text}'); var payload = { 'id': box.read(BoxName.passengerID), 'phone': '+${phoneController.text}', 'email': box.read(BoxName.email), 'password': 'unknown', 'gender': 'unknown', 'birthdate': '2002-01-01', 'site': 'unknown', 'first_name': box.read(BoxName.name).toString().split(' ')[0], 'last_name': box.read(BoxName.name).toString().split(' ')[1], }; var res1 = await CRUD().post( link: AppLink.signUp, payload: payload, ); if (res1 != 'failure') { CRUD().post( link: '${AppLink.seferAlexandriaServer}/auth/signup.php', payload: payload, ); CRUD().post( link: '${AppLink.seferGizaServer}/auth/signup.php', payload: payload, ); box.write(BoxName.isVerified, '1'); box.write(BoxName.phone, '+${phoneController.text}'); Get.offAll(const MapPagePassenger()); } } else { Get.snackbar( 'Error'.tr, "The email or phone number is already registered.".tr, backgroundColor: Colors.redAccent); } } } sendVerifications() async { var res = await CRUD().post(link: AppLink.verifyEmail, payload: { 'email': emailController.text, 'token': verfyCode.text, }); var dec = jsonDecode(res); if (dec['status'] == 'success') { Get.offAll(() => LoginPage()); } } void register() async { if (formKey.currentState!.validate()) { var res = await CRUD().post(link: AppLink.signUp, payload: { 'first_name': firstNameController.text.toString(), 'last_name': lastNameController.text.toString(), 'email': emailController.text.toString(), 'phone': phoneController.text.toString(), 'password': passwordController.text.toString(), 'gender': 'yet', 'site': siteController.text, 'birthdate': birthDate, }); if (jsonDecode(res)['status'] == 'success') { int randomNumber = Random().nextInt(100000) + 1; await CRUD().post(link: AppLink.sendVerifyEmail, payload: { 'email': emailController.text, 'token': randomNumber.toString(), }); Get.to(() => const VerifyEmailPage()); } } } @override void onClose() { _timer?.cancel(); super.onClose(); } }