elCaribe app - customization and branding

This commit is contained in:
2025-12-12 19:09:42 -04:00
parent 9e5d0d8ebf
commit ba7deac9f3
402 changed files with 31833 additions and 0 deletions

View File

@@ -0,0 +1,137 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:news/ui/screens/auth/Widgets/svgPictureWidget.dart';
import 'package:news/ui/widgets/customBackBtn.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
import 'package:news/utils/internetConnectivity.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:news/ui/widgets/SnackBarWidget.dart';
import 'package:news/ui/screens/auth/Widgets/setEmail.dart';
import 'package:news/ui/screens/auth/Widgets/setLoginAndSignUpBtn.dart';
class ForgotPassword extends StatefulWidget {
const ForgotPassword({super.key});
@override
FrgtPswdState createState() => FrgtPswdState();
}
class FrgtPswdState extends State<ForgotPassword> {
TextEditingController emailC = TextEditingController();
final FirebaseAuth _auth = FirebaseAuth.instance;
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
int durationInMiliSeconds = 2500;
@override
void dispose() {
emailC.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(body: screenContent());
}
Widget backBtn() {
return const Padding(padding: EdgeInsets.only(top: 20.0, left: 10.0), child: CustomBackButton());
}
Widget forgotIcon() {
return Container(
padding: const EdgeInsets.all(20.0),
child: Center(
child: SvgPictureWidget(
assetName: "forgot",
width: 120,
height: 120,
fit: BoxFit.fill,
assetColor: ColorFilter.mode(UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.7), BlendMode.srcIn),
),
),
);
}
Widget forgotPassLbl() {
return Center(
child: CustomTextLabel(
text: 'forgotPassLbl',
maxLines: 3,
textStyle: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600, fontSize: 22, color: UiUtils.getColorScheme(context).primaryContainer),
),
);
}
Widget forgotPassHead() {
return Padding(
padding: const EdgeInsetsDirectional.only(top: 20.0),
child: CustomTextLabel(
text: 'frgtPassHead',
maxLines: 3,
textStyle: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w500, fontSize: 16, color: UiUtils.getColorScheme(context).primaryContainer),
));
}
Widget forgotPassSubHead() {
return Padding(
padding: const EdgeInsetsDirectional.only(top: 30.0),
child: CustomTextLabel(
text: 'forgotPassSub',
maxLines: 3,
textStyle: Theme.of(context).textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.normal, fontSize: 14.0, color: UiUtils.getColorScheme(context).primaryContainer),
));
}
Widget emailTextCtrl() {
return SetEmail(emailC: emailC, email: emailC.text, topPad: 25);
}
Widget submitBtn() {
return SetLoginAndSignUpBtn(
onTap: () async {
FocusScope.of(context).unfocus(); //dismiss keyboard
if (await InternetConnectivity.isNetworkAvailable()) {
Future.delayed(const Duration(seconds: 1)).then((_) async {
if (emailC.text.isEmpty) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'emailValid'), context, durationInMiliSeconds: durationInMiliSeconds);
} else {
try {
await _auth.sendPasswordResetEmail(email: emailC.text.trim());
final form = _formkey.currentState;
form!.save();
if (form.validate()) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'passReset'), context, durationInMiliSeconds: durationInMiliSeconds);
Navigator.pop(context);
}
} on FirebaseAuthException catch (e) {
if (e.code == "user-not-found") {
showSnackBar(UiUtils.getTranslatedLabel(context, 'userNotFound'), context, durationInMiliSeconds: durationInMiliSeconds);
} else {
showSnackBar(e.message!, context, durationInMiliSeconds: durationInMiliSeconds);
}
}
}
});
} else {
showSnackBar(UiUtils.getTranslatedLabel(context, 'internetmsg'), context, durationInMiliSeconds: durationInMiliSeconds);
}
},
text: 'submitBtn',
topPad: 30);
}
Widget screenContent() {
return Container(
padding: const EdgeInsetsDirectional.all(20.0),
child: SingleChildScrollView(
child: Form(
key: _formkey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: [backBtn(), const SizedBox(height: 50), forgotIcon(), forgotPassLbl(), forgotPassHead(), forgotPassSubHead(), emailTextCtrl(), submitBtn()],
),
)));
}
}

View File

