diff --git a/android/app/build.gradle b/android/app/build.gradle index 92a32c25..3198c04c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -34,7 +34,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { namespace "in.ac.iitr.mdg.appetizer" - compileSdkVersion 33 + compileSdkVersion 34 ndkVersion flutter.ndkVersion compileOptions { diff --git a/assets/images/meal_card/Snacks.svg b/assets/images/meal_card/Snacks.svg new file mode 100644 index 00000000..37e28b6a --- /dev/null +++ b/assets/images/meal_card/Snacks.svg @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/data/constants/env_config.dart b/lib/data/constants/env_config.dart index cc1de10c..cb33130f 100644 --- a/lib/data/constants/env_config.dart +++ b/lib/data/constants/env_config.dart @@ -15,4 +15,6 @@ class EnvironmentConfig { ); static const String SENTRY_DSN = String.fromEnvironment('SENTRY_DSN'); + static const String MIXPANEL_PROJECT_KEY = + String.fromEnvironment('MIXPANEL_PROJECT_KEY'); } diff --git a/lib/data/core/router/registry/paths.dart b/lib/data/core/router/registry/paths.dart index 743e4bd9..add491df 100644 --- a/lib/data/core/router/registry/paths.dart +++ b/lib/data/core/router/registry/paths.dart @@ -17,4 +17,5 @@ class AppPathsRegistry { static const String leavesAndRebate = 'leavesAndRebate'; static const String feedback = 'feedback'; static const String hostelChange = 'hostelChange'; + static const String resetPassword = 'resetPassword'; } diff --git a/lib/data/core/router/registry/routes.dart b/lib/data/core/router/registry/routes.dart index f7f57aa9..19473565 100644 --- a/lib/data/core/router/registry/routes.dart +++ b/lib/data/core/router/registry/routes.dart @@ -55,6 +55,10 @@ class AppRoutesRegistry { path: AppPathsRegistry.feedback, page: FeedbackRoute.page, ), + CustomRoute( + path: AppPathsRegistry.resetPassword, + page: ResetPasswordRoute.page, + ), CustomRoute( path: AppPathsRegistry.hostelChange, page: HostelChangeRoute.page, diff --git a/lib/domain/amenity/mixpanel_service.dart b/lib/domain/amenity/mixpanel_service.dart new file mode 100644 index 00000000..acef3b61 --- /dev/null +++ b/lib/domain/amenity/mixpanel_service.dart @@ -0,0 +1,12 @@ +import 'package:appetizer/data/constants/env_config.dart'; +import 'package:mixpanel_flutter/mixpanel_flutter.dart'; + +class MixpanelManager { + static Mixpanel? instance; + + static Future init() async { + instance ??= await Mixpanel.init(EnvironmentConfig.MIXPANEL_PROJECT_KEY, + trackAutomaticEvents: true); + return instance!; + } +} diff --git a/lib/presentation/app/bloc/app_bloc.dart b/lib/presentation/app/bloc/app_bloc.dart index 24b50b84..846f04ae 100644 --- a/lib/presentation/app/bloc/app_bloc.dart +++ b/lib/presentation/app/bloc/app_bloc.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:appetizer/data/constants/constants.dart'; import 'package:appetizer/data/services/local/local_storage_service.dart'; +import 'package:appetizer/domain/amenity/mixpanel_service.dart'; import 'package:appetizer/domain/models/user/user.dart'; import 'package:appetizer/domain/repositories/leave/leave_repository.dart'; import 'package:appetizer/domain/repositories/user/user_repository.dart'; @@ -70,6 +71,8 @@ class AppBloc extends Bloc { FutureOr _onNavigateToHome( NavigateToHomeScreen event, Emitter emit) { + assert(state.user != null); + MixpanelManager.instance?.identify(state.user!.enrNo.toString()); emit(state.copyWith(navigateTo: NavigateTo.showHomeScreen)); } diff --git a/lib/presentation/bottom_navigator/bottom_navigator_screen.dart b/lib/presentation/bottom_navigator/bottom_navigator_screen.dart index 3ff16985..eec9ec32 100644 --- a/lib/presentation/bottom_navigator/bottom_navigator_screen.dart +++ b/lib/presentation/bottom_navigator/bottom_navigator_screen.dart @@ -2,9 +2,7 @@ import 'package:appetizer/data/core/router/intrinsic_router/intrinsic_router.gr. import 'package:appetizer/domain/repositories/coupon_repository.dart'; import 'package:appetizer/domain/repositories/leave/leave_repository.dart'; import 'package:appetizer/domain/repositories/menu_repository.dart'; -import 'package:appetizer/presentation/app/bloc/app_bloc.dart'; import 'package:appetizer/domain/repositories/transaction_repositroy.dart'; -import 'package:appetizer/presentation/components/round_edge_container.dart'; import 'package:appetizer/domain/repositories/user/user_repository.dart'; import 'package:appetizer/presentation/leaves_and_rebate/bloc/leaves_and_rebate_bloc.dart'; import 'package:appetizer/presentation/profile/bloc/profile_page_bloc.dart'; @@ -63,26 +61,6 @@ class BottomNavigatorScreen extends StatelessWidget { return Scaffold( backgroundColor: Colors.white, body: child, - floatingActionButton: Visibility( - visible: tabRouter.activeIndex == 1, - child: BlocSelector( - selector: (appState) => appState.user!.isCheckedOut, - builder: (context, isCheckedOut) { - if (isCheckedOut) return const SizedBox(); - - return GestureDetector( - onTap: () { - context - .read() - .add(const ToggleCheckOutStatusEvent()); - }, - child: const RoundEdgeTextOnlyContainer(text: "CHECK OUT"), - ); - }, - ), - ), - floatingActionButtonLocation: - FloatingActionButtonLocation.centerFloat, bottomNavigationBar: BottomNavigationBar( key: UniqueKey(), currentIndex: tabRouter.activeIndex, diff --git a/lib/presentation/components/app_formfield.dart b/lib/presentation/components/app_formfield.dart new file mode 100644 index 00000000..b60b85e2 --- /dev/null +++ b/lib/presentation/components/app_formfield.dart @@ -0,0 +1,68 @@ +import 'package:appetizer/data/core/theme/dimensional/dimensional.dart'; +import 'package:appetizer/presentation/components/app_textfield.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class AppFormField extends StatelessWidget { + const AppFormField({ + super.key, + required this.hintText, + this.controller, + this.onChanged, + this.obscureText, + this.suffix, + this.border, + required this.title, + this.maxLength, + this.maxLines, + this.titleStyle, + }) : assert( + obscureText == null || suffix != null, + 'Suffix should be provided if obscureText is provided', + ), + assert( + controller != null || onChanged != null, + 'Either controller or onChanged should be provided', + ); + + final String hintText; + final TextEditingController? controller; + final Function(String)? onChanged; + final bool? obscureText; + final Widget? suffix; + final InputBorder? border; + final String title; + final int? maxLength; + final int? maxLines; + final TextStyle? titleStyle; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: titleStyle ?? + GoogleFonts.notoSans( + fontSize: 18.toAutoScaledFont, + fontWeight: FontWeight.w600, + ), + ), + SizedBox( + height: title == "Description" ? 0 : 20.toAutoScaledHeight, + ), + AppTextField( + controller: controller, + onChanged: onChanged, + obscureText: obscureText, + hintText: hintText, + suffix: suffix, + border: border, + maxLength: maxLength, + maxLines: maxLines, + ), + ], + ); + } +} diff --git a/lib/presentation/components/app_textfield.dart b/lib/presentation/components/app_textfield.dart new file mode 100644 index 00000000..cc89ed79 --- /dev/null +++ b/lib/presentation/components/app_textfield.dart @@ -0,0 +1,61 @@ +import 'package:appetizer/data/core/theme/dimensional/dimensional.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class AppTextField extends StatelessWidget { + const AppTextField({ + super.key, + required this.hintText, + this.controller, + this.onChanged, + this.obscureText, + this.suffix, + this.border, + this.maxLength, + this.maxLines, + }) : assert( + obscureText == null || suffix != null, + 'Suffix should be provided if obscureText is provided', + ), + assert( + controller != null || onChanged != null, + 'Either controller or onChanged should be provided', + ); + + final String hintText; + final TextEditingController? controller; + final Function(String)? onChanged; + final bool? obscureText; + final Widget? suffix; + final InputBorder? border; + final int? maxLength; + final int? maxLines; + + @override + Widget build(BuildContext context) { + return TextField( + controller: controller, + onChanged: onChanged, + obscureText: obscureText ?? false, + decoration: InputDecoration( + hintText: hintText, + hintStyle: GoogleFonts.lato( + fontSize: 12.toAutoScaledFont, + color: const Color(0xFF111111), + fontWeight: FontWeight.w600, + ), + border: border ?? + OutlineInputBorder( + borderSide: BorderSide( + color: const Color(0xFF111111).withOpacity(0.25)), + borderRadius: BorderRadius.circular(5), + ), + contentPadding: EdgeInsets.symmetric( + horizontal: 20.toAutoScaledWidth, + vertical: 15.toAutoScaledHeight), + suffixIcon: suffix), + maxLength: maxLength, + maxLines: maxLines ?? 1, + ); + } +} diff --git a/lib/presentation/components/black_button.dart b/lib/presentation/components/black_button.dart index 6f650e22..42881b46 100644 --- a/lib/presentation/components/black_button.dart +++ b/lib/presentation/components/black_button.dart @@ -7,8 +7,8 @@ class BlackButton extends StatelessWidget { required this.title, required this.onTap, required this.width, - Key? key, - }) : super(key: key); + super.key, + }); final VoidCallback onTap; final String title; @@ -48,8 +48,8 @@ class BlackIconButton extends StatelessWidget { required this.onTap, required this.width, required this.icon, - Key? key, - }) : super(key: key); + super.key, + }); final VoidCallback onTap; final String title; diff --git a/lib/presentation/components/no_data_found_container.dart b/lib/presentation/components/no_data_found_container.dart index 69f973ed..46991da2 100644 --- a/lib/presentation/components/no_data_found_container.dart +++ b/lib/presentation/components/no_data_found_container.dart @@ -3,44 +3,38 @@ import 'package:flutter/material.dart'; // import 'package:flutter_svg/flutter_svg.dart'; class NoDataFoundContainer extends StatelessWidget { - const NoDataFoundContainer({ - required this.title, - Key? key, - }) : super(key: key); + const NoDataFoundContainer({required this.title, super.key}); final String title; @override Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - padding: EdgeInsets.only(top: 150.toAutoScaledHeight), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - // TODO: check why svg doesnt work - // SvgPicture.asset( - // 'assets/images/no_data_image.svg', - // // 'assets/images/no_data_image.svg', - // height: 178.toAutoScaledHeight, - // width: 186.toAutoScaledWidth, - // ), - Image.asset( - 'assets/images/no_data_image.png', - height: 178.toAutoScaledHeight, - width: 186.toAutoScaledWidth, + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // TODO: check why svg doesnt work + // SvgPicture.asset( + // 'assets/images/no_data_image.svg', + // // 'assets/images/no_data_image.svg', + // height: 178.toAutoScaledHeight, + // width: 186.toAutoScaledWidth, + // ), + Image.asset( + 'assets/images/no_data_image.png', + height: 178.toAutoScaledHeight, + width: 186.toAutoScaledWidth, + ), + Text( + title, + style: TextStyle( + color: const Color(0xFF111111), + fontSize: 18.toAutoScaledFont, + fontFamily: 'Noto Sans', + fontWeight: FontWeight.w400, ), - Text( - title, - style: TextStyle( - color: const Color(0xFF111111), - fontSize: 18.toAutoScaledFont, - fontFamily: 'Noto Sans', - fontWeight: FontWeight.w400, - ), - ), - ], - ), + ), + ], ); } } diff --git a/lib/presentation/coupons/components/coupon_row.dart b/lib/presentation/coupons/components/coupon_row.dart index 37f0323a..4ffadb10 100644 --- a/lib/presentation/coupons/components/coupon_row.dart +++ b/lib/presentation/coupons/components/coupon_row.dart @@ -4,10 +4,7 @@ import 'package:appetizer/presentation/coupons/components/coupon_card.dart'; import 'package:flutter/material.dart'; class CouponRow extends StatelessWidget { - const CouponRow({ - required this.coupons, - Key? key, - }) : super(key: key); + const CouponRow({required this.coupons, super.key}); final List coupons; diff --git a/lib/presentation/feedback/components/FeedbackTile/feedback_tile.dart b/lib/presentation/feedback/components/FeedbackTile/feedback_tile.dart index 0dde8a19..d441f677 100644 --- a/lib/presentation/feedback/components/FeedbackTile/feedback_tile.dart +++ b/lib/presentation/feedback/components/FeedbackTile/feedback_tile.dart @@ -10,8 +10,8 @@ class FeedbackTile extends StatelessWidget { required this.title, required this.parentState, required this.index, - Key? key, - }) : super(key: key); + super.key, + }); final String title; final FeedbackPageState parentState; diff --git a/lib/presentation/feedback/feedback_view.dart b/lib/presentation/feedback/feedback_view.dart index 7c461893..2f90146a 100644 --- a/lib/presentation/feedback/feedback_view.dart +++ b/lib/presentation/feedback/feedback_view.dart @@ -1,6 +1,7 @@ import 'package:appetizer/app_theme.dart'; import 'package:appetizer/data/core/theme/dimensional/dimensional.dart'; import 'package:appetizer/domain/repositories/feedback_repository.dart'; +import 'package:appetizer/presentation/components/app_formfield.dart'; import 'package:appetizer/presentation/components/black_button.dart'; import 'package:appetizer/presentation/feedback/bloc/feedback_page_bloc.dart'; import 'package:appetizer/presentation/feedback/components/FeedbackTile/feedback_tile.dart'; @@ -72,29 +73,26 @@ class FeedbackScreen extends StatelessWidget { fontWeight: FontWeight.w400, ), ), - Text( - 'Description', - style: TextStyle( + AppFormField( + hintText: "", + title: "Description", + controller: textController, + titleStyle: TextStyle( color: Colors.black.withOpacity(0.5400000214576721), fontSize: 12.toAutoScaledFont, fontFamily: 'Open Sans', fontWeight: FontWeight.w400, ), - ), - TextField( - controller: textController, onChanged: (value) => context .read() .add(FeedbackPageDescriptionChangedEvent( description: value)), maxLength: 200, maxLines: 5, - decoration: InputDecoration( - border: OutlineInputBorder( - borderSide: BorderSide( - width: 0.5.toAutoScaledWidth, - color: const Color.fromARGB(37, 0, 0, 0), - ), + border: OutlineInputBorder( + borderSide: BorderSide( + width: 0.5.toAutoScaledWidth, + color: const Color.fromARGB(37, 0, 0, 0), ), ), ), diff --git a/lib/presentation/leaves_and_rebate/components/leave_history.dart b/lib/presentation/leaves_and_rebate/components/leave_history.dart index c7e27125..47eeaf7e 100644 --- a/lib/presentation/leaves_and_rebate/components/leave_history.dart +++ b/lib/presentation/leaves_and_rebate/components/leave_history.dart @@ -14,70 +14,74 @@ class LeaveHistory extends StatelessWidget { return Container( margin: const EdgeInsets.symmetric(horizontal: 24), decoration: ShapeDecoration( - color: AppTheme.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15), - ), - shadows: [ - BoxShadow( - color: const Color(0x19000000), - blurRadius: 7.toAutoScaledWidth, - offset: const Offset(2, 2), - spreadRadius: 1, - ) - ]), + color: AppTheme.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + ), + shadows: [ + BoxShadow( + color: const Color(0x19000000), + blurRadius: 7.toAutoScaledWidth, + offset: const Offset(2, 2), + spreadRadius: 1, + ) + ], + ), child: SingleChildScrollView( child: ExpansionTile( expandedCrossAxisAlignment: CrossAxisAlignment.start, backgroundColor: AppTheme.white, title: const SizedBox.shrink(), - leading: Text("Leave History", - style: AppTheme.headline3.copyWith( - fontSize: 16.toAutoScaledFont, - color: AppTheme.grey2f, - height: (11.0 / 8.0).toAutoScaledHeight)), + leading: Text( + "Leave History", + style: AppTheme.headline3.copyWith( + fontSize: 16.toAutoScaledFont, + color: AppTheme.grey2f, + height: (11.0 / 8.0).toAutoScaledHeight, + ), + ), trailing: const Icon(Icons.expand_more, color: AppTheme.grey2f), children: [ if (paginatedLeaves.results.isNotEmpty) Container( margin: EdgeInsets.only(left: 24.toAutoScaledWidth), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - paginatedLeaves.results[0].startDatetime.year - .toString(), - style: AppTheme.headline2.copyWith( - fontSize: 14.toAutoScaledFont, - color: AppTheme.primary), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + paginatedLeaves.results[0].startDatetime.year.toString(), + style: AppTheme.headline2.copyWith( + fontSize: 14.toAutoScaledFont, + color: AppTheme.primary), + ), + 10.toVerticalSizedBox, + ...paginatedLeaves.results.map( + (leave) => Padding( + padding: EdgeInsets.only(bottom: 10.toAutoScaledHeight), + child: Row( + children: [ + RichText( + text: TextSpan( + text: DateFormat('dd MMM -') + .format(leave.startDatetime), + style: AppTheme.bodyText1 + .copyWith(height: 1.toAutoScaledHeight), + children: [ + TextSpan( + text: leave.startMealType, + style: const TextStyle( + color: AppTheme.primary), + ) + ], + ), + ), + // const Text("-"), + ], + ), ), - 10.toVerticalSizedBox, - ...paginatedLeaves.results - .map((leave) => Padding( - padding: EdgeInsets.only( - bottom: 10.toAutoScaledHeight), - child: Row( - children: [ - RichText( - text: TextSpan( - text: DateFormat('dd MMM -') - .format(leave.startDatetime), - style: AppTheme.bodyText1.copyWith( - height: 1.toAutoScaledHeight), - children: [ - TextSpan( - text: leave.startMealType, - style: const TextStyle( - color: AppTheme.primary), - ) - ]), - ), - // const Text("-"), - ], - ), - )) - .toList(), - ]), + ), + ], + ), ) ], ), diff --git a/lib/presentation/login/components/oauth_webview.dart b/lib/presentation/login/components/oauth_webview.dart index 623d2f8b..54c55580 100644 --- a/lib/presentation/login/components/oauth_webview.dart +++ b/lib/presentation/login/components/oauth_webview.dart @@ -6,7 +6,7 @@ import 'package:auto_route/auto_route.dart'; @RoutePage() class OAuthWebScreen extends StatelessWidget { static const id = 'oauth_view'; - OAuthWebScreen({Key? key}) : super(key: key); + OAuthWebScreen({super.key}); final ValueNotifier _loadingState = ValueNotifier(1); @override @@ -21,13 +21,13 @@ class OAuthWebScreen extends StatelessWidget { children: [ InAppWebView( initialUrlRequest: URLRequest( - url: Uri.parse(AppConstants.omniportSignUpURL), - ), - initialOptions: InAppWebViewGroupOptions( - crossPlatform: InAppWebViewOptions( - useShouldOverrideUrlLoading: true, + url: WebUri.uri( + Uri.parse(AppConstants.omniportSignUpURL), ), ), + initialSettings: InAppWebViewSettings( + useShouldOverrideUrlLoading: true, + ), onLoadStop: (_, uri) { _loadingState.value = 0; }, diff --git a/lib/presentation/login/login_screen.dart b/lib/presentation/login/login_screen.dart index 5ec247ef..50f41a27 100644 --- a/lib/presentation/login/login_screen.dart +++ b/lib/presentation/login/login_screen.dart @@ -1,5 +1,7 @@ import 'package:appetizer/data/core/theme/dimensional/dimensional.dart'; import 'package:appetizer/presentation/app/bloc/app_bloc.dart'; +import 'package:appetizer/presentation/components/app_formfield.dart'; +import 'package:appetizer/presentation/components/app_textfield.dart'; import 'package:appetizer/presentation/components/loading_indicator.dart'; import 'package:appetizer/presentation/components/made_by_mdg.dart'; import 'package:appetizer/presentation/components/raise_query_button.dart'; @@ -92,85 +94,50 @@ class LoginScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - 'Set Password', - style: GoogleFonts.notoSans( - fontSize: 18.toAutoScaledFont, - fontWeight: FontWeight.w600, - ), - ), - 20.toVerticalSizedBox, - TextField( + AppFormField( controller: _controller, + hintText: 'Create Password', obscureText: !state.showPassword, - decoration: InputDecoration( - hintText: 'Create Password', - hintStyle: GoogleFonts.lato( - fontSize: 12, - color: const Color(0xFF111111), - fontWeight: FontWeight.w600, - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: const Color(0xFF111111) - .withOpacity(0.25)), - borderRadius: BorderRadius.circular(5), - ), - suffixIcon: IconButton( - onPressed: () { - context.read().add( - ToggleObscureCreatePassword( - showPassword: !state.showPassword, - showConfirmPassword: - state.showConfirmPassword, - ), - ); - }, - icon: state.showPassword - ? const Icon(Icons.visibility, - color: Color(0xFF757575)) - : const Icon(Icons.visibility_off, - color: Color(0xFF757575)), + suffix: IconButton( + onPressed: () { + context.read().add( + ToggleObscureCreatePassword( + showPassword: !state.showPassword, + showConfirmPassword: + state.showConfirmPassword, + ), + ); + }, + icon: Icon( + state.showPassword + ? Icons.visibility + : Icons.visibility_off, + color: const Color(0xFF757575), ), - contentPadding: EdgeInsets.symmetric( - horizontal: 20.toAutoScaledWidth), ), + title: 'Set Password', ), 10.toVerticalSizedBox, - TextField( + AppTextField( controller: _controller2, + hintText: 'Confirm Password', obscureText: !state.showConfirmPassword, - decoration: InputDecoration( - hintText: 'Confirm Password', - hintStyle: GoogleFonts.lato( - fontSize: 12.toAutoScaledFont, - color: const Color(0xFF111111), - fontWeight: FontWeight.w600, - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: const Color(0xFF111111) - .withOpacity(0.25)), - borderRadius: BorderRadius.circular(5), - ), - suffixIcon: IconButton( - onPressed: () { - context.read().add( - ToggleObscureCreatePassword( - showPassword: state.showPassword, - showConfirmPassword: - !state.showConfirmPassword, - ), - ); - }, - icon: state.showConfirmPassword - ? const Icon(Icons.visibility, - color: Color(0xFF757575)) - : const Icon(Icons.visibility_off, - color: Color(0xFF757575)), + suffix: IconButton( + onPressed: () { + context.read().add( + ToggleObscureCreatePassword( + showPassword: state.showPassword, + showConfirmPassword: + !state.showConfirmPassword, + ), + ); + }, + icon: Icon( + state.showConfirmPassword + ? Icons.visibility + : Icons.visibility_off, + color: const Color(0xFF757575), ), - contentPadding: - const EdgeInsets.symmetric(horizontal: 20), ), ), SizedBox( @@ -206,54 +173,34 @@ class LoginScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - state is ForgotPasswordState + AppFormField( + hintText: state is EnterPassword + ? "Password" + : state is ForgotPasswordState + ? "Email id" + : 'Enrollment No.', + title: state is ForgotPasswordState ? 'Forgot Password' : 'Login/SignUp', - style: GoogleFonts.notoSans( - fontSize: 18, - fontWeight: FontWeight.w600, - ), - ), - 20.toVerticalSizedBox, - TextField( controller: _controller, obscureText: state is EnterPassword ? !state.showPassword : false, - decoration: InputDecoration( - hintText: state is EnterPassword - ? "Password" - : state is ForgotPasswordState - ? "Email id" - : 'Enrollment No.', - hintStyle: GoogleFonts.lato( - fontSize: 12.toAutoScaledFont, - color: const Color(0xFF111111), - fontWeight: FontWeight.w600, - ), - suffixIcon: state is EnterPassword - ? IconButton( - onPressed: () { - context.read().add( - ShowPasswordPressed(), - ); - }, - icon: state.showPassword - ? const Icon(Icons.visibility, - color: Color(0xFF757575)) - : const Icon(Icons.visibility_off, - color: Color(0xFF757575))) - : null, - border: OutlineInputBorder( - borderSide: BorderSide( - color: const Color(0xFF111111) - .withOpacity(0.25)), - borderRadius: BorderRadius.circular(5), - ), - contentPadding: EdgeInsets.symmetric( - horizontal: 20.toAutoScaledWidth), - ), + suffix: state is EnterPassword + ? IconButton( + onPressed: () { + context + .read() + .add(ShowPasswordPressed()); + }, + icon: Icon( + state.showPassword + ? Icons.visibility + : Icons.visibility_off, + color: const Color(0xFF757575), + ), + ) + : const SizedBox(), ), state is EnterPassword ? SizedBox( diff --git a/lib/presentation/notifications/components/no_notification_widget.dart b/lib/presentation/notifications/components/no_notification_widget.dart index fa6a1c33..bbe4e7b9 100644 --- a/lib/presentation/notifications/components/no_notification_widget.dart +++ b/lib/presentation/notifications/components/no_notification_widget.dart @@ -6,9 +6,7 @@ class NoNotificationsWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - alignment: Alignment.center, - padding: EdgeInsets.only(top: 282.toAutoScaledHeight), + return Align( child: Text( 'No new notifications !', style: TextStyle( diff --git a/lib/presentation/notifications/components/notification_card.dart b/lib/presentation/notifications/components/notification_card.dart index 79841b4e..de6b4971 100644 --- a/lib/presentation/notifications/components/notification_card.dart +++ b/lib/presentation/notifications/components/notification_card.dart @@ -4,10 +4,7 @@ import 'package:flutter/material.dart'; import 'package:appetizer/domain/models/user/notification.dart' as notification; class NotificationCard extends StatelessWidget { - const NotificationCard({ - required this.data, - Key? key, - }) : super(key: key); + const NotificationCard({required this.data, super.key}); final notification.Notification data; diff --git a/lib/presentation/notifications/notification_view.dart b/lib/presentation/notifications/notification_view.dart index ea2fcfb6..265d81a5 100644 --- a/lib/presentation/notifications/notification_view.dart +++ b/lib/presentation/notifications/notification_view.dart @@ -19,72 +19,51 @@ class NotificationScreen extends StatelessWidget { return Scaffold( backgroundColor: AppTheme.white, // TODO: implement Old/New notification bars and logic - body: BlocProvider( - create: (context) => - NotificationPageBloc(repo: context.read()), - child: BlocBuilder( - builder: (context, state) { - if (state is NotificationPageInitialState) { - context - .read() - .add(const NotificationPageFetchEvent(notifications: [])); - return const Column( - children: [ - NotificationBanner(), - NoDataFoundContainer(title: 'Oops! Just a moment...'), - ], - ); - } - if (state is NotificationPageFailedState) { - // TODO: throw an error, or snackbar - return const Column( - children: [ - NotificationBanner(), - NoDataFoundContainer(title: 'Something went wrong...'), - ], - ); - } - if (state is NotificationPageFetchedState) { - if (state.notifications.isEmpty) { - return const Column( - children: [ - NotificationBanner(), - NoNotificationsWidget(), - ], - ); - } - return Column( - children: [ - const NotificationBanner(), - Container( - height: 656.toAutoScaledHeight, - padding: EdgeInsets.only( - left: 24.toAutoScaledWidth, - right: 25.toAutoScaledWidth, - ), - child: ListView.builder( - padding: EdgeInsets.zero, - itemCount: state.notifications.length, - itemBuilder: (context, index) { - return Column( - children: [ - NotificationCard( - data: state.notifications[index], - ), - index < state.notifications.length - ? 16.toVerticalSizedBox - : const SizedBox.shrink(), - ], - ); - }, - ), - ), - ], - ); - } - return const NoDataFoundContainer(title: 'Something went wrong !'); - }, - ), + body: Column( + children: [ + const NotificationBanner(), + Expanded( + child: BlocProvider( + create: (context) => + NotificationPageBloc(repo: context.read()), + child: BlocBuilder( + builder: (context, state) { + if (state is NotificationPageInitialState) { + context.read().add( + const NotificationPageFetchEvent(notifications: [])); + return const NoDataFoundContainer( + title: 'Oops! Just a moment...'); + } + if (state is NotificationPageFailedState) { + // TODO: throw an error, or snackbar + return const NoDataFoundContainer( + title: 'Something went wrong...'); + } + if (state is NotificationPageFetchedState) { + return Visibility( + visible: state.notifications.isNotEmpty, + replacement: const NoNotificationsWidget(), + child: ListView.separated( + padding: 24.toHorizontalPadding, + shrinkWrap: true, + itemCount: state.notifications.length, + separatorBuilder: (context, index) => + 16.toVerticalSizedBox, + itemBuilder: (context, index) { + return NotificationCard( + data: state.notifications[index], + ); + }, + ), + ); + } + return const NoDataFoundContainer( + title: 'Something went wrong !'); + }, + ), + ), + ), + ], ), ); } diff --git a/lib/presentation/profile/components/profile_card.dart b/lib/presentation/profile/components/profile_card.dart index fb0be707..32d81cd2 100644 --- a/lib/presentation/profile/components/profile_card.dart +++ b/lib/presentation/profile/components/profile_card.dart @@ -7,8 +7,8 @@ class Fields extends StatelessWidget { const Fields({ required this.title, required this.data, - Key? key, - }) : super(key: key); + super.key, + }); final String title; final String data; @@ -41,10 +41,7 @@ class Fields extends StatelessWidget { } class ProfileCard extends StatelessWidget { - const ProfileCard({ - required this.data, - Key? key, - }) : super(key: key); + const ProfileCard({required this.data, super.key}); final User data; diff --git a/lib/presentation/profile/components/profile_photo.dart b/lib/presentation/profile/components/profile_photo.dart index c0f4aef7..735eba3b 100644 --- a/lib/presentation/profile/components/profile_photo.dart +++ b/lib/presentation/profile/components/profile_photo.dart @@ -5,10 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class ProfilePhoto extends StatelessWidget { - const ProfilePhoto({ - required this.imageUri, - Key? key, - }) : super(key: key); + const ProfilePhoto({required this.imageUri, super.key}); final String imageUri; diff --git a/lib/presentation/profile/profile_view.dart b/lib/presentation/profile/profile_view.dart index ecc3ee84..854cbdac 100644 --- a/lib/presentation/profile/profile_view.dart +++ b/lib/presentation/profile/profile_view.dart @@ -59,6 +59,7 @@ class ProfileScreen extends StatelessWidget { Container( padding: EdgeInsets.symmetric( vertical: 24.toAutoScaledHeight, + // horizontal: 43.toAutoScaledWidth, ), child: Column( children: [ @@ -76,18 +77,15 @@ class ProfileScreen extends StatelessWidget { ScaffoldMessenger.of(context) .showSnackBar(snackBar); }, - horizontalPadding: 26, + horizontalPadding: 10, width: 115, ), + // 5.toHorizontalSizedBox, ProfileTextButton( title: 'Reset Password', onPressed: () { - const snackBar = SnackBar( - content: Text('Coming soon!'), - duration: Duration(milliseconds: 500), - ); - ScaffoldMessenger.of(context) - .showSnackBar(snackBar); + context.router + .push(ResetPasswordRoute()); }, horizontalPadding: 10, width: 115, diff --git a/lib/presentation/reset_password/bloc/reset_password_bloc.dart b/lib/presentation/reset_password/bloc/reset_password_bloc.dart new file mode 100644 index 00000000..6a642fd5 --- /dev/null +++ b/lib/presentation/reset_password/bloc/reset_password_bloc.dart @@ -0,0 +1,93 @@ +import 'dart:async'; + +import 'package:appetizer/data/constants/constants.dart'; +import 'package:appetizer/domain/repositories/user/user_repository.dart'; +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; + +part 'reset_password_event.dart'; +part 'reset_password_state.dart'; + +class ResetPasswordBloc extends Bloc { + final UserRepository userRepository; + ResetPasswordBloc({required this.userRepository}) + : super(const ResetPassword( + showOldPassword: false, + showNewPassword: false, + showConfirmPassword: false, + )) { + on(_onResetPasswordPressed); + on(_onToggleObscureResetPassword); + } + FutureOr _onResetPasswordPressed( + ResetPasswordPressed event, Emitter emit) async { + bool isValidated = true; + if (event.oldPassword.isEmpty || + event.newPassword.isEmpty || + event.confirmPassword.isEmpty) { + emit( + (state as ResetPassword).copyWith( + error: 'All fields are required', + ), + ); + isValidated = false; + } else if (event.newPassword.length < 8) { + emit( + (state as ResetPassword).copyWith( + error: 'Password must be at least 8 characters long', + ), + ); + isValidated = false; + } else if (event.newPassword != event.confirmPassword) { + emit( + (state as ResetPassword).copyWith(error: 'Passwords do not match'), + ); + isValidated = false; + } else if (event.oldPassword == event.newPassword) { + emit( + (state as ResetPassword).copyWith( + error: 'New password cannot be same as old password', + ), + ); + isValidated = false; + } + + if (!isValidated) { + emit(ResetPassword( + error: null, + showOldPassword: (state as ResetPassword).showOldPassword, + showNewPassword: (state as ResetPassword).showNewPassword, + showConfirmPassword: (state as ResetPassword).showConfirmPassword, + )); + return; + } + + emit(Loading()); + try { + await userRepository.changePassword( + event.oldPassword, + event.newPassword, + ); + emit(const ResetPasswordSuccess()); + } catch (e) { + emit(const ResetPassword( + error: AppConstants.GENERIC_FAILURE, + showOldPassword: false, + showNewPassword: false, + showConfirmPassword: false, + )); + emit((state as ResetPassword).copyWith(error: null)); + } + } + + FutureOr _onToggleObscureResetPassword(ToggleObscureResetPassword event, + Emitter emit) async { + emit( + (state as ResetPassword).copyWith( + showOldPassword: event.showOldPassword, + showNewPassword: event.showNewPassword, + showConfirmPassword: event.showConfirmPassword, + ), + ); + } +} diff --git a/lib/presentation/reset_password/bloc/reset_password_event.dart b/lib/presentation/reset_password/bloc/reset_password_event.dart new file mode 100644 index 00000000..2d734289 --- /dev/null +++ b/lib/presentation/reset_password/bloc/reset_password_event.dart @@ -0,0 +1,22 @@ +part of 'reset_password_bloc.dart'; + +abstract class ResetPasswordEvent {} + +class ResetPasswordPressed extends ResetPasswordEvent { + final String oldPassword; + final String newPassword; + final String confirmPassword; + ResetPasswordPressed( + this.oldPassword, this.newPassword, this.confirmPassword); +} + +class ToggleObscureResetPassword extends ResetPasswordEvent { + final bool showOldPassword; + final bool showNewPassword; + final bool showConfirmPassword; + ToggleObscureResetPassword({ + required this.showOldPassword, + required this.showNewPassword, + required this.showConfirmPassword, + }); +} diff --git a/lib/presentation/reset_password/bloc/reset_password_state.dart b/lib/presentation/reset_password/bloc/reset_password_state.dart new file mode 100644 index 00000000..2d7e6738 --- /dev/null +++ b/lib/presentation/reset_password/bloc/reset_password_state.dart @@ -0,0 +1,45 @@ +part of 'reset_password_bloc.dart'; + +abstract class ResetPasswordState extends Equatable { + const ResetPasswordState(); + + @override + List get props => []; +} + +class Loading extends ResetPasswordState {} + +class ResetPasswordSuccess extends ResetPasswordState { + const ResetPasswordSuccess(); +} + +class ResetPassword extends ResetPasswordState { + const ResetPassword({ + this.error, + required this.showOldPassword, + required this.showNewPassword, + required this.showConfirmPassword, + }); + final String? error; + final bool showOldPassword; + final bool showNewPassword; + final bool showConfirmPassword; + + ResetPassword copyWith({ + String? error, + bool? showOldPassword, + bool? showNewPassword, + bool? showConfirmPassword, + }) { + return ResetPassword( + error: error ?? this.error, + showOldPassword: showOldPassword ?? this.showOldPassword, + showNewPassword: showNewPassword ?? this.showNewPassword, + showConfirmPassword: showConfirmPassword ?? this.showConfirmPassword, + ); + } + + @override + List get props => + [error, showOldPassword, showNewPassword, showConfirmPassword]; +} diff --git a/lib/presentation/reset_password/components/reset_password_banner.dart b/lib/presentation/reset_password/components/reset_password_banner.dart new file mode 100644 index 00000000..01127950 --- /dev/null +++ b/lib/presentation/reset_password/components/reset_password_banner.dart @@ -0,0 +1,32 @@ +import 'package:appetizer/app_theme.dart'; +import 'package:appetizer/data/core/theme/dimensional/dimensional.dart'; +import 'package:appetizer/presentation/components/app_banner.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +class ResetPasswordBanner extends StatelessWidget { + const ResetPasswordBanner({super.key}); + + @override + Widget build(BuildContext context) { + return AppBanner( + height: 140.toAutoScaledHeight, + child: Row( + children: [ + IconButton( + onPressed: context.router.pop, + icon: const Icon( + Icons.arrow_back, + color: Colors.white, + ), + ), + Text( + "Reset Password", + style: AppTheme.headline1, + ), + ], + ), + // ), + ); + } +} diff --git a/lib/presentation/reset_password/reset_password_view.dart b/lib/presentation/reset_password/reset_password_view.dart new file mode 100644 index 00000000..4f53848c --- /dev/null +++ b/lib/presentation/reset_password/reset_password_view.dart @@ -0,0 +1,157 @@ +import 'package:appetizer/data/core/theme/dimensional/dimensional.dart'; +import 'package:appetizer/presentation/components/app_formfield.dart'; +import 'package:appetizer/presentation/components/loading_indicator.dart'; +import 'package:appetizer/presentation/login/components/login_button.dart'; +import 'package:appetizer/presentation/reset_password/bloc/reset_password_bloc.dart'; +import 'package:appetizer/presentation/reset_password/components/reset_password_banner.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +@RoutePage() +class ResetPasswordScreen extends StatelessWidget { + final TextEditingController _oldPasswordController = TextEditingController(); + final TextEditingController _newPasswordController = TextEditingController(); + final TextEditingController _confirmPasswordController = + TextEditingController(); + ResetPasswordScreen({super.key}); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => ResetPasswordBloc(userRepository: context.read()), + child: Scaffold( + backgroundColor: Colors.white, + body: Column( + children: [ + const ResetPasswordBanner(), + Expanded( + child: BlocConsumer( + listener: (context, state) { + if (state is ResetPassword && state.error != null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(state.error!), + backgroundColor: Colors.red, + ), + ); + } + if (state is ResetPasswordSuccess) { + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('Password reset successfully!'), + backgroundColor: Colors.green, + )); + context.router.pop(); + } + }, + builder: (context, state) { + if (state is ResetPassword) { + return SingleChildScrollView( + padding: 24.toHorizontalPadding, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppFormField( + controller: _oldPasswordController, + hintText: 'Old Password', + obscureText: !state.showOldPassword, + suffix: IconButton( + onPressed: () { + context.read().add( + ToggleObscureResetPassword( + showOldPassword: !state.showOldPassword, + showNewPassword: state.showNewPassword, + showConfirmPassword: + state.showConfirmPassword, + ), + ); + }, + icon: Icon( + state.showOldPassword + ? Icons.visibility + : Icons.visibility_off, + color: const Color(0xFF757575), + ), + ), + title: 'Enter your old password', + ), + 20.toVerticalSizedBox, + AppFormField( + controller: _newPasswordController, + hintText: 'New Password', + obscureText: !state.showNewPassword, + suffix: IconButton( + onPressed: () { + context.read().add( + ToggleObscureResetPassword( + showNewPassword: + !state.showNewPassword, + showOldPassword: + state.showOldPassword, + showConfirmPassword: + state.showConfirmPassword), + ); + }, + icon: Icon( + state.showNewPassword + ? Icons.visibility + : Icons.visibility_off, + color: const Color(0xFF757575), + ), + ), + title: 'Enter your new password', + ), + 20.toVerticalSizedBox, + AppFormField( + controller: _confirmPasswordController, + hintText: 'Confirm Password', + obscureText: !state.showConfirmPassword, + suffix: IconButton( + onPressed: () { + context.read().add( + ToggleObscureResetPassword( + showConfirmPassword: + !state.showConfirmPassword, + showOldPassword: state.showOldPassword, + showNewPassword: state.showNewPassword, + ), + ); + }, + icon: Icon( + state.showConfirmPassword + ? Icons.visibility + : Icons.visibility_off, + color: const Color(0xFF757575), + ), + ), + title: 'Confirm your new password', + ), + 20.toVerticalSizedBox, + Center( + child: LoginButton( + text: "Reset Password", + onPressed: () { + context.read().add( + ResetPasswordPressed( + _oldPasswordController.text, + _newPasswordController.text, + _confirmPasswordController.text)); + }, + ), + ), + ], + ), + ); + } + + return const Center(child: LoadingIndicator()); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/week_menu/components/DayDateBar/day_date_bar.dart b/lib/presentation/week_menu/components/DayDateBar/day_date_bar.dart index 3928ff85..4e43555d 100644 --- a/lib/presentation/week_menu/components/DayDateBar/day_date_bar.dart +++ b/lib/presentation/week_menu/components/DayDateBar/day_date_bar.dart @@ -179,7 +179,7 @@ class _DayDateBarPage extends StatelessWidget { } class DayDateBar extends StatelessWidget { - DayDateBar({Key? key}) : super(key: key); + DayDateBar({super.key}); static int initialPage = 11; final PageController _pageController = diff --git a/lib/presentation/week_menu/components/DayMenu/day_menu.dart b/lib/presentation/week_menu/components/DayMenu/day_menu.dart index a6911a05..9ab23dfe 100644 --- a/lib/presentation/week_menu/components/DayMenu/day_menu.dart +++ b/lib/presentation/week_menu/components/DayMenu/day_menu.dart @@ -7,10 +7,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class DayMenuWidget extends StatelessWidget { - const DayMenuWidget({ - required this.parentState, - Key? key, - }) : super(key: key); + const DayMenuWidget({required this.parentState, super.key}); final WeekMenuBlocDisplayState parentState; @@ -23,26 +20,24 @@ class DayMenuWidget extends StatelessWidget { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: [ - ...dayMenu.meals - .map( - // TODO: Write logic for ordering meals in order of breakfast, lunch, dinner, snack - (meal) => Padding( - padding: EdgeInsets.only( - bottom: 24.toAutoScaledHeight, - ), - child: MealCard( - dailyItems: meal.type == MealType.B - ? dailyItems.breakfast - : (meal.type == MealType.L - ? dailyItems.lunch - : (meal.type == MealType.D - ? dailyItems.dinner - : dailyItems.snack)), - meal: meal, - ), - ), - ) - .toList(), + ...dayMenu.meals.map( + // TODO: Write logic for ordering meals in order of breakfast, lunch, dinner, snack + (meal) => Padding( + padding: EdgeInsets.only( + bottom: 24.toAutoScaledHeight, + ), + child: MealCard( + dailyItems: meal.type == MealType.B + ? dailyItems.breakfast + : (meal.type == MealType.L + ? dailyItems.lunch + : (meal.type == MealType.D + ? dailyItems.dinner + : dailyItems.snack)), + meal: meal, + ), + ), + ), BlocSelector( selector: (state) => state.user!.isCheckedOut, builder: (context, val) { diff --git a/lib/presentation/week_menu/components/DayMenu/menu_card.dart b/lib/presentation/week_menu/components/DayMenu/menu_card.dart index e35b4de8..2d42bcf1 100644 --- a/lib/presentation/week_menu/components/DayMenu/menu_card.dart +++ b/lib/presentation/week_menu/components/DayMenu/menu_card.dart @@ -37,7 +37,7 @@ class FeedbackAndCouponWidget extends StatelessWidget { return Center( child: Container( height: 24.toAutoScaledHeight, - width: 88.toAutoScaledWidth, + width: 90.toAutoScaledWidth, padding: EdgeInsets.symmetric(horizontal: 8.toAutoScaledWidth), decoration: ShapeDecoration( color: AppTheme.white, diff --git a/pubspec.lock b/pubspec.lock index 12a85fb3..ce024ffd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,34 +5,42 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 url: "https://pub.dev" source: hosted - version: "61.0.0" + version: "64.0.0" _flutterfire_internals: dependency: transitive description: name: _flutterfire_internals - sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c" + sha256: f5628cd9c92ed11083f425fd1f8f1bc60ecdda458c81d73b143aeda036c35fe7 url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.16" analyzer: dependency: transitive description: name: analyzer - sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" url: "https://pub.dev" source: hosted - version: "5.13.0" + version: "6.2.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + url: "https://pub.dev" + source: hosted + version: "2.0.2" archive: dependency: transitive description: name: archive - sha256: "49b1fad315e57ab0bbc15bcbb874e83116a1d78f77ebd500a4af6c9407d6b28e" + sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" url: "https://pub.dev" source: hosted - version: "3.3.8" + version: "3.4.9" args: dependency: transitive description: @@ -53,18 +61,18 @@ packages: dependency: "direct main" description: name: auto_route - sha256: "02120972925a567c37921fa28ac7e90680c7095dd0e70711353737ec2727cdc6" + sha256: "82f8df1d177416bc6b7a449127d0270ff1f0f633a91f2ceb7a85d4f07c3affa1" url: "https://pub.dev" source: hosted - version: "7.4.0" + version: "7.8.4" auto_route_generator: dependency: "direct dev" description: name: auto_route_generator - sha256: d0555913cc54153c38b1dd4f69e0d6a623818ca7195e7c1437901d52b2596eec + sha256: "11067a3bcd643812518fe26c0c9ec073990286cabfd9d74b6da9ef9b913c4d22" url: "https://pub.dev" source: hosted - version: "7.1.1" + version: "7.3.2" bloc: dependency: "direct main" description: @@ -101,34 +109,34 @@ packages: dependency: transitive description: name: build_daemon - sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: a7417cc44d9edb3f2c8760000270c99dba8c72ff66d0146772b8326565780745 + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.2" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" + sha256: "67d591d602906ef9201caf93452495ad1812bea2074f04e25dbd7c133785821b" url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.4.7" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "6d6ee4276b1c5f34f21fdf39425202712d2be82019983d52f351c94aafbc2c41" + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 url: "https://pub.dev" source: hosted - version: "7.2.10" + version: "7.2.11" built_collection: dependency: transitive description: @@ -141,10 +149,10 @@ packages: dependency: transitive description: name: built_value - sha256: ff627b645b28fb8bdb69e645f910c2458fd6b65f6585c3a53e0626024897dedf + sha256: c9aabae0718ec394e5bc3c7272e6bb0dc0b32201a08fe185ec1d8401d3e39309 url: "https://pub.dev" source: hosted - version: "8.6.2" + version: "8.8.1" characters: dependency: transitive description: @@ -165,10 +173,10 @@ packages: dependency: transitive description: name: cli_util - sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7 + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 url: "https://pub.dev" source: hosted - version: "0.4.0" + version: "0.4.1" clock: dependency: transitive description: @@ -181,10 +189,10 @@ packages: dependency: transitive description: name: code_builder - sha256: "315a598c7fbe77f22de1c9da7cfd6fd21816312f16ffa124453b4fc679e540f1" + sha256: feee43a5c05e7b3199bb375a86430b8ada1b04104f2923d0e03cc01ca87b6d84 url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.9.0" collection: dependency: transitive description: @@ -229,10 +237,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.4" device_frame: dependency: transitive description: @@ -253,10 +261,10 @@ packages: dependency: "direct main" description: name: dio - sha256: ce75a1b40947fea0a0e16ce73337122a86762e38b982e1ccb909daa3b9bc4197 + sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3" url: "https://pub.dev" source: hosted - version: "5.3.2" + version: "5.4.0" equatable: dependency: "direct main" description: @@ -285,106 +293,106 @@ packages: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" firebase_analytics: dependency: "direct main" description: name: firebase_analytics - sha256: "82992b2e93e4752d30296a881f65dde6dfdc09671f9a8cf994fa5d453bd72bde" + sha256: "5e92d510eacd66c354718fd9cc8f66ffdfa025640b645c4742297fb973770508" url: "https://pub.dev" source: hosted - version: "10.4.5" + version: "10.7.4" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: b277ab49112ebc4e545c7fc4fdfab99f692f7cd0e35347f8ed6c85d52a87562c + sha256: "72977325a72af5ebb8e53b5c5533cb2e33eec481cd46210cfe5427f5efba55d8" url: "https://pub.dev" source: hosted - version: "3.6.5" + version: "3.8.4" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "3f05999c06294dbdc05f4afef2b8976e6f57eb449e6aaa07ff751784763a68e0" + sha256: "8b9710be7e292e2a5ad34fff449d4b668c5808fb339649e69181727a4534f579" url: "https://pub.dev" source: hosted - version: "0.5.4+5" + version: "0.5.5+11" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389 + sha256: "96607c0e829a581c2a483c658f04e8b159964c3bae2730f73297070bc85d40bb" url: "https://pub.dev" source: hosted - version: "2.15.1" + version: "2.24.2" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: b63e3be6c96ef5c33bdec1aab23c91eb00696f6452f0519401d640938c94cba2 + sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "5.0.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973" + sha256: d585bdf3c656c3f7821ba1bd44da5f13365d22fcecaf5eb75c4295246aaa83c0 url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.10.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "6c1a2a047d6f165b7c5f947467ac5138731a2af82c7af1c12d691dbb834f6b73" + sha256: "199fe8186a5370d1cf5ce0819191079afc305914e8f38715f5e23943940dfe2d" url: "https://pub.dev" source: hosted - version: "14.6.7" + version: "14.7.9" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: bcba58d28f8cda607a323240c6d314c2c62b62ebfbb0f2d704ebefef07b52b5f + sha256: "54e283a0e41d81d854636ad0dad73066adc53407a60a7c3189c9656e2f1b6107" url: "https://pub.dev" source: hosted - version: "4.5.6" + version: "4.5.18" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "962d09ec9dfa486cbbc218258ad41e8ec7997a2eba46919049496e1cafd960c5" + sha256: "90dc7ed885e90a24bb0e56d661d4d2b5f84429697fd2cbb9e5890a0ca370e6f4" url: "https://pub.dev" source: hosted - version: "3.5.6" + version: "3.5.18" firebase_remote_config: dependency: "direct main" description: name: firebase_remote_config - sha256: e926dc7233aa3289b50e86a8d619ef9ccb5bfd7e0137c292fc9b167f9cd050f4 + sha256: "60fc92273d1db338a6fad1839c42dedc4ad64f812043acad0cbb200702f5c9ce" url: "https://pub.dev" source: hosted - version: "4.2.5" + version: "4.3.8" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface - sha256: "505e116a769ba91a5a987b063bbae8a89ab80d0fe933b48462321292ebd54332" + sha256: "41813ef8dfbc40ef7a59a73f9e5acef2608dbcb2933241b6c03d52e90677040f" url: "https://pub.dev" source: hosted - version: "1.4.5" + version: "1.4.16" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web - sha256: ac400c490c789323e9cad1958d0187e2f03e13ca432cb4f8977c00a5ed213695 + sha256: "089e92f333c2fb2c05c640c80fecea9d1e06dada0ba85efe34a580987ef94a0a" url: "https://pub.dev" source: hosted - version: "1.4.5" + version: "1.4.16" fixnum: dependency: transitive description: @@ -410,10 +418,58 @@ packages: dependency: "direct main" description: name: flutter_inappwebview - sha256: f73505c792cf083d5566e1a94002311be497d984b5607f25be36d685cf6361cf + sha256: "3e9a443a18ecef966fb930c3a76ca5ab6a7aafc0c7b5e14a4a850cf107b09959" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: fd4db51e46f49b140d83a3206851432c54ea920b381137c0ba82d0cf59be1dee + url: "https://pub.dev" + source: hosted + version: "1.0.12" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" url: "https://pub.dev" source: hosted - version: "5.7.2+3" + version: "1.1.1" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: f363577208b97b10b319cd0c428555cd8493e88b468019a8c5635a0e4312bd0f + url: "https://pub.dev" + source: hosted + version: "1.0.13" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: b55b9e506c549ce88e26580351d2c71d54f4825901666bd6cfa4be9415bb2636 + url: "https://pub.dev" + source: hosted + version: "1.0.11" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: "545fd4c25a07d2775f7d5af05a979b2cac4fbf79393b0a7f5d33ba39ba4f6187" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: d8c680abfb6fec71609a700199635d38a744df0febd5544c5a020bd73de8ee07 + url: "https://pub.dev" + source: hosted + version: "1.0.8" flutter_launcher_icons: dependency: "direct dev" description: @@ -426,10 +482,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "3.0.1" flutter_localizations: dependency: transitive description: flutter @@ -439,10 +495,10 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: ecff62b3b893f2f665de7e4ad3de89f738941fcfcaaba8ee601e749efafa4698 + sha256: "9cdb5d9665dab5d098dc50feab74301c2c228cd02ca25c9b546ab572cebcd6af" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.9" flutter_screenutil: dependency: "direct main" description: @@ -455,18 +511,18 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338" + sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c url: "https://pub.dev" source: hosted - version: "2.0.7" + version: "2.0.9" flutter_svg_provider: dependency: "direct main" description: name: flutter_svg_provider - sha256: "13d85033c6ae63c8073268f9c5c3c74e5de178224183eaff1d47f08f70c59fcc" + sha256: cda47ab350671ba51ae4605d48f4c82fa5a2c399d22ebda367c1b407234c5048 url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.7" flutter_test: dependency: "direct dev" description: flutter @@ -481,18 +537,18 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c" + sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1 url: "https://pub.dev" source: hosted - version: "8.2.2" + version: "8.2.4" freezed: dependency: "direct dev" description: name: freezed - sha256: "2df89855fe181baae3b6d714dc3c4317acf4fccd495a6f36e5e00f24144c6c3b" + sha256: "6c5031daae12c7072b3a87eff98983076434b4889ef2a44384d0cae3f82372ba" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.6" freezed_annotation: dependency: "direct main" description: @@ -521,18 +577,18 @@ packages: dependency: "direct main" description: name: get - sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a" + sha256: e4e7335ede17452b391ed3b2ede016545706c01a02292a6c97619705e7d2a85e url: "https://pub.dev" source: hosted - version: "4.6.5" + version: "4.6.6" get_it: dependency: "direct main" description: name: get_it - sha256: "529de303c739fca98cd7ece5fca500d8ff89649f1bb4b4e94fb20954abcd7468" + sha256: f79870884de16d689cf9a7d15eedf31ed61d750e813c538a6efb92660fea83c3 url: "https://pub.dev" source: hosted - version: "7.6.0" + version: "7.6.4" glob: dependency: transitive description: @@ -545,10 +601,10 @@ packages: dependency: "direct main" description: name: google_fonts - sha256: e20ff62b158b96f392bfc8afe29dee1503c94fbea2cbe8186fd59b756b8ae982 + sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "6.1.0" graphs: dependency: transitive description: @@ -577,10 +633,10 @@ packages: dependency: transitive description: name: http - sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" + sha256: d4872660c46d929f6b8a9ef4e7a7eff7e49bbf0c4ec3f385ee32df5119175139 url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" http_multi_server: dependency: transitive description: @@ -601,10 +657,10 @@ packages: dependency: transitive description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.3" intl: dependency: "direct main" description: @@ -649,10 +705,10 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" logging: dependency: transitive description: @@ -693,14 +749,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + mixpanel_flutter: + dependency: "direct main" + description: + name: mixpanel_flutter + sha256: "5dc993ade5eaad51ebb6c91230971a3443ac30a3d1d24399bc3db74c5705d400" + url: "https://pub.dev" + source: hosted + version: "2.2.0" month_picker_dialog: dependency: "direct main" description: name: month_picker_dialog - sha256: da384937255c898ddbd60416bc27d85bfb7940992c0579bb12e5ed16aba9239c + sha256: a9cb49811d9b1c859211f70fe8e3542c86c4fc3e3667df7fca9526ceee4af675 url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.4.0" nested: dependency: transitive description: @@ -721,10 +785,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a" + sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.0.1" package_info_plus_platform_interface: dependency: transitive description: @@ -761,10 +825,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "6b8b19bd80da4f11ce91b2d1fb931f3006911477cec227cce23d3253d80df3f1" + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.2.2" path_provider_foundation: dependency: transitive description: @@ -801,26 +865,26 @@ packages: dependency: transitive description: name: petitparser - sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "6.0.2" platform: dependency: transitive description: name: platform - sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.7" pointycastle: dependency: transitive description: @@ -837,14 +901,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + protobuf: + dependency: transitive + description: + name: protobuf + sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d" + url: "https://pub.dev" + source: hosted + version: "3.1.0" provider: dependency: transitive description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.1" pub_semver: dependency: transitive description: @@ -865,50 +937,50 @@ packages: dependency: "direct main" description: name: retrofit - sha256: "5eedbd8f73697f190dabc88520e0bcf2d3b2d9b9ad5c837f1dbb3ee6172d7709" + sha256: "04ed77c82cadb655bb9357e8d0cb9da72ff704749a2d0cfe6540dd1f1f7ca4b9" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.3" retrofit_generator: dependency: "direct dev" description: name: retrofit_generator - sha256: "9499eb46b3657a62192ddbc208ff7e6c6b768b19e83c1ee6f6b119c864b99690" + sha256: "40f166d6e07fc3c8f77700093767fd0c1b4742d27fe049ecb15cea1245284bd8" url: "https://pub.dev" source: hosted - version: "7.0.8" + version: "8.0.6" sentry: dependency: transitive description: name: sentry - sha256: "39c23342fc96105da449914f7774139a17a0ca8a4e70d9ad5200171f7e47d6ba" + sha256: "89e426587b0879e53c46a0aae0eb312696d9d2d803ba14b252a65cc24b1416a2" url: "https://pub.dev" source: hosted - version: "7.9.0" + version: "7.14.0" sentry_dio: dependency: "direct main" description: name: sentry_dio - sha256: df4c1eca92ab0a4b4e4ef67477a01d3fc898e9394c2675f9cf2b0a20285b1847 + sha256: b0ad68161625ee9bb45b687199e5fec4c55a0b0fe253cc5b47e773b7c53ca25e url: "https://pub.dev" source: hosted - version: "7.9.0" + version: "7.14.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: ff68ab31918690da004a42e20204242a3ad9ad57da7e2712da8487060ac9767f + sha256: fd089ee4e75a927be037c56815a0a54af5a519f52b803a5ffecb589bb36e2401 url: "https://pub.dev" source: hosted - version: "7.9.0" + version: "7.14.0" shared_preferences: dependency: transitive description: name: shared_preferences - sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_android: dependency: transitive description: @@ -929,10 +1001,10 @@ packages: dependency: transitive description: name: shared_preferences_linux - sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: @@ -945,18 +1017,18 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shelf: dependency: transitive description: @@ -982,10 +1054,10 @@ packages: dependency: transitive description: name: source_gen - sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0" source_helper: dependency: transitive description: @@ -1002,6 +1074,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -1086,98 +1166,98 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "38d8e783681bc342e92dc9799cbe4421d08c4d210a67ee9d61d0f7310491a465" + sha256: e9aa5ea75c84cf46b3db4eea212523591211c3cf2e13099ee4ec147f54201c86 url: "https://pub.dev" source: hosted - version: "6.1.13" + version: "6.2.2" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: ef7e34951ffa963fb7a65928deeb38d40fb3c5975baf93c1d631341ff7f2650a + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" url: "https://pub.dev" source: hosted - version: "6.0.39" + version: "6.2.0" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7c65021d5dee51813d652357bc65b8dd4a6177082a9966bc8ba6ee477baa795f" + sha256: bba3373219b7abb6b5e0d071b0fe66dfbe005d07517a68e38d4fc3638f35c6d3 url: "https://pub.dev" source: hosted - version: "6.1.5" + version: "6.2.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: b651aad005e0cb06a01dbd84b428a301916dc75f0e7ea6165f80057fee2d8e8e + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.1.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: b55486791f666e62e0e8ff825e58a023fd6b1f71c49926483f1128d3bbd8fe88 + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 url: "https://pub.dev" source: hosted - version: "3.0.7" + version: "3.1.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "4d0dae953f80dc06fa24c58d0f8381302139c22c2dad301417787ad96f5f73bd" + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "2942294a500b4fa0b918685aff406773ba0a4cd34b7f42198742a94083020ce5" + sha256: "7286aec002c8feecc338cc33269e96b73955ab227456e9fb2a91f7fab8a358e9" url: "https://pub.dev" source: hosted - version: "2.0.20" + version: "2.2.2" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "95fef3129dc7cfaba2bc3d5ba2e16063bb561fc6d78e63eee16162bc70029069" + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.1.1" uuid: dependency: transitive description: name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + sha256: "22c94e5ad1e75f9934b766b53c742572ee2677c56bc871d850a57dad0f82127f" url: "https://pub.dev" source: hosted - version: "3.0.7" + version: "4.2.2" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f" + sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" url: "https://pub.dev" source: hosted - version: "1.1.7" + version: "1.1.9+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f" + sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" url: "https://pub.dev" source: hosted - version: "1.1.7" + version: "1.1.9+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e" + sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 url: "https://pub.dev" source: hosted - version: "1.1.7" + version: "1.1.9+1" vector_math: dependency: transitive description: @@ -1214,10 +1294,10 @@ packages: dependency: transitive description: name: win32 - sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa" + sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 url: "https://pub.dev" source: hosted - version: "5.0.7" + version: "5.1.1" xdg_directories: dependency: transitive description: @@ -1230,10 +1310,10 @@ packages: dependency: transitive description: name: xml - sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.5.0" yaml: dependency: transitive description: @@ -1243,5 +1323,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=3.13.0" + dart: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index 164caaa7..3588c6ae 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.2 - auto_route: 7.4.0 + auto_route: ^7.4.0 flutter_bloc: ^8.1.3 equatable: ^2.0.5 firebase_analytics: ^10.4.4 @@ -23,7 +23,7 @@ dependencies: firebase_remote_config: ^4.2.4 flutter_screenutil: ^5.7.0 get: ^4.6.5 - package_info_plus: ^4.1.0 + package_info_plus: ^5.0.1 get_it: ^7.6.0 intl: ^0.18.0 path_provider: ^2.0.15 @@ -31,7 +31,7 @@ dependencies: fluttertoast: ^8.2.2 fswitch_nullsafety: ^2.0.2 flutter_svg: ^2.0.7 - google_fonts: ^5.1.0 + google_fonts: ^6.1.0 month_picker_dialog: ^2.0.2 hive: ^2.2.3 device_preview: ^1.1.0 @@ -43,21 +43,22 @@ dependencies: sentry_dio: ^7.9.0 flutter_svg_provider: ^1.0.6 url_launcher: ^6.1.12 - flutter_inappwebview: ^5.7.2+3 + flutter_inappwebview: ^6.0.0 flutter_native_splash: ^2.3.2 + mixpanel_flutter: ^2.2.0 dev_dependencies: - auto_route_generator: 7.1.1 + auto_route_generator: ^7.1.2 build_runner: ">2.3.0 <4.0.0" json_serializable: ^6.7.1 freezed: ^2.4.1 - retrofit_generator: ^7.0.8 + retrofit_generator: ^8.0.6 flutter_launcher_icons: ^0.13.1 flutter_test: sdk: flutter - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.1 flutter_icons: image_path_android: "assets/icons/logo_rounded.png" diff --git a/shorebird.yaml b/shorebird.yaml index a4cc3321..f55a35de 100644 --- a/shorebird.yaml +++ b/shorebird.yaml @@ -5,7 +5,7 @@ # This is the unique identifier assigned to your app. # Your app_id is not a secret and is just used to identify your app # when requesting patches from Shorebird's servers. -app_id: cf8ae0f2-10fa-4b6e-a629-bc322365fafa +app_id: 2c783fb5-a5d1-4ca2-a55f-fa9c82441a65 # auto_update controls if Shorebird should automatically update in the background on launch. # If auto_update: false, you will need to use package:shorebird_code_push to trigger updates.