Files
tripz/lib/views/auth/login_page.dart
Hamza-Ayed 13a7c3db81 25-1/31/1
2025-01-31 14:57:17 +03:00

333 lines
11 KiB
Dart

import 'dart:io';
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());
return GetBuilder<LoginController>(
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,
encryptionHelper.encryptData(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),
),
),
],
),
),
);
}
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<LoginController>(
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>[
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('Allow Location Access'.tr),
),
// TextButton(
// onPressed: () => openAppSettings(),
// child: Text('Open Settings'.tr),
// ),
],
),
);
}
Widget _buildCountryPicker() {
return CountryPicker();
}
}