@@ -0,0 +1,263 @@
import 'package:country_code_picker/country_code_picker.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:news/cubits/appSystemSettingCubit.dart';
import 'package:news/ui/styles/colors.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
import 'package:news/ui/widgets/SnackBarWidget.dart';
import 'package:news/app/routes.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:news/utils/internetConnectivity.dart';
import 'package:news/utils/validators.dart';
class RequestOtp extends StatefulWidget {
const RequestOtp({super.key});
@override
RequestOtpState createState() => RequestOtpState();
}
class RequestOtpState extends State<RequestOtp> {
TextEditingController phoneC = TextEditingController();
String? phone, conCode;
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
bool isLoading = false;
CountryCode? code;
String? verificationId;
String errorMessage = '';
final FirebaseAuth _auth = FirebaseAuth.instance;
int forceResendingToken = 0;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
SafeArea(
child: showContent(),
),
UiUtils.showCircularProgress(isLoading, Theme.of(context).primaryColor)
],
));
}
//show form content
showContent() {
return Container(
padding: const EdgeInsetsDirectional.all(20.0),
child: SingleChildScrollView(
child: Form(
key: _formkey,
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
Align(
//backButton
alignment: Alignment.topLeft,
child: InkWell(onTap: () => Navigator.of(context).pop(), splashColor: Colors.transparent, child: const Icon(Icons.keyboard_backspace_rounded))),
const SizedBox(height: 50),
otpVerifySet(),
enterMblSet(),
receiveDigitSet(),
setCodeWithMono(),
reqOtpBtn()
]))),
);
}
otpVerifySet() {
return CustomTextLabel(
text: 'loginLbl',
textStyle: Theme.of(context).textTheme.headlineSmall?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer, fontWeight: FontWeight.w800, letterSpacing: 0.5),
textAlign: TextAlign.center);
}
enterMblSet() {
return Padding(
padding: const EdgeInsets.only(top: 35.0),
child: CustomTextLabel(
text: 'enterMblLbl',
textStyle: Theme.of(context).textTheme.bodyLarge?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer, fontWeight: FontWeight.w500),
),
);
}
receiveDigitSet() {
return Container(
padding: const EdgeInsets.only(top: 20.0),
child: CustomTextLabel(
text: 'receiveDigitLbl',
textStyle: Theme.of(context).textTheme.bodyMedium?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.8), fontSize: 14),
textAlign: TextAlign.left),
);
}
setCodeWithMono() {
return Padding(
padding: const EdgeInsets.only(top: 30.0),
child: Container(
decoration: BoxDecoration(borderRadius: BorderRadius.circular(10.0), color: Theme.of(context).colorScheme.surface),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[setCountryCode(), setMono()],
)));
}
setCountryCode() {
double width = MediaQuery.of(context).size.width;
double height = MediaQuery.of(context).size.height;
return SizedBox(
height: 45,
child: CountryCodePicker(
boxDecoration: BoxDecoration(color: Theme.of(context).colorScheme.surface),
searchDecoration: InputDecoration(hintStyle: TextStyle(color: UiUtils.getColorScheme(context).primaryContainer), fillColor: UiUtils.getColorScheme(context).primaryContainer),
initialSelection: context.read<AppConfigurationCubit>().getCountryCode(),
dialogSize: Size(width - 50, height - 50),
builder: (CountryCode? code) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsetsDirectional.only(top: 10.0, bottom: 10.0, start: 20.0, end: 4.0),
child:
ClipRRect(borderRadius: BorderRadius.circular(3.0), child: Image.asset(code!.flagUri.toString(), package: 'country_code_picker', height: 30, width: 30, fit: BoxFit.cover))),
Container(
//CountryCode
width: 55.0,
height: 55.0,
alignment: Alignment.center,
child: CustomTextLabel(
text: code.dialCode.toString(),
textStyle: Theme.of(context).textTheme.titleMedium?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.7)),
overflow: TextOverflow.ellipsis,
softWrap: true)),
],
);
},
onChanged: (CountryCode countryCode) {
conCode = countryCode.dialCode;
},
onInit: (CountryCode? code) {
conCode = code?.dialCode;
}));
}
setMono() {
return Expanded(
child: Padding(
padding: const EdgeInsetsDirectional.only(top: 5.0, bottom: 15.0),
child: Container(
height: 40,
width: MediaQuery.of(context).size.width * 0.57,
alignment: Alignment.center,
child: TextFormField(
keyboardType: const TextInputType.numberWithOptions(signed: true, decimal: true),
controller: phoneC,
style: Theme.of(context).textTheme.titleMedium?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.7)),
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
validator: (val) => Validators.mobValidation(val!, context),
onSaved: (String? value) => phone = value,
decoration: InputDecoration(
hintText: UiUtils.getTranslatedLabel(context, 'enterMblLbl'),
hintStyle: Theme.of(context).textTheme.titleSmall?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.5)),
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
),
)),
),
);
}
Future<void> verifyPhone(BuildContext context) async {
try {
await _auth.verifyPhoneNumber(
phoneNumber: (conCode!.contains("+")) ? "$conCode${phoneC.text.trim()}" : "+$conCode${phoneC.text.trim()}",
verificationCompleted: (AuthCredential phoneAuthCredential) {
showSnackBar(phoneAuthCredential.toString(), context);
},
verificationFailed: (FirebaseAuthException exception) {
setState(() => isLoading = false);
if (exception.code == "invalid-phone-number") {
//invalidPhoneNumber
showSnackBar(UiUtils.getTranslatedLabel(context, 'invalidPhoneNumber'), context);
} else {
showSnackBar('${exception.message}', context);
}
},
forceResendingToken: forceResendingToken,
codeAutoRetrievalTimeout: (String verId) => verificationId = verId,
codeSent: processCodeSent(),
//smsOTPSent
timeout: const Duration(seconds: 60));
} on FirebaseAuthException catch (authError) {
setState(() => isLoading = false);
showSnackBar(authError.message!, context);
} on FirebaseException catch (e) {
setState(() => isLoading = false);
showSnackBar(e.toString(), context);
} catch (e) {
setState(() => isLoading = false);
showSnackBar(e.toString(), context);
}
}
processCodeSent() {
try {
smsOTPSent(String? verId, [int? forceCodeResend]) async {
if (forceCodeResend != null) forceResendingToken = forceCodeResend;
verificationId = verId;
setState(() => isLoading = false);
showSnackBar(UiUtils.getTranslatedLabel(context, 'codeSent'), context);
await Navigator.of(context).pushNamed(Routes.verifyOtp, arguments: {"verifyId": verificationId, "countryCode": conCode, "mono": phoneC.text.trim()});
}
return smsOTPSent;
} catch (e) {}
}
reqOtpBtn() {
return Container(
alignment: Alignment.center,
padding: const EdgeInsets.only(top: 60.0),
child: InkWell(
child: Container(
height: 45.0,
width: MediaQuery.of(context).size.width * 0.9,
alignment: Alignment.center,
decoration: BoxDecoration(color: Theme.of(context).primaryColor, borderRadius: BorderRadius.circular(7.0)),
child:
CustomTextLabel(text: 'reqOtpLbl', textStyle: Theme.of(context).textTheme.titleLarge?.copyWith(color: secondaryColor, fontWeight: FontWeight.w600, letterSpacing: 0.5, fontSize: 16))),
onTap: () async {
FocusScope.of(context).unfocus(); //dismiss keyboard
if (validateAndSave()) {
if (await InternetConnectivity.isNetworkAvailable()) {
setState(() => isLoading = true);
verifyPhone(context);
} else {
showSnackBar(UiUtils.getTranslatedLabel(context, 'internetmsg'), context);
}
}
},
),
);
}
//check validation of form data
bool validateAndSave() {
final form = _formkey.currentState;
form!.save();
return (form.validate()) ? true : false;
}
}

View File

