diff --git a/lib/core/config/env.dart b/lib/core/config/env.dart index 7632d53..688a46f 100644 --- a/lib/core/config/env.dart +++ b/lib/core/config/env.dart @@ -1,5 +1,5 @@ class Env { static const String envName = String.fromEnvironment('ENV', defaultValue: 'dev'); - static const String apiUrl = String.fromEnvironment('API_URL'); + static const String apiUrl = String.fromEnvironment('https://venbait.in/nhance/partner/dev/'); static const String baseUrl = String.fromEnvironment('BASE_URL'); } diff --git a/lib/core/services/api_service.dart b/lib/core/services/api_service.dart index ba6ef37..e07599d 100644 --- a/lib/core/services/api_service.dart +++ b/lib/core/services/api_service.dart @@ -8,7 +8,13 @@ import 'dart:convert'; class ApiService { final BuildContext context; - + Future _clearLocalStorageAndRedirect() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.clear(); + // Assuming you have access to the context + ToastHelper.showErrorToast(context, 'Session Out'); + Navigator.pushNamed(context, 'login'); + } Future> _makeGetRequest( Uri url, Map headers) async { diff --git a/lib/data/utils/toastNotification.dart b/lib/data/utils/toastNotification.dart new file mode 100644 index 0000000..8221dd8 --- /dev/null +++ b/lib/data/utils/toastNotification.dart @@ -0,0 +1,223 @@ +import 'package:flutter/material.dart'; +// import 'package:fluttertoast/fluttertoast.dart'; +import 'package:toastification/toastification.dart'; + +class ToastHelper { + static void showSuccessToast(BuildContext context, String message) { + toastification.show( + context: context, + type: ToastificationType.success, + style: ToastificationStyle.flatColored, + autoCloseDuration: const Duration(seconds: 2), + title: Text(message), + // you can also use RichText widget for title and description parameters + // description: RichText( + // text: const TextSpan(text: 'This is a sample toast message. ')), + alignment: Alignment.topRight, + direction: TextDirection.ltr, + animationDuration: const Duration(milliseconds: 100), + animationBuilder: (context, animation, alignment, child) { + return FadeTransition( + opacity: animation, + child: child, + ); + }, + icon: const Icon(Icons.check), + primaryColor: Colors.green, + backgroundColor: Colors.white, + foregroundColor: Colors.black, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), + margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 16, + offset: Offset(0, 16), + spreadRadius: 0, + ) + ], + showProgressBar: true, + closeButtonShowType: CloseButtonShowType.onHover, + closeOnClick: false, + pauseOnHover: true, + dragToClose: true, + applyBlurEffect: true, + callbacks: ToastificationCallbacks( + onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), + onCloseButtonTap: (toastItem) => + print('Toast ${toastItem.id} close button tapped'), + onAutoCompleteCompleted: (toastItem) => + print('Toast ${toastItem.id} auto complete completed'), + onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), + ), + ); + } + + static void showWarningToast(BuildContext context, String message) { + toastification.show( + context: context, + type: ToastificationType.warning, + style: ToastificationStyle.flatColored, + autoCloseDuration: const Duration(seconds: 2), + title: Text(message), + // you can also use RichText widget for title and description parameters + // description: RichText( + // text: const TextSpan(text: 'This is a sample toast message. ')), + alignment: Alignment.topRight, + direction: TextDirection.ltr, + animationDuration: const Duration(milliseconds: 100), + animationBuilder: (context, animation, alignment, child) { + return FadeTransition( + opacity: animation, + child: child, + ); + }, + icon: const Icon(Icons.warning), + primaryColor: Colors.amberAccent, + backgroundColor: Colors.white, + foregroundColor: Colors.black, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), + margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 16, + offset: Offset(0, 16), + spreadRadius: 0, + ) + ], + showProgressBar: true, + closeButtonShowType: CloseButtonShowType.onHover, + closeOnClick: false, + pauseOnHover: true, + dragToClose: true, + applyBlurEffect: true, + callbacks: ToastificationCallbacks( + onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), + onCloseButtonTap: (toastItem) => + print('Toast ${toastItem.id} close button tapped'), + onAutoCompleteCompleted: (toastItem) => + print('Toast ${toastItem.id} auto complete completed'), + onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), + ), + ); + } + + static void showErrorToast(BuildContext context, String message) { + toastification.show( + context: context, + type: ToastificationType.error, + style: ToastificationStyle.flatColored, + autoCloseDuration: const Duration(seconds: 2), + title: Text(message), + // you can also use RichText widget for title and description parameters + // description: RichText( + // text: const TextSpan(text: 'This is a sample toast message. ')), + alignment: Alignment.topRight, + direction: TextDirection.ltr, + animationDuration: const Duration(milliseconds: 100), + animationBuilder: (context, animation, alignment, child) { + return FadeTransition( + opacity: animation, + child: child, + ); + }, + icon: const Icon(Icons.error), + primaryColor: Colors.redAccent, + backgroundColor: Colors.white, + foregroundColor: Colors.black, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), + margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 16, + offset: Offset(0, 16), + spreadRadius: 0, + ) + ], + showProgressBar: true, + closeButtonShowType: CloseButtonShowType.onHover, + closeOnClick: false, + pauseOnHover: true, + dragToClose: true, + applyBlurEffect: true, + callbacks: ToastificationCallbacks( + onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), + onCloseButtonTap: (toastItem) => + print('Toast ${toastItem.id} close button tapped'), + onAutoCompleteCompleted: (toastItem) => + print('Toast ${toastItem.id} auto complete completed'), + onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), + ), + ); + // _showToast(context, message, Colors.red); + } + + static void showInfoToast(BuildContext context, String message) { + toastification.show( + context: context, + type: ToastificationType.info, + style: ToastificationStyle.flatColored, + autoCloseDuration: const Duration(seconds: 2), + title: Text(message), + // you can also use RichText widget for title and description parameters + // description: RichText( + // text: const TextSpan(text: 'This is a sample toast message. ')), + alignment: Alignment.topRight, + direction: TextDirection.ltr, + animationDuration: const Duration(milliseconds: 100), + animationBuilder: (context, animation, alignment, child) { + return FadeTransition( + opacity: animation, + child: child, + ); + }, + icon: const Icon(Icons.info), + primaryColor: Colors.lightBlue, + backgroundColor: Colors.white, + foregroundColor: Colors.black, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), + margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 16, + offset: Offset(0, 16), + spreadRadius: 0, + ) + ], + showProgressBar: true, + closeButtonShowType: CloseButtonShowType.onHover, + closeOnClick: false, + pauseOnHover: true, + dragToClose: true, + applyBlurEffect: true, + callbacks: ToastificationCallbacks( + onTap: (toastItem) => print('Toast ${toastItem.id} tapped'), + onCloseButtonTap: (toastItem) => + print('Toast ${toastItem.id} close button tapped'), + onAutoCompleteCompleted: (toastItem) => + print('Toast ${toastItem.id} auto complete completed'), + onDismissed: (toastItem) => print('Toast ${toastItem.id} dismissed'), + ), + ); + // _showToast(context, message, Colors.red); + } + + static void _showToast(BuildContext context, String message, Color color) { + // Fluttertoast.showToast( + // msg: message, + // toastLength: Toast.LENGTH_SHORT, + // gravity: ToastGravity.TOP, + // timeInSecForIosWeb: 5, + // backgroundColor: color, + // textColor: Colors.white, + // fontSize: 16.0, + // ); + } +} diff --git a/lib/presentation/screens/login/login_screen.dart b/lib/presentation/screens/login/login_screen.dart index 1eb9414..b991fdd 100644 --- a/lib/presentation/screens/login/login_screen.dart +++ b/lib/presentation/screens/login/login_screen.dart @@ -80,6 +80,212 @@ class _LoginScreenState extends State { ), ); + @override + void initState() { + super.initState(); + } + + Future verifyMobileAndEmailNumber() async { + try { + if (_formKey.currentState!.validate()) { + // setState(() { + // _isLoading = true; + // }); + + // Determine the API and the payload based on the visible field + String apiEndpoint = isEmailFieldVisible + ? Env.apiUrl + 'verifyEmployeeEmailId' + : Env.apiUrl + 'verifyEmployeeNumber'; + + Map payload = isEmailFieldVisible + ? {'email': emailController.text} + : {'mobile_number': mobileController.text}; + + final response = await http.post( + Uri.parse(apiEndpoint), + body: json.encode(payload), + headers: { + HttpHeaders.contentTypeHeader: 'application/json', + }, + ); + + if (response.statusCode == 200) { + Map data = json.decode(response.body); + bool userVerification = data['data']['user_verification']; + String message = data['data']['message']; + if (userVerification) { + final SharedPreferences prefs = + await SharedPreferences.getInstance(); + // var enteredMobileNumber = mobileController.text; + // prefs.setString('empMobileNo', enteredMobileNumber); + if (isEmailFieldVisible) { + print('isEmailFieldVisible $isEmailFieldVisible'); + // prefs.setString('empEmail', emailController.text); + print('${emailController.text}'); + ToastHelper.showSuccessToast( + context, 'Verification code sent to ${emailController.text}'); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MyEmailVerify( + email: emailController.text, // Pass the phone number + ), + ), + ); + } else { + _verifyPhoneNumber(); + } + + // ToastHelper.showSuccessToast(context, message); + } else { + setState(() { + _isLoading = false; + }); + ToastHelper.showErrorToast(context, message); + print('Invalid mobile number'); + } + } else { + setState(() { + _isLoading = false; + }); + ToastHelper.showErrorToast(context, 'Something went wrong'); + throw Exception('Failed to verify mobile number'); + } + } + } catch (e) { + setState(() { + _isLoading = false; + }); + ToastHelper.showErrorToast(context, 'Something went wrong'); + print('Error: $e'); + } + } + + // Future _verifyPhoneNumber() async { + // var enteredMobileNumber = mobileController.text; + // var countryCode = countryController.text; + // print('${countryCode + enteredMobileNumber}'); + // await _auth.verifyPhoneNumber( + // phoneNumber: '${countryCode + enteredMobileNumber}', + // timeout: const Duration(seconds: 60), + // verificationCompleted: (PhoneAuthCredential credential) async { + // await _auth.signInWithCredential(credential); + // // ToastHelper.showSuccessToast(context, 'Verified Successfully!'); + // // setState(() { + // // _isLoading = false; + // // }); + // }, + // verificationFailed: (FirebaseAuthException e) { + // print('Verification Failed: ${e.code} - ${e.message}'); + // String errorMessage; + // if (e.code == 'invalid-app-credential') { + // errorMessage = 'Invalid Credential. Please try again.'; + // } else if (e.code == 'invalid-phone-number') { + // errorMessage = 'The provided phone number is not valid.'; + // } else if (e.code == 'too-many-requests') { + // errorMessage = 'Too many requests. Try again later.'; + // } else { + // errorMessage = 'Verification Failed: ${e.message}'; + // } + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text(errorMessage), + // duration: Duration(seconds: 2), + // ), + // ); + // + // ToastHelper.showSuccessToast(context, errorMessage); + // setState(() { + // _isLoading = false; + // }); + // }, + // codeSent: (String verificationId, int? resendToken) async { + // setState(() { + // _verificationId = verificationId; + // _resendToken = resendToken; + // }); + // + // // When getting the verificationId + // SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('verificationId', _verificationId); + // + // + // ToastHelper.showSuccessToast( + // context, 'Verification code sent to ${enteredMobileNumber}'); + // + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => MyVerify( + // verificationId: _verificationId, + // mobileNumber: enteredMobileNumber, + // resendToken: _resendToken, + // onResendCode: _resendCode, // Pass the phone number + // ), + // ), + // ); + // setState(() { + // _isLoading = false; + // }); + // }, + // codeAutoRetrievalTimeout: (String verificationId) async{ + // setState(() { + // _verificationId = verificationId; + // }); + // final prefs = await SharedPreferences.getInstance(); + // await prefs.setString('verificationId', verificationId); + // ToastHelper.showSuccessToast(context, 'Code auto-retrieval timed out.'); + // setState(() { + // _isLoading = false; + // }); + // }, + // ); + // } + // + // void _resendCode(String mobileNumber, int? resendToken) async { + // await _auth.verifyPhoneNumber( + // phoneNumber: '${countryController.text + mobileNumber}', + // timeout: const Duration(seconds: 60), + // forceResendingToken: resendToken, + // verificationCompleted: (PhoneAuthCredential credential) async { + // await _auth.signInWithCredential(credential); + // }, + // verificationFailed: (FirebaseAuthException e) { + // if (e.code == 'invalid-phone-number') { + // print('The provided phone number is not valid.'); + // } + // }, + // codeSent: (String verificationId, int? resendToken) async{ + // final prefs = await SharedPreferences.getInstance(); + // await prefs.setString('verificationId', verificationId); + // setState(() { + // _verificationId = verificationId; + // _resendToken = resendToken; + // }); + // ToastHelper.showSuccessToast( + // context, 'Verification code resent to ${mobileNumber}'); + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => MyVerify( + // verificationId: _verificationId, + // mobileNumber: mobileNumber, + // resendToken: _resendToken, + // onResendCode: _resendCode, + // ), + // ), + // ); + // }, + // codeAutoRetrievalTimeout: (String verificationId) async{ + // final prefs = await SharedPreferences.getInstance(); + // await prefs.setString('verificationId', verificationId); + // setState(() { + // _verificationId = verificationId; + // }); + // }, + // ); + // } + Future sendMobileOrEmailVerify() async { if (!_formKey.currentState!.validate()) return; setState(() { diff --git a/pubspec.lock b/pubspec.lock index b8fc766..19893f9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -9,6 +9,14 @@ packages: url: "https://pub.dev" source: hosted version: "85.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "948f7d74f41dd6f2d563ea9f4c21d7ea764f8e047d2b24138974c19c24d37eb6" + url: "https://pub.dev" + source: hosted + version: "1.3.61" analyzer: dependency: transitive description: @@ -17,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.7.1" + animated_bottom_navigation_bar: + dependency: "direct main" + description: + name: animated_bottom_navigation_bar + sha256: "94971fdfd53acd443acd0d17ce1cb5219ad833f20c75b50c55b205e54a5d6117" + url: "https://pub.dev" + source: hosted + version: "1.4.0" args: dependency: transitive description: @@ -233,6 +249,102 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + firebase_app_check: + dependency: "direct main" + description: + name: firebase_app_check + sha256: "3bf5d9c9043723ae12c09b2a012ca5f32653a1bc30a0a9818983766ea06d72a8" + url: "https://pub.dev" + source: hosted + version: "0.4.0+1" + firebase_app_check_platform_interface: + dependency: transitive + description: + name: firebase_app_check_platform_interface + sha256: bdda519aa487be605a53093ececa564d48afadd1a1d018520ce45d00415ac03d + url: "https://pub.dev" + source: hosted + version: "0.2.0+1" + firebase_app_check_web: + dependency: transitive + description: + name: firebase_app_check_web + sha256: ab7b57c95faf266e2d5cd9fc57cda54d1fdfbc2c429c09b095830d4186f25920 + url: "https://pub.dev" + source: hosted + version: "0.2.0+16" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: b843f8b6897654899bfc437e385f710f79fdf1fe872ce629cbdf6017772d5803 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: c7acba5e95dc8095149c4534e968d61099896f1a09421d46d7c3fc3069082a37 + url: "https://pub.dev" + source: hosted + version: "8.1.1" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: "083c57b761b33f766824d7835c2b47abacbc4d82c7193e91442d77b983675b28" + url: "https://pub.dev" + source: hosted + version: "6.0.2" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "967dae9a65f69377beb9f4ab292ea63ce5befa1ce24682cab1b69ca4b7a46927" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "5dbc900677dcbe5873d22ad7fbd64b047750124f1f9b7ebe2a33b9ddccc838eb" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: f7ee08febc1c4451588ce58ffcf28edaee857e9a196fee88b85deb889990094a + url: "https://pub.dev" + source: hosted + version: "3.1.0" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: aad5dcdea5698499b70d74d5a53b1f6a9972f85f97225e4b7ac006dd8d4f9bac + url: "https://pub.dev" + source: hosted + version: "16.0.1" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "825bc11767bf50a43dccf49b3026f847ec31d0f176139bfc48d662cc128b5014" + url: "https://pub.dev" + source: hosted + version: "4.7.1" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: db8dbdd79921245c4de02407e33cae2d1868683be18a5ba948d2af5311e3ef5d + url: "https://pub.dev" + source: hosted + version: "4.0.1" fixnum: dependency: transitive description: @@ -246,6 +358,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_dotenv: + dependency: "direct main" + description: + name: flutter_dotenv + sha256: d4130c4a43e0b13fefc593bc3961f2cb46e30cb79e253d4a526b1b5d24ae1ce4 + url: "https://pub.dev" + source: hosted + version: "6.0.0" flutter_hooks: dependency: "direct main" description: @@ -262,6 +382,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + url: "https://pub.dev" + source: hosted + version: "2.0.30" flutter_riverpod: dependency: "direct main" description: @@ -368,6 +496,54 @@ packages: url: "https://pub.dev" source: hosted version: "6.3.1" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: "939a8b58f84c4053811b8c1bc9adbcb59449a15b37958264bbf60020698cca0e" + url: "https://pub.dev" + source: hosted + version: "7.1.1" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: "666c3a133f5ec4256f08884359dc34788778d96a378d804203bc57a73ffbd9c0" + url: "https://pub.dev" + source: hosted + version: "7.0.5" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: c7ee744ebbcd98353966dbdee735d4fca085226f6bf725c6bea8a5c8fe0055bc + url: "https://pub.dev" + source: hosted + version: "6.1.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "8736443134d2cccadd4f228d600177cb3947e36683466a6ab96877ce6932885a" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: "09ac306b2787b48f19c857b9f93375b654f774643c75bd6a1a078c85f4f7b468" + url: "https://pub.dev" + source: hosted + version: "1.0.0" graphs: dependency: transitive description: @@ -400,6 +576,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + iconsax_flutter: + dependency: transitive + description: + name: iconsax_flutter + sha256: d14b4cec8586025ac15276bdd40f6eea308cb85748135965bb6255f14beb2564 + url: "https://pub.dev" + source: hosted + version: "1.0.1" intl: dependency: "direct main" description: @@ -440,6 +624,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.10.0" + jwt_decode: + dependency: "direct main" + description: + name: jwt_decode + sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb + url: "https://pub.dev" + source: hosted + version: "0.3.1" leak_tracker: dependency: transitive description: @@ -472,6 +664,46 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.1" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: "48924f4a8b3cc45994ad5993e2e232d3b00788a305c1bf1c7db32cef281ce9a3" + url: "https://pub.dev" + source: hosted + version: "1.0.52" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "0e9706a8543a4a2eee60346294d6a633dd7c3ee60fae6b752570457c4ff32055" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + url: "https://pub.dev" + source: hosted + version: "1.0.11" logging: dependency: transitive description: @@ -528,6 +760,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: transitive description: @@ -584,6 +832,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + pausable_timer: + dependency: transitive + description: + name: pausable_timer + sha256: "6ef1a95441ec3439de6fb63f39a011b67e693198e7dae14e20675c3c00e86074" + url: "https://pub.dev" + source: hosted + version: "3.1.0+3" petitparser: dependency: transitive description: @@ -757,6 +1013,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -821,6 +1085,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + toastification: + dependency: "direct main" + description: + name: toastification + sha256: "69db2bff425b484007409650d8bcd5ed1ce2e9666293ece74dcd917dacf23112" + url: "https://pub.dev" + source: hosted + version: "3.0.3" typed_data: dependency: transitive description: @@ -837,6 +1109,78 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "69ee86740f2847b9a4ba6cffa74ed12ce500bbe2b07f3dc1e643439da60637b7" + url: "https://pub.dev" + source: hosted + version: "6.3.18" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + url: "https://pub.dev" + source: hosted + version: "6.3.4" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + url: "https://pub.dev" + source: hosted + version: "3.2.3" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 8fd4cd6..eaeee2f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,6 +48,18 @@ dependencies: intl: ^0.20.2 flutter_hooks: ^0.21.3+1 pinput: ^5.0.1 + animated_bottom_navigation_bar: ^1.4.0 + flutter_dotenv: ^6.0.0 + jwt_decode: ^0.3.1 + toastification: ^3.0.3 + url_launcher: ^6.3.2 + firebase_messaging: ^16.0.1 + local_auth: ^2.3.0 + google_sign_in: ^7.1.1 + firebase_core: ^4.1.0 + firebase_auth: ^6.0.2 + firebase_app_check: ^0.4.0+1 + package_info_plus: ^8.3.1 dev_dependencies: flutter_test: