import 'dart:io'; import 'package:Tripz/controller/functions/crud.dart'; import 'package:Tripz/controller/functions/encrypt_decrypt.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; import 'package:get/get.dart'; import 'package:Tripz/constant/box_name.dart'; import 'package:Tripz/constant/colors.dart'; import 'package:Tripz/constant/style.dart'; import 'package:Tripz/main.dart'; import 'package:Tripz/views/widgets/my_scafold.dart'; import '../../constant/info.dart'; import '../../controller/auth/apple_signin_controller.dart'; import '../../controller/auth/google_sign.dart'; import '../../controller/auth/login_controller.dart'; import '../home/HomePage/contact_us.dart'; import '../home/profile/passenger_profile_page.dart'; class LoginPage extends StatelessWidget { final controller = Get.put(LoginController()); final AuthController authController = Get.put(AuthController()); LoginPage({super.key}); @override Widget build(BuildContext context) { Get.put(LoginController()); Get.put(CRUD()); return GetBuilder( builder: (controller) => MyScafolld( title: 'Login'.tr, isleading: false, body: [ if (box.read(BoxName.agreeTerms) != 'agreed') _buildAgreementPage(controller) else if (box.read(BoxName.countryCode) == null) _buildCountryPicker() else if (box.read(BoxName.locationPermission) != 'true') _buildLocationPermissionDialog(controller) else _buildLoginContent(controller, authController), ], ), ); } Widget _buildLoginContent( LoginController controller, AuthController authController) { return SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( 'assets/images/logo.gif', height: Get.width * 0.4, width: Get.width * 0.4, fit: BoxFit.contain, ), const SizedBox(height: 32), if (Platform.isIOS && controller.isTest == 0) _buildEmailPasswordForm(controller) else Padding( padding: const EdgeInsets.only(bottom: 24.0), child: Text( 'Sign in for a seamless experience'.tr, textAlign: TextAlign.center, style: AppStyle.subtitle, ), ), InkWell( onTap: () async => await GoogleSignInHelper().signInFromLogin(), child: _buildSocialButton( icon: FontAwesome.google, text: 'Sign In with Google'.tr, color: AppColor.redColor, ), ), const SizedBox(height: 16), if (!Platform.isAndroid) GestureDetector( onTap: () async { User? user = await authController.signInWithApple(); if (user != null) { box.write(BoxName.passengerID, user.uid); box.write(BoxName.email, (user.email.toString())); await controller.loginUsingCredentials( box.read(BoxName.passengerID).toString(), box.read(BoxName.email).toString(), ); } else { Get.snackbar('User not found'.tr, '', backgroundColor: AppColor.redColor); } }, child: _buildSocialButton( icon: Icons.apple, text: 'Sign in with Apple'.tr, color: Colors.black, ), ), const SizedBox(height: 40), GestureDetector( onTap: () => Get.to(() => ContactUsPage()), child: Text( 'Need assistance? Contact us'.tr, style: AppStyle.subtitle.copyWith(color: Colors.grey), ), ), // TextButton( // onPressed: () async { // var encrypt = EncryptionHelper.instance.encryptData(''); // Log.print('encrypt: ${encrypt}'); // Log.print( // 'encrypt: ${EncryptionHelper.instance.decryptData(encrypt)}'); // }, // child: Text( // "Text Button", // ), // ), ], ), ), ); } Widget _buildSocialButton({ required IconData icon, required String text, required Color color, }) { return Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: color, borderRadius: BorderRadius.circular(8), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(icon, color: Colors.white), const SizedBox(width: 12), Text( text, style: const TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500), ), ], ), ); } Widget _buildEmailPasswordForm(LoginController controller) { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.2), spreadRadius: 2, blurRadius: 5, offset: const Offset(0, 3), ), ], ), child: Form( key: controller.formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ TextFormField( keyboardType: TextInputType.emailAddress, controller: controller.emailController, decoration: InputDecoration( labelText: 'Email'.tr, hintText: 'Your email address'.tr, border: const OutlineInputBorder(), ), validator: (value) => value == null || value.isEmpty || !value.contains('@') || !value.contains('.') ? 'Enter a valid email'.tr : null, ), const SizedBox(height: 16), TextFormField( obscureText: true, controller: controller.passwordController, decoration: InputDecoration( labelText: 'Password'.tr, hintText: 'Your password'.tr, border: const OutlineInputBorder(), ), validator: (value) => value == null || value.isEmpty ? 'Enter your password'.tr : null, ), const SizedBox(height: 24), GetBuilder( builder: (controller) => controller.isloading ? const Center(child: CircularProgressIndicator()) : ElevatedButton( onPressed: () { if (controller.formKey.currentState!.validate()) { controller.login(); } }, child: Text('Submit'.tr), ), ), ], ), ), ); } Widget _buildAgreementPage(LoginController controller) { return Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ListTile( leading: Image.asset('assets/images/notepad.png', width: 40), title: Text('Terms of Use & Privacy Notice'.tr, style: AppStyle.headTitle2), ), const SizedBox(height: 20), RichText( textAlign: TextAlign.left, text: TextSpan( style: AppStyle.title, children: [ TextSpan( text: 'By selecting "I Agree" below, I confirm that I have read and agree to the ' .tr), TextSpan( text: 'Terms of Use'.tr, style: const TextStyle( decoration: TextDecoration.underline, color: AppColor.blueColor), ), const TextSpan(text: ' and acknowledge the '), TextSpan( text: 'Privacy Notice'.tr, style: const TextStyle( decoration: TextDecoration.underline, color: AppColor.blueColor), recognizer: TapGestureRecognizer() ..onTap = () { Get.defaultDialog( title: 'Privacy Notice'.tr, content: const SizedBox( height: 400, width: 400, child: SingleChildScrollView( child: HtmlWidget(AppInformation.privacyPolicy), ), ), ); }, ), TextSpan(text: '. I am at least 18 years old.'.tr), ], ), ), const SizedBox(height: 40), Row( children: [ Checkbox( value: controller.isAgreeTerms, onChanged: (newValue) => controller.changeAgreeTerm(), activeColor: AppColor.primaryColor, ), Text('I Agree'.tr, style: AppStyle.title), ], ), const Spacer(), Align( alignment: Alignment.bottomCenter, child: SizedBox( width: double.infinity, child: ElevatedButton( onPressed: controller.isAgreeTerms ? () => controller.saveAgreementTerms() : null, child: Text('Continue'.tr), ), ), ), ], ), ); } Widget _buildLocationPermissionDialog(LoginController controller) { return Padding( padding: const EdgeInsets.all(32), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.location_on, size: 60, color: AppColor.primaryColor), const SizedBox(height: 20), Text( 'Enable Location Access'.tr, style: AppStyle.headTitle2, textAlign: TextAlign.center, ), const SizedBox(height: 10), Text( 'We need your location to find nearby drivers for pickups and drop-offs.' .tr, textAlign: TextAlign.center, style: AppStyle.title, ), const SizedBox(height: 20), ElevatedButton( onPressed: () async => await controller.getLocationPermission(), child: Text('Next'.tr), // child: Text('Allow Location Access'.tr), ), // TextButton( // onPressed: () => openAppSettings(), // child: Text('Open Settings'.tr), // ), ], ), ); } Widget _buildCountryPicker() { return CountryPicker(); } }