@@ -0,0 +1,268 @@
import 'dart:async';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:news/cubits/Auth/socialSignUpCubit.dart';
import 'package:news/ui/styles/colors.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:sms_autofill/sms_autofill.dart';
import 'package:news/cubits/Auth/authCubit.dart';
import 'package:news/utils/internetConnectivity.dart';
import 'package:news/ui/widgets/SnackBarWidget.dart';
class VerifyOtp extends StatefulWidget {
String? verifyId, countryCode, mono;
VerifyOtp({super.key, this.verifyId, this.countryCode, this.mono});
@override
VerifyOtpState createState() => VerifyOtpState();
static Route route(RouteSettings routeSettings) {
final arguments = routeSettings.arguments as Map<String, dynamic>;
return CupertinoPageRoute(
builder: (_) => VerifyOtp(
verifyId: arguments['verifyId'],
countryCode: arguments['countryCode'],
mono: arguments['mono'],
));
}
}
class VerifyOtpState extends State<VerifyOtp> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
String? otp;
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
int secondsRemaining = 60;
bool enableResend = false;
Timer? timer;
final FirebaseAuth _auth = FirebaseAuth.instance;
String? verifId;
@override
void initState() {
super.initState();
timer = Timer.periodic(const Duration(seconds: 1), (_) {
if (secondsRemaining != 0) {
setState(() {
secondsRemaining--;
});
} else {
setState(() {
enableResend = true;
});
}
});
}
@override
void dispose() {
timer?.cancel();
super.dispose();
}
void _resendCode() {
otp = "";
_onVerifyCode();
setState(() {
secondsRemaining = 60;
enableResend = false;
});
}
void _onVerifyCode() async {
verificationCompleted(AuthCredential phoneAuthCredential) {
_auth.signInWithCredential(phoneAuthCredential).then((UserCredential value) {
if (value.user != null) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'otpMsg'), context);
} else {
showSnackBar(UiUtils.getTranslatedLabel(context, 'otpError'), context);
}
}).catchError((error) {
showSnackBar(error.toString(), context);
});
}
verificationFailed(FirebaseAuthException authException) {
if (authException.code == 'invalidVerificationCode') {
showSnackBar(UiUtils.getTranslatedLabel(context, 'invalidVerificationCode'), context);
} else {
showSnackBar(authException.message.toString(), context);
}
}
codeSent(String? verificationId, [int? forceResendingToken]) async {
verifId = verificationId;
if (mounted) {
setState(() {
verifId = verificationId;
});
}
}
codeAutoRetrievalTimeout(String verificationId) {
verifId = verificationId;
setState(() {
verifId = verificationId;
});
showSnackBar(UiUtils.getTranslatedLabel(context, 'otpTimeoutLbl'), context);
}
await _auth.verifyPhoneNumber(
phoneNumber: "+${widget.countryCode}${widget.mono}",
timeout: const Duration(seconds: 60),
verificationCompleted: verificationCompleted,
verificationFailed: verificationFailed,
codeSent: codeSent,
codeAutoRetrievalTimeout: codeAutoRetrievalTimeout);
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
body: BlocConsumer<SocialSignUpCubit, SocialSignUpState>(
bloc: context.read<SocialSignUpCubit>(),
listener: (context, state) async {
if (state is SocialSignUpFailure) {
showSnackBar(state.errorMessage, context);
}
},
builder: (context, state) {
return Stack(
children: <Widget>[SafeArea(child: showContent()), if (state is SocialSignUpProgress) Center(child: UiUtils.showCircularProgress(true, Theme.of(context).primaryColor))],
);
}));
}
//show form content
showContent() {
return Container(
padding: const EdgeInsetsDirectional.all(20.0),
child: SingleChildScrollView(
child: Form(
key: _formkey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[const SizedBox(height: 50), otpVerifySet(), otpSentSet(), mblSet(), otpFillSet(), buildTimer(), submitBtn(), if (secondsRemaining == 0) showResendOTPButton()]))),
);
}
otpVerifySet() {
return CustomTextLabel(
text: 'otpVerifyLbl',
textStyle: Theme.of(context).textTheme.headlineSmall?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer, fontWeight: FontWeight.w800, letterSpacing: 0.5),
textAlign: TextAlign.left);
}
otpSentSet() {
return Padding(
padding: const EdgeInsets.only(top: 25.0),
child: CustomTextLabel(text: 'otpSentLbl', textStyle: Theme.of(context).textTheme.titleMedium?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer, fontWeight: FontWeight.w500)),
);
}
mblSet() {
return Padding(
padding: const EdgeInsets.only(top: 10.0),
child: CustomTextLabel(
text: "${widget.countryCode} ${widget.mono}", textStyle: Theme.of(context).textTheme.titleSmall?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.8))),
);
}
otpFillSet() {
return Container(
alignment: Alignment.center,
padding: const EdgeInsets.only(top: 30.0),
child: PinFieldAutoFill(
decoration: BoxLooseDecoration(
strokeColorBuilder: PinListenColorBuilder(Theme.of(context).colorScheme.surface, Theme.of(context).colorScheme.surface),
bgColorBuilder: PinListenColorBuilder(Theme.of(context).colorScheme.surface, Theme.of(context).colorScheme.surface),
gapSpace: 7.0),
currentCode: otp,
codeLength: 6,
keyboardType: const TextInputType.numberWithOptions(signed: true, decimal: true),
onCodeChanged: (String? code) {
otp = code;
},
onCodeSubmitted: (String code) {
otp = code;
}));
}
showResendOTPButton() {
return Container(
padding: const EdgeInsets.only(top: 20.0),
alignment: Alignment.center,
child: Text.rich(
TextSpan(
text: "${UiUtils.getTranslatedLabel(context, 'didntGetCode')} ",
style: TextStyle(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.8), fontWeight: FontWeight.bold, letterSpacing: 0.5),
children: [
TextSpan(
text: UiUtils.getTranslatedLabel(context, 'resendLbl'),
style: TextStyle(color: UiUtils.getColorScheme(context).secondaryContainer, fontWeight: FontWeight.bold, letterSpacing: 0.5, decoration: TextDecoration.underline),
recognizer: TapGestureRecognizer()..onTap = enableResend ? _resendCode : null,
),
],
),
textAlign: TextAlign.center,
));
}
buildTimer() {
return Container(
alignment: AlignmentDirectional.bottomStart,
padding: const EdgeInsets.only(top: 30.0),
child: secondsRemaining != 0
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
CustomTextLabel(text: 'resendCodeLbl', textStyle: Theme.of(context).textTheme.titleSmall?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.8))),
CustomTextLabel(text: ' 00:${secondsRemaining.toString().padLeft(2, '0')}', textStyle: Theme.of(context).textTheme.titleSmall?.copyWith(color: Theme.of(context).primaryColor)),
],
)
: SizedBox.shrink(),
);
}
submitBtn() {
return Container(
padding: const EdgeInsets.only(top: 45.0),
child: InkWell(
child: Container(
height: 45.0,
width: MediaQuery.of(context).size.width * 0.9,
alignment: Alignment.center,
decoration: BoxDecoration(color: Theme.of(context).primaryColor, borderRadius: BorderRadius.circular(7.0)),
child:
CustomTextLabel(text: 'submitBtn', textStyle: Theme.of(context).textTheme.titleLarge?.copyWith(color: secondaryColor, fontWeight: FontWeight.w600, fontSize: 16, letterSpacing: 0.6)),
),
onTap: () async {
if (otp!.trim().isEmpty) return showSnackBar(UiUtils.getTranslatedLabel(context, 'enterOtpTxt'), context);
FocusScope.of(context).unfocus(); //dismiss keyboard
if (validateAndSave()) {
if (await InternetConnectivity.isNetworkAvailable()) {
context.read<SocialSignUpCubit>().socialSignUpUser(authProvider: AuthProviders.mobile, verifiedId: widget.verifyId, otp: otp, context: context);
} else {
showSnackBar(UiUtils.getTranslatedLabel(context, 'internetmsg'), context);
}
}
}));
}
//check validation of form data
bool validateAndSave() {
final form = _formkey.currentState;
form!.save();
if (form.validate()) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,35 @@
import 'package:flutter/material.dart';
import 'package:news/ui/screens/auth/Widgets/svgPictureWidget.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
import 'package:news/utils/uiUtils.dart';
class BottomCommButton extends StatelessWidget {
final Function onTap;
final String img;
final Color? btnColor;
final String btnCaption;
const BottomCommButton({super.key, required this.onTap, required this.img, this.btnColor, required this.btnCaption});
@override
Widget build(BuildContext context) {
String textLbl = "${UiUtils.getTranslatedLabel(context, 'continueWith')} ${UiUtils.getTranslatedLabel(context, btnCaption)}";
return InkWell(
splashColor: Colors.transparent,
child: Container(
height: 45.0,
width: MediaQuery.of(context).size.width * 0.9,
alignment: Alignment.center,
decoration: BoxDecoration(color: UiUtils.getColorScheme(context).surface, borderRadius: BorderRadius.circular(7.0)),
padding: const EdgeInsets.all(9.0),
margin: EdgeInsets.symmetric(vertical: 10),
child: Wrap(
spacing: 15,
children: [
SvgPictureWidget(assetName: img, width: 20, height: 20, fit: BoxFit.contain, assetColor: btnColor != null ? ColorFilter.mode(btnColor!, BlendMode.srcIn) : null),
CustomTextLabel(text: textLbl, textStyle: TextStyle(fontSize: 14, fontWeight: FontWeight.w600))
],
)),
onTap: () => onTap());
}
}

View File

@@ -0,0 +1,6 @@
import 'package:flutter/cupertino.dart';
fieldFocusChange(BuildContext context, FocusNode currentFocus, FocusNode nextFocus) {
currentFocus.unfocus();
FocusScope.of(context).requestFocus(nextFocus);
}

View File

@@ -0,0 +1,77 @@
import 'package:flutter/material.dart';
import 'package:news/utils/uiUtils.dart';
class SetConfirmPass extends StatefulWidget {
final FocusNode currFocus;
final TextEditingController confPassC;
late String confPass;
late String pass;
SetConfirmPass({super.key, required this.currFocus, required this.confPassC, required this.confPass, required this.pass});
@override
State<StatefulWidget> createState() {
return _SetConfPassState();
}
}
class _SetConfPassState extends State<SetConfirmPass> {
bool isObscure = true;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(top: 20),
child: TextFormField(
focusNode: widget.currFocus,
textInputAction: TextInputAction.done,
controller: widget.confPassC,
obscureText: isObscure,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer,
),
validator: (value) {
if (value!.isEmpty) {
return UiUtils.getTranslatedLabel(context, 'confPassRequired');
}
if (value.trim() != widget.pass.trim()) {
return UiUtils.getTranslatedLabel(context, 'confPassNotMatch');
} else {
return null;
}
},
onChanged: (String value) {
widget.confPass = value;
},
decoration: InputDecoration(
hintText: UiUtils.getTranslatedLabel(context, 'confpassLbl'),
hintStyle: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.5),
),
suffixIcon: Padding(
padding: const EdgeInsetsDirectional.only(end: 12.0),
child: IconButton(
icon: isObscure
? Icon(Icons.visibility_rounded, size: 20, color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.6))
: Icon(Icons.visibility_off_rounded, size: 20, color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.6)),
splashColor: Colors.transparent,
onPressed: () {
setState(() => isObscure = !isObscure);
},
)),
filled: true,
fillColor: Theme.of(context).colorScheme.surface,
contentPadding: const EdgeInsets.symmetric(horizontal: 25, vertical: 17),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: UiUtils.getColorScheme(context).outline.withOpacity(0.7)),
borderRadius: BorderRadius.circular(10.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(10.0),
),
),
),
);
}
}

View File

@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
import 'package:news/utils/uiUtils.dart';
class SetDividerOR extends StatelessWidget {
const SetDividerOR({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Color color = UiUtils.getColorScheme(context).outline.withOpacity(0.9);
return Padding(
padding: const EdgeInsetsDirectional.only(top: 30.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(child: Divider(indent: 10, endIndent: 10, color: color)),
CustomTextLabel(
text: 'orLbl',
textStyle: Theme.of(context).textTheme.titleMedium?.merge(TextStyle(color: color, fontSize: 12.0)),
),
Expanded(child: Divider(indent: 10, endIndent: 10, color: color)),
],
));
}
}

View File

@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:news/utils/validators.dart';
import 'fieldFocusChange.dart';
class SetEmail extends StatelessWidget {
final FocusNode? currFocus;
final FocusNode? nextFocus;
final TextEditingController emailC;
late String email;
final double topPad;
SetEmail({super.key, this.currFocus, this.nextFocus, required this.emailC, required this.email, required this.topPad});
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.only(top: topPad),
child: TextFormField(
focusNode: currFocus,
textInputAction: TextInputAction.next,
controller: emailC,
style: Theme.of(context).textTheme.titleMedium?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer),
validator: (val) => Validators.emailValidation(val!, context),
onFieldSubmitted: (v) {
if (currFocus != null || nextFocus != null) fieldFocusChange(context, currFocus!, nextFocus!);
},
decoration: InputDecoration(
hintText: UiUtils.getTranslatedLabel(context, 'emailLbl'),
hintStyle: Theme.of(context).textTheme.titleMedium?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.5)),
filled: true,
fillColor: Theme.of(context).colorScheme.surface,
contentPadding: const EdgeInsets.symmetric(horizontal: 25, vertical: 17),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: UiUtils.getColorScheme(context).outline.withOpacity(0.7)),
borderRadius: BorderRadius.circular(10.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(10.0),
),
),
),
);
}
}

View File

@@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
import 'package:news/ui/widgets/customTextBtn.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:news/app/routes.dart';
setForgotPass(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(top: 5.0),
child: Align(
alignment: Alignment.topRight,
child: CustomTextButton(
onTap: () => Navigator.of(context).pushNamed(Routes.forgotPass),
buttonStyle: ButtonStyle(overlayColor: WidgetStateProperty.all(Colors.transparent), foregroundColor: WidgetStateProperty.all(UiUtils.getColorScheme(context).outline.withOpacity(0.7))),
textWidget: const CustomTextLabel(text: 'forgotPassLbl'))));
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:news/ui/styles/colors.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
class SetLoginAndSignUpBtn extends StatelessWidget {
final Function onTap;
final String text;
final double topPad;
const SetLoginAndSignUpBtn({super.key, required this.onTap, required this.text, required this.topPad});
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.only(top: topPad),
child: InkWell(
splashColor: Colors.transparent,
child: Container(
height: 45.0,
width: MediaQuery.of(context).size.width * 0.9,
alignment: Alignment.center,
decoration: BoxDecoration(color: Theme.of(context).primaryColor, borderRadius: BorderRadius.circular(7.0)),
child: CustomTextLabel(
text: text,
textStyle: Theme.of(context).textTheme.titleLarge?.copyWith(color: secondaryColor, fontWeight: FontWeight.w600, fontSize: 16, letterSpacing: 0.6),
),
),
onTap: () => onTap()),
);
}
}

View File

@@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:news/utils/validators.dart';
import 'package:news/ui/screens/auth/Widgets/fieldFocusChange.dart';
class SetName extends StatelessWidget {
final FocusNode currFocus;
final FocusNode nextFocus;
final TextEditingController nameC;
late String name;
SetName({super.key, required this.currFocus, required this.nextFocus, required this.nameC, required this.name});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(top: 40),
child: TextFormField(
focusNode: currFocus,
textInputAction: TextInputAction.next,
controller: nameC,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer,
),
validator: (val) => Validators.nameValidation(val!, context),
onFieldSubmitted: (v) {
fieldFocusChange(context, currFocus, nextFocus);
},
decoration: InputDecoration(
hintText: UiUtils.getTranslatedLabel(context, 'nameLbl'),
hintStyle: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.5),
),
filled: true,
fillColor: Theme.of(context).colorScheme.surface,
contentPadding: const EdgeInsets.symmetric(horizontal: 25, vertical: 17),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: UiUtils.getColorScheme(context).outline.withOpacity(0.7)),
borderRadius: BorderRadius.circular(10.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(10.0),
),
),
),
);
}
}

View File

@@ -0,0 +1,81 @@
import 'package:flutter/material.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:news/utils/validators.dart';
import 'fieldFocusChange.dart';
class SetPassword extends StatefulWidget {
final FocusNode currFocus;
final FocusNode? nextFocus;
final TextEditingController passC;
late String pass;
final double topPad;
final bool isLogin;
SetPassword({super.key, required this.currFocus, this.nextFocus, required this.passC, required this.pass, required this.topPad, required this.isLogin});
@override
State<StatefulWidget> createState() {
return _SetPassState();
}
}
class _SetPassState extends State<SetPassword> {
bool isObscure = true;
@override
Widget build(BuildContext context) {
return StatefulBuilder(builder: (context, StateSetter setStater) {
return Padding(
padding: EdgeInsets.only(top: widget.topPad),
child: TextFormField(
focusNode: widget.currFocus,
textInputAction: widget.isLogin ? TextInputAction.done : TextInputAction.next,
controller: widget.passC,
obscureText: isObscure,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer,
),
validator: (val) => Validators.passValidation(val!, context),
onFieldSubmitted: (v) {
if (!widget.isLogin) {
fieldFocusChange(context, widget.currFocus, widget.nextFocus!);
}
},
onChanged: (String value) {
widget.pass = value;
setStater(() {});
},
decoration: InputDecoration(
hintText: UiUtils.getTranslatedLabel(context, 'passLbl'),
hintStyle: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.5),
),
suffixIcon: Padding(
padding: const EdgeInsetsDirectional.only(end: 12.0),
child: IconButton(
icon: isObscure
? Icon(Icons.visibility_rounded, size: 20, color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.6))
: Icon(Icons.visibility_off_rounded, size: 20, color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.6)),
splashColor: Colors.transparent,
onPressed: () {
setState(() => isObscure = !isObscure);
},
)),
filled: true,
fillColor: Theme.of(context).colorScheme.surface,
contentPadding: const EdgeInsets.symmetric(horizontal: 25, vertical: 17),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: UiUtils.getColorScheme(context).outline.withOpacity(0.7)),
borderRadius: BorderRadius.circular(10.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(10.0),
),
),
),
);
});
}
}

View File

@@ -0,0 +1,40 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:news/app/routes.dart';
import 'package:news/cubits/privacyTermsCubit.dart';
import 'package:news/utils/uiUtils.dart';
setTermPolicyTxt(BuildContext context, PrivacyTermsFetchSuccess state) {
return Container(
alignment: AlignmentDirectional.bottomCenter,
padding: const EdgeInsets.only(top: 20.0),
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(children: [
TextSpan(
text: "${UiUtils.getTranslatedLabel(context, 'agreeTermPolicyLbl')}\n",
style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.7), overflow: TextOverflow.ellipsis),
),
TextSpan(
text: UiUtils.getTranslatedLabel(context, 'termLbl'),
style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: Theme.of(context).primaryColor, decoration: TextDecoration.underline, overflow: TextOverflow.ellipsis),
recognizer: TapGestureRecognizer()
..onTap = (() {
Navigator.of(context).pushNamed(Routes.privacy, arguments: {"from": "login", "title": state.termsPolicy.title, "desc": state.termsPolicy.pageContent});
}),
),
TextSpan(
text: "\t${UiUtils.getTranslatedLabel(context, 'andLbl')}\t",
style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.7), overflow: TextOverflow.ellipsis),
),
TextSpan(
text: UiUtils.getTranslatedLabel(context, 'priPolicy'),
style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: Theme.of(context).primaryColor, decoration: TextDecoration.underline, overflow: TextOverflow.ellipsis),
recognizer: TapGestureRecognizer()
..onTap = (() {
Navigator.of(context).pushNamed(Routes.privacy, arguments: {"from": "login", "title": state.privacyPolicy.title, "desc": state.privacyPolicy.pageContent});
}),
),
]),
));
}

View File

@@ -0,0 +1,18 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:news/utils/uiUtils.dart';
class SvgPictureWidget extends StatelessWidget {
String assetName;
ColorFilter? assetColor;
double? height, width;
BoxFit? fit;
SvgPictureWidget({Key? key, required this.assetName, this.assetColor, this.height, this.width, this.fit}) : super(key: key);
@override
Widget build(BuildContext context) {
return SvgPicture.asset(
placeholderBuilder: (_) => Center(child: CircularProgressIndicator()), UiUtils.getSvgImagePath(assetName), colorFilter: assetColor, height: height, width: width, fit: fit ?? BoxFit.fill);
}
}

View File

@@ -0,0 +1,455 @@
import 'dart:io';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:news/cubits/Auth/authCubit.dart';
import 'package:news/cubits/Auth/registerTokenCubit.dart';
import 'package:news/cubits/appLocalizationCubit.dart';
import 'package:news/cubits/appSystemSettingCubit.dart';
import 'package:news/cubits/privacyTermsCubit.dart';
import 'package:news/cubits/settingCubit.dart';
import 'package:news/ui/screens/auth/Widgets/bottomComBtn.dart';
import 'package:news/ui/screens/auth/Widgets/fieldFocusChange.dart';
import 'package:news/ui/screens/auth/Widgets/setConfimPass.dart';
import 'package:news/ui/screens/auth/Widgets/setDivider.dart';
import 'package:news/ui/screens/auth/Widgets/setEmail.dart';
import 'package:news/ui/screens/auth/Widgets/setForgotPass.dart';
import 'package:news/ui/screens/auth/Widgets/setLoginAndSignUpBtn.dart';
import 'package:news/ui/screens/auth/Widgets/setName.dart';
import 'package:news/ui/screens/auth/Widgets/setPassword.dart';
import 'package:news/ui/screens/auth/Widgets/setTermPolicy.dart';
import 'package:news/ui/styles/colors.dart';
import 'package:news/ui/widgets/SnackBarWidget.dart';
import 'package:news/ui/widgets/customTextBtn.dart';
import 'package:news/ui/widgets/customTextLabel.dart';
import 'package:news/utils/constant.dart';
import 'package:news/utils/internetConnectivity.dart';
import 'package:news/utils/uiUtils.dart';
import 'package:news/app/routes.dart';
import 'package:news/cubits/Auth/socialSignUpCubit.dart';
import 'package:news/utils/validators.dart';
class LoginScreen extends StatefulWidget {
final bool? isFromApp;
const LoginScreen({super.key, this.isFromApp});
@override
LoginScreenState createState() => LoginScreenState();
static Route route(RouteSettings routeSettings) {
if (routeSettings.arguments == null) {
return CupertinoPageRoute(builder: (_) => const LoginScreen());
} else {
final arguments = routeSettings.arguments as Map<String, dynamic>;
return CupertinoPageRoute(builder: (_) => LoginScreen(isFromApp: arguments['isFromApp'] ?? false));
}
}
}
class LoginScreenState extends State<LoginScreen> with TickerProviderStateMixin {
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
TabController? _tabController;
FocusNode emailFocus = FocusNode();
FocusNode passFocus = FocusNode();
FocusNode nameFocus = FocusNode();
FocusNode emailSFocus = FocusNode();
FocusNode passSFocus = FocusNode();
FocusNode confPassFocus = FocusNode();
TextEditingController? emailC, passC, sEmailC, sPassC, sNameC, sConfPassC;
String? name, email, pass, mobile, profile, confPass;
bool isPolicyAvailable = false;
bool isObscure = true; //setPassword widget
@override
void initState() {
Future.delayed(Duration.zero, () {
context.read<PrivacyTermsCubit>().getPrivacyTerms(langId: context.read<AppLocalizationCubit>().state.id);
});
_tabController = TabController(length: 2, vsync: this, initialIndex: 0);
assignAllTextController();
_tabController!.addListener(() {
FocusScope.of(context).unfocus(); //dismiss keyboard
clearLoginTextFields();
clearSignUpTextFields();
});
super.initState();
}
assignAllTextController() {
emailC = TextEditingController();
passC = TextEditingController();
sEmailC = TextEditingController();
sPassC = TextEditingController();
sNameC = TextEditingController();
sConfPassC = TextEditingController();
}
clearSignUpTextFields() {
setState(() {
sNameC!.clear();
sEmailC!.clear();
sPassC!.clear();
sConfPassC!.clear();
});
}
clearLoginTextFields() {
setState(() {
emailC!.clear();
passC!.clear();
});
}
disposeAllTextController() {
emailC!.dispose();
passC!.dispose();
sEmailC!.dispose();
sPassC!.dispose();
sNameC!.dispose();
sConfPassC!.dispose();
}
@override
void dispose() {
_tabController?.dispose();
disposeAllTextController();
super.dispose();
}
showContent() {
return BlocConsumer<SocialSignUpCubit, SocialSignUpState>(
bloc: context.read<SocialSignUpCubit>(),
listener: (context, state) async {
if (state is SocialSignUpFailure) {
showSnackBar(state.errorMessage, context);
}
if (state is SocialSignUpSuccess) {
context.read<AuthCubit>().checkAuthStatus();
if (state.authModel.status == "0") {
showSnackBar(UiUtils.getTranslatedLabel(context, 'deactiveMsg'), context);
} else {
FirebaseMessaging.instance.getToken().then((token) async {
if (token != null) {
context.read<RegisterTokenCubit>().registerToken(fcmId: token, context: context);
if (token != context.read<SettingsCubit>().getSettings().token) {
context.read<SettingsCubit>().changeFcmToken(token);
}
if (state.authModel.isFirstLogin != null && state.authModel.isFirstLogin!.isNotEmpty && state.authModel.isFirstLogin == "0" && state.authModel.type != loginApple) {
Navigator.of(context).pushNamedAndRemoveUntil(Routes.editUserProfile, (route) => false, arguments: {"from": "login"});
} else if (widget.isFromApp == true) {
Navigator.pop(context);
} else {
Navigator.pushNamedAndRemoveUntil(context, Routes.home, (route) => false);
}
}
});
}
}
},
builder: (context, state) {
return Form(
key: _formkey,
child: Stack(
children: [
Container(
padding: const EdgeInsetsDirectional.only(top: 30.0, bottom: 5.0, start: 20.0, end: 20.0),
width: MediaQuery.of(context).size.width,
child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[skipBtn(), showTabs(), showTabBarView()]),
),
if (state is SocialSignUpProgress) UiUtils.showCircularProgress(true, Theme.of(context).primaryColor),
],
));
});
}
skipBtn() {
return Align(
alignment: AlignmentDirectional.topEnd,
child: CustomTextButton(
onTap: () {
Navigator.of(context).pushReplacementNamed(Routes.home, arguments: false);
},
text: UiUtils.getTranslatedLabel(context, 'skip'),
color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.7),
));
}
showTabs() {
return Align(
alignment: Alignment.centerLeft,
child: DefaultTabController(
length: 2,
child: Container(
padding: const EdgeInsetsDirectional.only(start: 10.0),
child: TabBar(
overlayColor: WidgetStateProperty.all(Colors.transparent),
controller: _tabController,
labelStyle: Theme.of(context).textTheme.titleSmall?.copyWith(fontWeight: FontWeight.w600, letterSpacing: 0.5),
labelPadding: EdgeInsets.zero,
labelColor: backgroundColor,
unselectedLabelColor: UiUtils.getColorScheme(context).primaryContainer,
indicator: BoxDecoration(borderRadius: BorderRadius.circular(50), color: UiUtils.getColorScheme(context).secondaryContainer),
tabs: [Tab(text: UiUtils.getTranslatedLabel(context, 'signInTab')), Tab(text: UiUtils.getTranslatedLabel(context, 'signupBtn'))])),
));
}
bool validateAndSave() {
final form = _formkey.currentState;
form!.save();
if (!isPolicyAvailable) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'addTCFirst'), context);
return false;
}
return form.validate();
}
Widget setPassword({required FocusNode currFocus, FocusNode? nextFocus, required TextEditingController passC, required String pass, required double topPad, required bool isLogin}) {
return Padding(
padding: EdgeInsets.only(top: topPad),
child: TextFormField(
focusNode: currFocus,
textInputAction: isLogin ? TextInputAction.done : TextInputAction.next,
controller: passC,
obscureText: isObscure,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer,
),
validator: (val) => Validators.passValidation(val!, context),
onFieldSubmitted: (v) {
if (!isLogin) {
fieldFocusChange(context, currFocus, nextFocus!);
}
},
onChanged: (String value) {
pass = value;
setState(() {});
},
decoration: InputDecoration(
hintText: UiUtils.getTranslatedLabel(context, 'passLbl'),
hintStyle: Theme.of(context).textTheme.titleMedium?.copyWith(
color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.5),
),
suffixIcon: Padding(
padding: const EdgeInsetsDirectional.only(end: 12.0),
child: IconButton(
icon: isObscure
? Icon(Icons.visibility_rounded, size: 20, color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.6))
: Icon(Icons.visibility_off_rounded, size: 20, color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.6)),
splashColor: Colors.transparent,
onPressed: () {
setState(() => isObscure = !isObscure);
},
)),
filled: true,
fillColor: Theme.of(context).colorScheme.surface,
contentPadding: const EdgeInsets.symmetric(horizontal: 25, vertical: 17),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: UiUtils.getColorScheme(context).outline.withOpacity(0.7)),
borderRadius: BorderRadius.circular(10.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(10.0),
),
),
),
);
}
showTabBarView() {
return Expanded(
child: Container(
alignment: Alignment.center,
height: MediaQuery.of(context).size.height * 1.0,
child: TabBarView(
controller: _tabController,
dragStartBehavior: DragStartBehavior.start,
children: [
//Login
SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5.0),
child: Column(children: [
loginTxt(),
SetEmail(currFocus: emailFocus, nextFocus: passFocus, emailC: emailC!, email: email ?? '', topPad: 20),
SetPassword(currFocus: passFocus, passC: passC!, pass: pass ?? '', topPad: 20, isLogin: true),
setForgotPass(context),
SetLoginAndSignUpBtn(
onTap: () async {
FocusScope.of(context).unfocus(); //dismiss keyboard
if (validateAndSave()) {
if (await InternetConnectivity.isNetworkAvailable()) {
context.read<SocialSignUpCubit>().socialSignUpUser(email: emailC!.text.trim(), password: passC!.text, authProvider: AuthProviders.email, context: context);
} else {
showSnackBar(UiUtils.getTranslatedLabel(context, 'internetmsg'), context);
}
}
},
text: 'loginTxt',
topPad: 20),
SetDividerOR(),
bottomBtn(),
BlocConsumer<PrivacyTermsCubit, PrivacyTermsState>(listener: (context, state) {
if (state is PrivacyTermsFetchSuccess) {
isPolicyAvailable = true;
}
if (state is PrivacyTermsFetchFailure) {
isPolicyAvailable = false;
}
}, builder: (context, state) {
return (state is PrivacyTermsFetchSuccess) ? setTermPolicyTxt(context, state) : const SizedBox.shrink();
})
]),
)),
//SignUp
SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5.0),
child: Column(
children: [
signUpTxt(),
SetName(currFocus: nameFocus, nextFocus: emailSFocus, nameC: sNameC!, name: sNameC!.text),
SetEmail(currFocus: emailSFocus, nextFocus: passSFocus, emailC: sEmailC!, email: sEmailC!.text, topPad: 20),
setPassword(currFocus: passSFocus, nextFocus: confPassFocus, passC: sPassC!, pass: sPassC!.text, topPad: 20, isLogin: false),
SetConfirmPass(currFocus: confPassFocus, confPassC: sConfPassC!, confPass: sConfPassC!.text, pass: sPassC!.text),
SetLoginAndSignUpBtn(
onTap: () async {
FocusScope.of(context).unfocus(); //dismiss keyboard
final form = _formkey.currentState;
if (form!.validate()) {
form.save();
if (await InternetConnectivity.isNetworkAvailable()) {
registerWithEmailPassword(sEmailC!.text.trim(), sPassC!.text.trim());
} else {
showSnackBar(UiUtils.getTranslatedLabel(context, 'internetmsg'), context);
}
}
},
text: 'signupBtn',
topPad: 25)
],
),
))
],
)),
);
}
registerWithEmailPassword(String email, String password) async {
try {
final credential = await FirebaseAuth.instance.createUserWithEmailAndPassword(email: email, password: password);
User? user = credential.user;
user!.updateDisplayName(sNameC!.text.trim()).then((value) => debugPrint("updated name is - ${user.displayName}"));
user.reload();
user.sendEmailVerification().then((value) => showSnackBar('${UiUtils.getTranslatedLabel(context, 'verifSentMail')} $email', context));
clearSignUpTextFields();
_tabController!.animateTo(0);
FocusScope.of(context).requestFocus(emailFocus);
} on FirebaseAuthException catch (e) {
if (e.code == 'weakPassword') {
showSnackBar(UiUtils.getTranslatedLabel(context, 'weakPassword'), context);
}
if (e.code == 'email-already-in-use') {
showSnackBar(UiUtils.getTranslatedLabel(context, 'emailAlreadyInUse'), context);
}
} catch (e) {}
}
loginTxt() {
return Align(
alignment: Alignment.centerLeft,
child: Padding(
padding: const EdgeInsetsDirectional.only(top: 20.0, start: 10.0),
child: CustomTextLabel(
text: 'loginDescr',
textStyle: Theme.of(context).textTheme.headlineSmall?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer, fontWeight: FontWeight.w800, letterSpacing: 0.5),
textAlign: TextAlign.left,
),
));
}
signUpTxt() {
return Align(
alignment: Alignment.centerLeft,
child: Padding(
padding: const EdgeInsetsDirectional.only(top: 35.0, start: 10.0),
child: CustomTextLabel(
text: 'signupDescr',
textStyle: Theme.of(context).textTheme.headlineSmall?.copyWith(color: UiUtils.getColorScheme(context).primaryContainer, fontWeight: FontWeight.w800, letterSpacing: 0.5),
textAlign: TextAlign.left,
),
));
}
bottomBtn() {
return Padding(
padding: const EdgeInsets.only(top: 20.0),
child: Column(
mainAxisAlignment: (fblogInEnabled) ? MainAxisAlignment.spaceBetween : MainAxisAlignment.spaceAround,
children: [
BottomCommButton(
btnCaption: 'google',
onTap: () {
if (!isPolicyAvailable) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'addTCFirst'), context);
} else {
context.read<SocialSignUpCubit>().socialSignUpUser(authProvider: AuthProviders.gmail, context: context);
}
},
img: 'google_button'),
if (fblogInEnabled)
BottomCommButton(
onTap: () {
if (!isPolicyAvailable) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'addTCFirst'), context);
} else {
context.read<SocialSignUpCubit>().socialSignUpUser(authProvider: AuthProviders.fb, context: context);
}
},
img: 'facebook_button',
btnCaption: 'fb'),
if (Platform.isIOS)
BottomCommButton(
onTap: () {
if (!isPolicyAvailable) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'addTCFirst'), context);
} else {
context.read<SocialSignUpCubit>().socialSignUpUser(authProvider: AuthProviders.apple, context: context);
}
},
img: 'apple_logo',
btnCaption: 'apple',
btnColor: UiUtils.getColorScheme(context).primaryContainer),
if (context.read<AppConfigurationCubit>().getMobileLoginMode() != "" && context.read<AppConfigurationCubit>().getMobileLoginMode() != "0")
BottomCommButton(
onTap: () {
if (!isPolicyAvailable) {
showSnackBar(UiUtils.getTranslatedLabel(context, 'addTCFirst'), context);
} else {
Navigator.of(context).pushNamed(Routes.requestOtp);
}
},
img: 'phone_button',
btnCaption: 'mobileLbl',
btnColor: UiUtils.getColorScheme(context).primaryContainer)
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: showContent(),
);
}
}