From 34edc8832ca9b57ddc71584e5166e1800729af5f Mon Sep 17 00:00:00 2001 From: Azri Date: Tue, 27 Feb 2024 22:45:38 +0700 Subject: [PATCH 1/3] layout/home-header-widgets --- assets/locale/de.json | 4 +- assets/locale/en.json | 4 +- assets/locale/id.json | 4 +- assets/locale/ja.json | 4 +- .../lib/presentation/screens/main_screen.dart | 19 +- .../app/test/screens/main_screen_test.dart | 15 - .../core/assets/images/dummy_course_image.png | Bin 0 -> 112299 bytes .../lib/assetsmanager/assets_manager.dart | 1 + modules/core/lib/constants/constants.dart | 2 +- .../lib/presentation/screens/home_screen.dart | 281 ++++++++++++++++-- modules/home/pubspec.yaml | 1 + pubspec.lock | 12 +- 12 files changed, 289 insertions(+), 58 deletions(-) create mode 100644 modules/core/assets/images/dummy_course_image.png diff --git a/assets/locale/de.json b/assets/locale/de.json index 1e99161..43e0b88 100644 --- a/assets/locale/de.json +++ b/assets/locale/de.json @@ -19,5 +19,7 @@ "navBarItemHome": "Startseite", "navBarItemSearch": "Suche", "navBarItemMyCourse": "Meine Kurse", - "navBarItemProfile": "Profil" + "navBarItemProfile": "Profil", + "searchBarPlaceholderText": "Nach Fähigkeiten oder Technologiestapeln suchen", + "homeContinueLearningText": "Lernen fortsetzen" } \ No newline at end of file diff --git a/assets/locale/en.json b/assets/locale/en.json index 9d1d871..25f6c95 100644 --- a/assets/locale/en.json +++ b/assets/locale/en.json @@ -19,5 +19,7 @@ "navBarItemHome": "Home", "navBarItemSearch": "Search", "navBarItemMyCourse": "MyCourse", - "navBarItemProfile": "Profile" + "navBarItemProfile": "Profile", + "searchBarPlaceholderText": "Search by skills or tech stacks", + "homeContinueLearningText": "Continue Learning" } \ No newline at end of file diff --git a/assets/locale/id.json b/assets/locale/id.json index 9a79203..0fb78fb 100644 --- a/assets/locale/id.json +++ b/assets/locale/id.json @@ -19,5 +19,7 @@ "navBarItemHome": "Beranda", "navBarItemSearch": "Cari", "navBarItemMyCourse": "Kursus Saya", - "navBarItemProfile": "Profil" + "navBarItemProfile": "Profil", + "searchBarPlaceholderText": "Cari berdasarkan keahlian atau techstacks", + "homeContinueLearningText": "Lanjutkan Belajar" } \ No newline at end of file diff --git a/assets/locale/ja.json b/assets/locale/ja.json index 248698f..614d9ba 100644 --- a/assets/locale/ja.json +++ b/assets/locale/ja.json @@ -19,5 +19,7 @@ "navBarItemHome": "ホーム", "navBarItemSearch": "検索", "navBarItemMyCourse": "マイコース", - "navBarItemProfile": "プロフィール" + "navBarItemProfile": "プロフィール", + "searchBarPlaceholderText": "スキルや技術スタックで検索", + "homeContinueLearningText": "学習を続ける" } \ No newline at end of file diff --git a/modules/app/lib/presentation/screens/main_screen.dart b/modules/app/lib/presentation/screens/main_screen.dart index 13aff5a..c7c248b 100644 --- a/modules/app/lib/presentation/screens/main_screen.dart +++ b/modules/app/lib/presentation/screens/main_screen.dart @@ -24,12 +24,6 @@ class _MainScreenState extends State { return const HomeScreen(); } - Widget _buildSearchScreen() { - return const Center( - child: Text("Search Screen"), - ); - } - Widget _buildMyCourseScreen() { return const Center( child: Text("My Course Screen"), @@ -47,10 +41,8 @@ class _MainScreenState extends State { case 0: return _buildHomeScreen(); case 1: - return _buildSearchScreen(); - case 2: return _buildMyCourseScreen(); - case 3: + case 2: return _buildProfileScreen(); } return null; @@ -79,15 +71,6 @@ class _MainScreenState extends State { ), label: 'navBarItemHome'.tr(), ), - BottomNavigationBarItem( - icon: Container( - padding: EdgeInsets.only(top: 6.h), - child: const Icon( - Icons.explore_outlined, - ), - ), - label: 'navBarItemSearch'.tr(), - ), BottomNavigationBarItem( icon: Container( padding: EdgeInsets.only(top: 6.h), diff --git a/modules/app/test/screens/main_screen_test.dart b/modules/app/test/screens/main_screen_test.dart index 5feca42..eb29946 100644 --- a/modules/app/test/screens/main_screen_test.dart +++ b/modules/app/test/screens/main_screen_test.dart @@ -17,21 +17,6 @@ void main() { expect(find.byType(HomeScreen), findsOneWidget); }); - testWidgets('Switching to search screen via bottom navigation bar', - (WidgetTester tester) async { - await tester.pumpWidget( - const LocalizationTestApp( - child: MainScreen(), - ), - ); - - await tester.pumpAndSettle(); - - await tester.tap(find.byIcon(Icons.explore_outlined)); - await tester.pumpAndSettle(); - expect(find.text("Search Screen"), findsOneWidget); - }); - testWidgets('Switching to my course screen via bottom navigation bar', (WidgetTester tester) async { await tester.pumpWidget( diff --git a/modules/core/assets/images/dummy_course_image.png b/modules/core/assets/images/dummy_course_image.png new file mode 100644 index 0000000000000000000000000000000000000000..3acbd757771e8d7ae5c6482ad6c91a3b9d94172e GIT binary patch literal 112299 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

@35E4K>_+H3ER~vfAgMtcjDxi8R2a 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 Tn)A3`00000NkvXXu0mjf=Q globalNavigatorKey = diff --git a/modules/home/lib/presentation/screens/home_screen.dart b/modules/home/lib/presentation/screens/home_screen.dart index 73545d1..e6604fb 100644 --- a/modules/home/lib/presentation/screens/home_screen.dart +++ b/modules/home/lib/presentation/screens/home_screen.dart @@ -1,6 +1,8 @@ import 'package:cwa_core/core.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:percent_indicator/percent_indicator.dart'; class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); @@ -9,10 +11,12 @@ class HomeScreen extends StatelessWidget { Widget build(BuildContext context) { return SafeArea( child: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.w), + padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 12.h), child: const Column( children: [ HomeUserInfo(), + HomeSearchFormField(), + HomeContinueLessonSection(), ], ), ), @@ -25,26 +29,267 @@ class HomeUserInfo extends StatelessWidget { @override Widget build(BuildContext context) { - return Row( + return const Row( children: [ - Container( - width: 70.w, - height: 70.w, - decoration: const BoxDecoration( - color: bottomNavBackgroundColor, - shape: BoxShape.circle, - ), - padding: EdgeInsets.symmetric( - horizontal: 8.w, - vertical: 8.h, - ), - child: const Center( - child: CircleAvatar( - child: Text("A"), - ), + Expanded( + child: Row( + children: [ + HomeUserAvatar(), + HomeUserName(), + ], ), - ) + ), + HomeNotificationButton() ], ); } } + +class HomeUserAvatar extends StatelessWidget { + const HomeUserAvatar({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: 70.w, + height: 70.w, + decoration: const BoxDecoration( + color: bottomNavBackgroundColor, + shape: BoxShape.circle, + ), + padding: EdgeInsets.symmetric( + horizontal: 8.w, + vertical: 8.h, + ), + child: Center( + child: Image.network( + "https://ui-avatars.com/api/?rounded=true&name=AlqowyShaynaXo&background=EADDFF&color=21005D&size=256", + width: 54.w, + height: 54.h, + errorBuilder: (context, error, stackTrace) { + return Icon( + Icons.person, + size: 54.w, + color: const Color(0XFFEADDFF), + ); + }, + ), + ), + ); + } +} + +class HomeUserName extends StatelessWidget { + const HomeUserName({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: 100.w, + margin: EdgeInsets.only( + left: 12.w, + ), + child: Text( + "Alqowy Shayna Xo", + style: whiteTextStyle.copyWith( + fontWeight: semiBold, + fontSize: 18.sp, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ); + } +} + +class HomeNotificationButton extends StatelessWidget { + final bool isHaveNotification; + + const HomeNotificationButton({ + super.key, + this.isHaveNotification = false, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () {}, + child: Container( + width: 55.w, + height: 55.h, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: bottomNavBackgroundColor, + ), + child: Center( + child: SizedBox( + width: 24.w, + height: 24.w, + child: Stack( + children: [ + Icon( + Icons.notifications_outlined, + color: whiteColor, + size: 24.sp, + ), + if (isHaveNotification) + Positioned( + top: 3.h, + right: 3.w, + child: Container( + width: 8.w, + height: 8.h, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class HomeSearchFormField extends StatelessWidget { + const HomeSearchFormField({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(top: 30.h), + child: TextFormField( + cursorColor: whiteColor, + decoration: InputDecoration( + prefixIcon: Icon( + Icons.search, + color: whiteColor, + size: 24.sp, + ), + hintText: "searchBarPlaceholderText".tr(), + hintStyle: grayTextStyle.copyWith(fontSize: 16.sp), + isCollapsed: false, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(100.r), + borderSide: BorderSide.none, + ), + filled: true, + fillColor: bottomNavBackgroundColor, + contentPadding: EdgeInsets.symmetric( + vertical: 14.h, + horizontal: 20.w, + ), + ), + ), + ); + } +} + +class HomeContinueLessonSection extends StatelessWidget { + const HomeContinueLessonSection({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(top: 30.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "homeContinueLearningText".tr(), + style: whiteTextStyle.copyWith( + fontWeight: semiBold, + fontSize: 16.sp, + ), + ), + SizedBox( + height: 6.h, + ), + Container( + width: 345.w, + padding: EdgeInsets.symmetric( + horizontal: 20.w, + vertical: 20.h, + ), + decoration: BoxDecoration( + color: bottomNavBackgroundColor, + borderRadius: BorderRadius.circular(16.r), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 190.w, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Mastering Figma Auto Layout", + maxLines: 2, + style: whiteTextStyle.copyWith( + fontSize: 20.sp, + fontWeight: bold, + ), + ), + SizedBox( + height: 6.h, + ), + Text( + "UI/UX Design", + style: grayTextStyle, + ), + ], + ), + ), + Container( + width: 100.w, + height: 80.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.r), + image: DecorationImage( + image: AssetImage( + AssetsManager.dummyCourseImage, + package: "cwa_core", + ), + ), + ), + ), + ], + ), + SizedBox( + height: 16.h, + ), + LinearPercentIndicator( + barRadius: Radius.circular(100.r), + width: 260.w, + padding: EdgeInsets.zero, + percent: 11 / 69, + lineHeight: 8.h, + progressColor: primaryColor, + backgroundColor: grayColor, + trailing: Container( + margin: EdgeInsets.only(left: 6.w), + child: Text( + "11/69", + style: whiteTextStyle, + ), + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/modules/home/pubspec.yaml b/modules/home/pubspec.yaml index 4e714be..1338aa3 100644 --- a/modules/home/pubspec.yaml +++ b/modules/home/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: sdk: flutter flutter_screenutil: ^5.9.0 get_it: ^7.6.6 + percent_indicator: ^4.2.3 dev_dependencies: bloc_test: ^9.1.5 diff --git a/pubspec.lock b/pubspec.lock index e96415f..0ba4830 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -162,10 +162,10 @@ packages: dependency: transitive description: name: dio - sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3" + sha256: "49af28382aefc53562459104f64d16b9dfd1e8ef68c862d5af436cc8356ce5a8" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.4.1" easy_localization: dependency: "direct main" description: @@ -657,6 +657,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.1" + percent_indicator: + dependency: transitive + description: + name: percent_indicator + sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c + url: "https://pub.dev" + source: hosted + version: "4.2.3" platform: dependency: transitive description: From 7049c68f40986ab3f83c45ba25d47c87068e72a7 Mon Sep 17 00:00:00 2001 From: Azri Date: Wed, 28 Feb 2024 18:23:31 +0700 Subject: [PATCH 2/3] chore(auth-bloc):add-auth-bloc-merging-2-blocs --- .../sign_in_bloc.dart => auth/auth_bloc.dart} | 63 +++++- modules/auth/lib/bloc/auth/auth_event.dart | 39 ++++ modules/auth/lib/bloc/auth/auth_state.dart | 51 +++++ .../auth/lib/bloc/sign_in/sign_in_event.dart | 28 --- .../auth/lib/bloc/sign_in/sign_in_state.dart | 30 --- .../auth/lib/bloc/sign_up/sign_up_bloc.dart | 63 ------ .../auth/lib/bloc/sign_up/sign_up_event.dart | 19 -- .../auth/lib/bloc/sign_up/sign_up_state.dart | 23 -- .../auth/lib/data/enum/auth_type_enum.dart | 1 + .../presentation/screens/sign_in_screen.dart | 11 +- .../presentation/screens/sign_up_screen.dart | 9 +- .../widgets/google_sign_in_button.dart | 17 +- .../widgets/oauth_sign_in_button.dart | 8 +- ..._in_bloc_test.dart => auth_bloc_test.dart} | 192 ++++++++++++++--- modules/auth/test/bloc/sign_up_bloc_test.dart | 201 ------------------ .../test/screens/sign_in_screen_test.dart | 116 +++++----- .../test/screens/sign_up_screen_test.dart | 53 +++-- .../widgets/google_sign_in_button_test.dart | 69 +++--- .../widgets/oauth_sign_in_button_test.dart | 19 +- modules/core/lib/injector/bloc.dart | 13 +- modules/core/lib/router/app_router.dart | 9 +- 21 files changed, 467 insertions(+), 567 deletions(-) rename modules/auth/lib/bloc/{sign_in/sign_in_bloc.dart => auth/auth_bloc.dart} (53%) create mode 100644 modules/auth/lib/bloc/auth/auth_event.dart create mode 100644 modules/auth/lib/bloc/auth/auth_state.dart delete mode 100644 modules/auth/lib/bloc/sign_in/sign_in_event.dart delete mode 100644 modules/auth/lib/bloc/sign_in/sign_in_state.dart delete mode 100644 modules/auth/lib/bloc/sign_up/sign_up_bloc.dart delete mode 100644 modules/auth/lib/bloc/sign_up/sign_up_event.dart delete mode 100644 modules/auth/lib/bloc/sign_up/sign_up_state.dart create mode 100644 modules/auth/lib/data/enum/auth_type_enum.dart rename modules/auth/test/bloc/{sign_in_bloc_test.dart => auth_bloc_test.dart} (50%) delete mode 100644 modules/auth/test/bloc/sign_up_bloc_test.dart diff --git a/modules/auth/lib/bloc/sign_in/sign_in_bloc.dart b/modules/auth/lib/bloc/auth/auth_bloc.dart similarity index 53% rename from modules/auth/lib/bloc/sign_in/sign_in_bloc.dart rename to modules/auth/lib/bloc/auth/auth_bloc.dart index e347fe4..55086ed 100644 --- a/modules/auth/lib/bloc/sign_in/sign_in_bloc.dart +++ b/modules/auth/lib/bloc/auth/auth_bloc.dart @@ -1,27 +1,68 @@ -import 'package:auth/data/dto/auth/sign_in_dto.dart'; -import 'package:auth/data/dto/user/user_initialization_dto.dart'; -import 'package:auth/data/remote/auth_services.dart'; -import 'package:auth/data/remote/user_services.dart'; +import 'package:auth/auth.dart'; +import 'package:cwa_core/core.dart'; + import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; +part 'auth_event.dart'; +part 'auth_state.dart'; -part 'sign_in_event.dart'; -part 'sign_in_state.dart'; - -class SignInBloc extends Bloc { +class AuthBloc extends Bloc { final AuthService services; final UserService userService; - - SignInBloc({ + AuthBloc({ required this.services, required this.userService, - }) : super(SignInInitial()) { + }) : super(AuthInitial()) { + // Sign Up Events + on(onSignUp); + on(onSignUpByGoogle); + // Sign In Events on(onSignIn); on(onForgotPassword); on(onSignInByGoogle); } + Future onSignUp(SignUpRequest event, emit) async { + try { + emit(SignUpLoading()); + + final user = await services.signUp(event.dto); + await userService.initializeUser(UserInitializationDTO( + id: user.uid, + name: event.dto.name, + email: event.dto.email, + profilePicture: user.photoURL ?? getAvatarUrl(event.dto.name), + )); + + emit(SignUpSuccess()); + } catch (e) { + emit(SignUpFailed(error: e.toString())); + } + } + + Future onSignUpByGoogle(SignUpByGoogleRequest event, emit) async { + try { + emit(SignUpLoading()); + + final user = await services.signInWithGoogle(); + await userService.initializeUser(UserInitializationDTO( + id: user.uid, + name: user.displayName!, + email: user.email!, + profilePicture: user.photoURL!, + )); + + emit(SignUpSuccess()); + } catch (e) { + emit( + SignUpFailed( + error: e.toString(), + ), + ); + } + } + Future onSignIn(SignInRequest event, emit) async { try { emit(SignInLoading()); diff --git a/modules/auth/lib/bloc/auth/auth_event.dart b/modules/auth/lib/bloc/auth/auth_event.dart new file mode 100644 index 0000000..973a770 --- /dev/null +++ b/modules/auth/lib/bloc/auth/auth_event.dart @@ -0,0 +1,39 @@ +part of 'auth_bloc.dart'; + +sealed class AuthEvent extends Equatable { + const AuthEvent(); + + @override + List get props => []; +} + +class SignUpRequest extends AuthEvent { + final SignUpDTO dto; + + const SignUpRequest({required this.dto}); + + @override + List get props => [dto]; +} + +class SignUpByGoogleRequest extends AuthEvent {} + +class SignInRequest extends AuthEvent { + final SignInDTO signInDTO; + + const SignInRequest({required this.signInDTO}); + + @override + List get props => [signInDTO]; +} + +class ForgotPasswordRequest extends AuthEvent { + final String email; + + const ForgotPasswordRequest({required this.email}); + + @override + List get props => [email]; +} + +class SignInByGoogleRequest extends AuthEvent {} diff --git a/modules/auth/lib/bloc/auth/auth_state.dart b/modules/auth/lib/bloc/auth/auth_state.dart new file mode 100644 index 0000000..54e2a95 --- /dev/null +++ b/modules/auth/lib/bloc/auth/auth_state.dart @@ -0,0 +1,51 @@ +part of 'auth_bloc.dart'; + +sealed class AuthState extends Equatable { + const AuthState(); + + @override + List get props => []; +} + +final class AuthInitial extends AuthState {} + +// Sign Up States +final class SignUpLoading extends AuthState {} + +final class SignUpFailed extends AuthState { + final String error; + + const SignUpFailed({required this.error}); + + @override + List get props => [error]; +} + +// Sign In States +final class SignUpSuccess extends AuthState {} + +final class SignInLoading extends AuthState {} + +final class SignInFailed extends AuthState { + final String error; + + const SignInFailed({required this.error}); + + @override + List get props => [error]; +} + +final class SignInSuccess extends AuthState {} + +final class ForgotPasswordLoading extends AuthState {} + +final class ForgotPasswordFailed extends AuthState { + final String error; + + const ForgotPasswordFailed({required this.error}); + + @override + List get props => [error]; +} + +final class ForgotPasswordSuccess extends AuthState {} diff --git a/modules/auth/lib/bloc/sign_in/sign_in_event.dart b/modules/auth/lib/bloc/sign_in/sign_in_event.dart deleted file mode 100644 index 7862347..0000000 --- a/modules/auth/lib/bloc/sign_in/sign_in_event.dart +++ /dev/null @@ -1,28 +0,0 @@ -part of 'sign_in_bloc.dart'; - -sealed class SignInEvent extends Equatable { - const SignInEvent(); - - @override - List get props => []; -} - -class SignInRequest extends SignInEvent { - final SignInDTO signInDTO; - - const SignInRequest({required this.signInDTO}); - - @override - List get props => [signInDTO]; -} - -class ForgotPasswordRequest extends SignInEvent { - final String email; - - const ForgotPasswordRequest({required this.email}); - - @override - List get props => [email]; -} - -class SignInByGoogleRequest extends SignInEvent {} diff --git a/modules/auth/lib/bloc/sign_in/sign_in_state.dart b/modules/auth/lib/bloc/sign_in/sign_in_state.dart deleted file mode 100644 index 73c21d4..0000000 --- a/modules/auth/lib/bloc/sign_in/sign_in_state.dart +++ /dev/null @@ -1,30 +0,0 @@ -part of 'sign_in_bloc.dart'; - -sealed class SignInState extends Equatable { - const SignInState(); - - @override - List get props => []; -} - -final class SignInInitial extends SignInState {} - -final class SignInLoading extends SignInState {} - -final class SignInFailed extends SignInState { - final String error; - - const SignInFailed({required this.error}); -} - -final class SignInSuccess extends SignInState {} - -final class ForgotPasswordLoading extends SignInState {} - -final class ForgotPasswordFailed extends SignInState { - final String error; - - const ForgotPasswordFailed({required this.error}); -} - -final class ForgotPasswordSuccess extends SignInState {} diff --git a/modules/auth/lib/bloc/sign_up/sign_up_bloc.dart b/modules/auth/lib/bloc/sign_up/sign_up_bloc.dart deleted file mode 100644 index 36918e0..0000000 --- a/modules/auth/lib/bloc/sign_up/sign_up_bloc.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:auth/data/dto/auth/sign_up_dto.dart'; -import 'package:auth/data/dto/user/user_initialization_dto.dart'; -import 'package:auth/data/remote/auth_services.dart'; -import 'package:auth/data/remote/user_services.dart'; -import 'package:cwa_core/core.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:equatable/equatable.dart'; - -part 'sign_up_event.dart'; -part 'sign_up_state.dart'; - -class SignUpBloc extends Bloc { - final AuthService services; - final UserService userService; - - SignUpBloc({ - required this.services, - required this.userService, - }) : super(SignUpInitial()) { - on(onSignUp); - on(onSignUpByGoogle); - } - - Future onSignUp(SignUpRequest event, emit) async { - try { - emit(SignUpLoading()); - - final user = await services.signUp(event.dto); - await userService.initializeUser(UserInitializationDTO( - id: user.uid, - name: event.dto.name, - email: event.dto.email, - profilePicture: user.photoURL ?? getAvatarUrl(event.dto.name), - )); - - emit(SignUpSuccess()); - } catch (e) { - emit(SignUpFailed(error: e.toString())); - } - } - - Future onSignUpByGoogle(SignUpByGoogleRequest event, emit) async { - try { - emit(SignUpLoading()); - - final user = await services.signInWithGoogle(); - await userService.initializeUser(UserInitializationDTO( - id: user.uid, - name: user.displayName!, - email: user.email!, - profilePicture: user.photoURL!, - )); - - emit(SignUpSuccess()); - } catch (e) { - emit( - SignUpFailed( - error: e.toString(), - ), - ); - } - } -} diff --git a/modules/auth/lib/bloc/sign_up/sign_up_event.dart b/modules/auth/lib/bloc/sign_up/sign_up_event.dart deleted file mode 100644 index bae703a..0000000 --- a/modules/auth/lib/bloc/sign_up/sign_up_event.dart +++ /dev/null @@ -1,19 +0,0 @@ -part of 'sign_up_bloc.dart'; - -sealed class SignUpEvent extends Equatable { - const SignUpEvent(); - - @override - List get props => []; -} - -class SignUpRequest extends SignUpEvent { - final SignUpDTO dto; - - const SignUpRequest({required this.dto}); - - @override - List get props => [dto]; -} - -class SignUpByGoogleRequest extends SignUpEvent {} diff --git a/modules/auth/lib/bloc/sign_up/sign_up_state.dart b/modules/auth/lib/bloc/sign_up/sign_up_state.dart deleted file mode 100644 index ec40319..0000000 --- a/modules/auth/lib/bloc/sign_up/sign_up_state.dart +++ /dev/null @@ -1,23 +0,0 @@ -part of 'sign_up_bloc.dart'; - -sealed class SignUpState extends Equatable { - const SignUpState(); - - @override - List get props => []; -} - -final class SignUpInitial extends SignUpState {} - -final class SignUpLoading extends SignUpState {} - -final class SignUpFailed extends SignUpState { - final String error; - - const SignUpFailed({required this.error}); - - // @override - // List get props => [error]; -} - -final class SignUpSuccess extends SignUpState {} diff --git a/modules/auth/lib/data/enum/auth_type_enum.dart b/modules/auth/lib/data/enum/auth_type_enum.dart new file mode 100644 index 0000000..8b64c54 --- /dev/null +++ b/modules/auth/lib/data/enum/auth_type_enum.dart @@ -0,0 +1 @@ +enum AuthType { signIn, signUp } diff --git a/modules/auth/lib/presentation/screens/sign_in_screen.dart b/modules/auth/lib/presentation/screens/sign_in_screen.dart index ad75f8a..638baef 100644 --- a/modules/auth/lib/presentation/screens/sign_in_screen.dart +++ b/modules/auth/lib/presentation/screens/sign_in_screen.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/sign_in/sign_in_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; +import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:cwa_core/core.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -16,7 +17,7 @@ class SignInScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( + return BlocListener( listener: (context, state) { if (state is SignInFailed) { context.loaderOverlay.hide(); @@ -62,7 +63,7 @@ class SignInScreen extends StatelessWidget { BuildCreateAccountButton(), OrDividerWidget(), OAuthSignInButton( - bloc: SignInBloc, + type: AuthType.signIn, ), ], ), @@ -168,7 +169,7 @@ class BuildSignInFormsState extends State { onTap: () { if (emailController.text.isNotEmpty) { context - .read() + .read() .add(ForgotPasswordRequest(email: emailController.text)); } else { FlushbarUtils.showFlushbar( @@ -205,7 +206,7 @@ class BuildSignInButton extends StatelessWidget { onTap: () { if (emailController.text.isNotEmpty && passwordController.text.isNotEmpty) { - context.read().add(SignInRequest( + context.read().add(SignInRequest( signInDTO: SignInDTO( email: emailController.text, password: passwordController.text))); diff --git a/modules/auth/lib/presentation/screens/sign_up_screen.dart b/modules/auth/lib/presentation/screens/sign_up_screen.dart index 808a665..b71be96 100644 --- a/modules/auth/lib/presentation/screens/sign_up_screen.dart +++ b/modules/auth/lib/presentation/screens/sign_up_screen.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/sign_up/sign_up_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; +import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:cwa_core/core.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -13,7 +14,7 @@ class SignUpScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( + return BlocListener( listener: (context, state) { if (state is SignUpFailed) { context.loaderOverlay.hide(); @@ -47,7 +48,7 @@ class SignUpScreen extends StatelessWidget { BuildHaveAccountButton(), OrDividerWidget(), OAuthSignInButton( - bloc: SignUpBloc, + type: AuthType.signUp, ), ], ), @@ -197,7 +198,7 @@ class BuildSignUpButton extends StatelessWidget { password: passwordController.text, ); - context.read().add( + context.read().add( SignUpRequest( dto: dto, ), diff --git a/modules/auth/lib/presentation/widgets/google_sign_in_button.dart b/modules/auth/lib/presentation/widgets/google_sign_in_button.dart index 5e09dad..6315e8b 100644 --- a/modules/auth/lib/presentation/widgets/google_sign_in_button.dart +++ b/modules/auth/lib/presentation/widgets/google_sign_in_button.dart @@ -1,5 +1,5 @@ -import 'package:auth/bloc/sign_in/sign_in_bloc.dart'; -import 'package:auth/bloc/sign_up/sign_up_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; +import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:cwa_core/core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -8,8 +8,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; class GoogleSignInButton extends StatelessWidget { final EdgeInsets? padding; final EdgeInsets? margin; - final Type? bloc; - const GoogleSignInButton({super.key, this.padding, this.margin, this.bloc}); + final AuthType type; + const GoogleSignInButton( + {super.key, this.padding, this.margin, required this.type}); @override Widget build(BuildContext context) { @@ -18,11 +19,11 @@ class GoogleSignInButton extends StatelessWidget { margin: margin, child: InkWell( onTap: () { - if (bloc == SignInBloc) { - context.read().add(SignInByGoogleRequest()); + if (type == AuthType.signIn) { + context.read().add(SignInByGoogleRequest()); } - if (bloc == SignUpBloc) { - context.read().add(SignUpByGoogleRequest()); + if (type == AuthType.signUp) { + context.read().add(SignUpByGoogleRequest()); } }, child: Image.asset( diff --git a/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart b/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart index 765d95d..ce7d034 100644 --- a/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart +++ b/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart @@ -1,11 +1,13 @@ import 'package:auth/auth.dart'; +import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; class OAuthSignInButton extends StatelessWidget { - final Type? bloc; - const OAuthSignInButton({super.key, this.bloc}); + final AuthType type; + + const OAuthSignInButton({super.key, required this.type}); @override Widget build(BuildContext context) { @@ -16,7 +18,7 @@ class OAuthSignInButton extends StatelessWidget { } return GoogleSignInButton( - bloc: bloc, + type: type, padding: EdgeInsets.only(top: 30.h), ); } diff --git a/modules/auth/test/bloc/sign_in_bloc_test.dart b/modules/auth/test/bloc/auth_bloc_test.dart similarity index 50% rename from modules/auth/test/bloc/sign_in_bloc_test.dart rename to modules/auth/test/bloc/auth_bloc_test.dart index 6c6b516..1cf2077 100644 --- a/modules/auth/test/bloc/sign_in_bloc_test.dart +++ b/modules/auth/test/bloc/auth_bloc_test.dart @@ -1,5 +1,6 @@ -import 'package:auth/bloc/sign_in/sign_in_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; import 'package:auth/data/dto/auth/sign_in_dto.dart'; +import 'package:auth/data/dto/auth/sign_up_dto.dart'; import 'package:auth/data/dto/user/user_initialization_dto.dart'; import 'package:auth/data/remote/auth_services.dart'; import 'package:auth/data/remote/user_services.dart'; @@ -32,7 +33,7 @@ class MockUser extends Mock implements User { } void main() { - late SignInBloc signInBloc; + late AuthBloc authBloc; late AuthService mockAuthService; late UserService mockUserService; late GetIt getIt; @@ -41,6 +42,9 @@ void main() { registerFallbackValue( const SignInDTO(email: "email", password: "password"), ); + registerFallbackValue( + const SignUpDTO(name: "name", email: "email", password: "password"), + ); registerFallbackValue( const UserInitializationDTO( name: "name", @@ -58,18 +62,18 @@ void main() { mockAuthService = getIt(); mockUserService = getIt(); - signInBloc = SignInBloc( + authBloc = AuthBloc( services: mockAuthService, userService: mockUserService, ); }); tearDown(() { - signInBloc.close(); + authBloc.close(); getIt.reset(); }); - group("Sign In Bloc Test", () { + group("Auth Bloc Test Group (Sign In)", () { SignInDTO signInDTO = const SignInDTO( email: "email", password: "password", @@ -92,7 +96,7 @@ void main() { expect(event1, isNot(equals(event2))); }); - blocTest( + blocTest( "emits [SignInLoading, SignInSuccess] when SignInRequest is added successfully", build: () { when(() => mockAuthService.signInWithEmailAndPassword(any())) @@ -100,7 +104,7 @@ void main() { (_) async => MockUser(), ); - return signInBloc; + return authBloc; }, act: (bloc) => bloc.add(SignInRequest(signInDTO: signInDTO)), expect: () => [ @@ -109,26 +113,26 @@ void main() { ], ); - blocTest( + blocTest( "emits [SignInLoading, SignInFailed] when signInService throws an exception", build: () { when(() => mockAuthService.signInWithEmailAndPassword(any())).thenThrow( - FirebaseException( - plugin: "FirebaseAuthException", + FirebaseAuthException( message: "Failed To Sign In", + code: '401', ), ); - return signInBloc; + return authBloc; }, act: (bloc) => bloc.add(SignInRequest(signInDTO: signInDTO)), expect: () => [ SignInLoading(), - const SignInFailed(error: "Failed To Sign In"), + const SignInFailed(error: "[firebase_auth/401] Failed To Sign In"), ], ); - blocTest( + blocTest( "emits [SignInLoading, SignInSuccess] when SignInByGoogleRequest is added successfully", build: () { when(() => mockAuthService.signInWithGoogle()).thenAnswer( @@ -137,7 +141,7 @@ void main() { when(() => mockUserService.initializeUser(any())) .thenAnswer((_) async {}); - return signInBloc; + return authBloc; }, act: (bloc) => bloc.add(SignInByGoogleRequest()), expect: () => [ @@ -146,29 +150,29 @@ void main() { ], ); - blocTest( + blocTest( "emits [SignInLoading, SignInSuccess] when SignInByGoogleRequest throws an exception", build: () { when(() => mockAuthService.signInWithGoogle()).thenThrow( - FirebaseException( - plugin: "FirebaseAuthException", + FirebaseAuthException( message: "Failed To Sign In", + code: '401', ), ); when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { return; }); - return signInBloc; + return authBloc; }, act: (bloc) => bloc.add(SignInByGoogleRequest()), expect: () => [ SignInLoading(), - const SignInFailed(error: "Failed To Sign In"), + const SignInFailed(error: "[firebase_auth/401] Failed To Sign In"), ], ); - blocTest( + blocTest( "emits [SignInLoading, SignInSuccess] when SignInByGoogleRequest userinitialization throws an exception", build: () { when(() => mockAuthService.signInWithGoogle()).thenAnswer( @@ -177,7 +181,7 @@ void main() { when(() => mockUserService.initializeUser(any())) .thenThrow("Internal Server Error"); - return signInBloc; + return authBloc; }, act: (bloc) => bloc.add(SignInByGoogleRequest()), expect: () => [ @@ -186,7 +190,7 @@ void main() { ], ); - blocTest( + blocTest( "emits [ForgotPasswordLoading,ForgotPasswordSuccess] when ForgotPasswordRequest is added successfully", build: () { when(() => mockAuthService.sendPasswordResetEmail(any())) @@ -194,7 +198,7 @@ void main() { return; }); - return signInBloc; + return authBloc; }, act: (bloc) => bloc.add(const ForgotPasswordRequest(email: "email")), expect: () => [ @@ -203,25 +207,157 @@ void main() { ], ); - blocTest( + blocTest( "emits [ForgotPasswordLoading,ForgotPasswordFailed] when ForgotPasswordRequest is failed", build: () { when(() => mockAuthService.sendPasswordResetEmail(any())).thenThrow( - FirebaseException( - plugin: "FirebaseAuthException", + FirebaseAuthException( + code: "401", message: "Failed To Send Reset Password Email", ), ); - return signInBloc; + return authBloc; }, act: (bloc) => bloc.add(const ForgotPasswordRequest(email: "email")), expect: () => [ ForgotPasswordLoading(), const ForgotPasswordFailed( - error: "Failed To Send Reset Password Email", + error: "[firebase_auth/401] Failed To Send Reset Password Email", ), ], ); }); + + group("Auth Bloc Test Group (Sign Up)", () { + SignUpDTO signUpDTO = + const SignUpDTO(name: "name", email: "email", password: "password"); + + test("SignUpEvent instances with same type are equal", () { + const event1 = SignUpRequest( + dto: SignUpDTO(name: "name", email: "email", password: "password")); + const event2 = SignUpRequest( + dto: SignUpDTO(name: "name", email: "email", password: "password")); + + expect(event1, equals(event2)); + }); + + test("SignUpEvent instances with same type are not equal", () { + const event1 = SignUpRequest( + dto: SignUpDTO(name: "name", email: "email", password: "password")); + final event2 = SignUpByGoogleRequest(); + + expect(event1, isNot(equals(event2))); + }); + + blocTest( + "emits [SignUpLoading, SignUpSuccess] when SignUpRequest is added successfully", + build: () { + when(() => mockAuthService.signUp(any())) + .thenAnswer((_) async => MockUser()); + when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { + return; + }); + return authBloc; + }, + act: (bloc) => bloc.add(SignUpRequest(dto: signUpDTO)), + expect: () => [ + SignUpLoading(), + SignUpSuccess(), + ], + ); + + blocTest( + "emits [SignUpLoading, SignUpFailed] when signupService throws an exception", + build: () { + when(() => mockAuthService.signUp(any())).thenThrow( + FirebaseAuthException( + code: "401", + message: "Failed To Sign Up", + ), + ); + when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { + return; + }); + return authBloc; + }, + act: (bloc) => bloc.add(SignUpRequest(dto: signUpDTO)), + expect: () => [ + SignUpLoading(), + const SignUpFailed( + error: "[firebase_auth/401] Failed To Sign Up", + ), + ], + ); + + blocTest( + "emits [SignUpLoading, SignUpFailed] when Initialize User Service throws an exception", + build: () { + when(() => mockAuthService.signUp(any())) + .thenAnswer((_) async => MockUser()); + when(() => mockUserService.initializeUser(any())) + .thenThrow("Internal Server Error"); + return authBloc; + }, + act: (bloc) => bloc.add(SignUpRequest(dto: signUpDTO)), + expect: () => [ + SignUpLoading(), + const SignUpFailed(error: "Internal Server Error"), + ], + ); + + blocTest( + "emits [SignUpLoading, SignUpSuccess] when SignUpByGoogleRequest is added successfully", + build: () { + when(() => mockAuthService.signInWithGoogle()) + .thenAnswer((_) async => MockUser()); + when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { + return; + }); + return authBloc; + }, + act: (bloc) => bloc.add(SignUpByGoogleRequest()), + expect: () => [ + SignUpLoading(), + SignUpSuccess(), + ], + ); + + blocTest( + "emits [SignUpLoading, SignUpFailed] when signInWithGoogle is Throw Error", + build: () { + when(() => mockAuthService.signInWithGoogle()).thenThrow( + FirebaseAuthException( + code: "401", + message: "Failed To Sign Up", + ), + ); + when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { + return; + }); + return authBloc; + }, + act: (bloc) => bloc.add(SignUpByGoogleRequest()), + expect: () => [ + SignUpLoading(), + const SignUpFailed(error: "[firebase_auth/401] Failed To Sign Up"), + ], + ); + + blocTest( + "emits [SignUpLoading, SignUpFailed] SignUpWithGoogle when Initialize User Service is Throw Error", + build: () { + when(() => mockAuthService.signInWithGoogle()) + .thenAnswer((_) async => MockUser()); + when(() => mockUserService.initializeUser(any())) + .thenThrow("Internal Server Error"); + return authBloc; + }, + act: (bloc) => bloc.add(SignUpByGoogleRequest()), + expect: () => [ + SignUpLoading(), + const SignUpFailed(error: "Internal Server Error"), + ], + ); + }); } diff --git a/modules/auth/test/bloc/sign_up_bloc_test.dart b/modules/auth/test/bloc/sign_up_bloc_test.dart deleted file mode 100644 index 3fe103a..0000000 --- a/modules/auth/test/bloc/sign_up_bloc_test.dart +++ /dev/null @@ -1,201 +0,0 @@ -import 'package:auth/bloc/sign_up/sign_up_bloc.dart'; -import 'package:auth/data/dto/auth/sign_up_dto.dart'; -import 'package:auth/data/dto/user/user_initialization_dto.dart'; -import 'package:auth/data/remote/auth_services.dart'; -import 'package:auth/data/remote/user_services.dart'; -import 'package:bloc_test/bloc_test.dart'; -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_it/get_it.dart'; -import 'package:mocktail/mocktail.dart'; - -class MockAuthService extends Mock implements AuthService {} - -class MockUserService extends Mock implements UserService {} - -class MockUser extends Mock implements User { - @override - final String uid; - @override - final String displayName; - @override - final String email; - @override - final String photoURL; - - MockUser({ - this.uid = 'id', - this.displayName = 'name', - this.email = 'email', - this.photoURL = 'url', - }); -} - -void main() { - late SignUpBloc signUpBloc; - late AuthService mockAuthService; - late UserService mockUserService; - late GetIt getIt; - - setUpAll(() { - registerFallbackValue( - const SignUpDTO(name: "name", email: "email", password: "password"), - ); - registerFallbackValue( - const UserInitializationDTO( - name: "name", - email: "email", - id: "id", - profilePicture: "example.com"), - ); - }); - - setUp(() { - getIt = GetIt.instance; - getIt.registerSingleton(MockAuthService()); - getIt.registerSingleton(MockUserService()); - - mockAuthService = getIt(); - mockUserService = getIt(); - - signUpBloc = SignUpBloc( - services: mockAuthService, - userService: mockUserService, - ); - }); - - tearDown(() { - signUpBloc.close(); - getIt.reset(); - }); - - group("Sign Up Bloc Test", () { - SignUpDTO signUpDTO = - const SignUpDTO(name: "name", email: "email", password: "password"); - - test("SignUpEvent instances with same type are equal", () { - const event1 = SignUpRequest( - dto: SignUpDTO(name: "name", email: "email", password: "password")); - const event2 = SignUpRequest( - dto: SignUpDTO(name: "name", email: "email", password: "password")); - - expect(event1, equals(event2)); - }); - - test("SignUpEvent instances with same type are not equal", () { - const event1 = SignUpRequest( - dto: SignUpDTO(name: "name", email: "email", password: "password")); - final event2 = SignUpByGoogleRequest(); - - expect(event1, isNot(equals(event2))); - }); - - blocTest( - "emits [SignUpLoading, SignUpSuccess] when SignUpRequest is added successfully", - build: () { - when(() => mockAuthService.signUp(any())) - .thenAnswer((_) async => MockUser()); - when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { - return; - }); - return signUpBloc; - }, - act: (bloc) => bloc.add(SignUpRequest(dto: signUpDTO)), - expect: () => [ - SignUpLoading(), - SignUpSuccess(), - ], - ); - - blocTest( - "emits [SignUpLoading, SignUpFailed] when signupService throws an exception", - build: () { - when(() => mockAuthService.signUp(any())).thenThrow( - FirebaseException( - plugin: "FirebaseAuthException", - message: "Failed To Sign Up", - ), - ); - when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { - return; - }); - return signUpBloc; - }, - act: (bloc) => bloc.add(SignUpRequest(dto: signUpDTO)), - expect: () => [ - SignUpLoading(), - const SignUpFailed(error: "Failed To Sign Up"), - ], - ); - - blocTest( - "emits [SignUpLoading, SignUpFailed] when Initialize User Service throws an exception", - build: () { - when(() => mockAuthService.signUp(any())) - .thenAnswer((_) async => MockUser()); - when(() => mockUserService.initializeUser(any())) - .thenThrow("Internal Server Error"); - return signUpBloc; - }, - act: (bloc) => bloc.add(SignUpRequest(dto: signUpDTO)), - expect: () => [ - SignUpLoading(), - const SignUpFailed(error: "Internal Server Error"), - ], - ); - - blocTest( - "emits [SignUpLoading, SignUpSuccess] when SignUpByGoogleRequest is added successfully", - build: () { - when(() => mockAuthService.signInWithGoogle()) - .thenAnswer((_) async => MockUser()); - when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { - return; - }); - return signUpBloc; - }, - act: (bloc) => bloc.add(SignUpByGoogleRequest()), - expect: () => [ - SignUpLoading(), - SignUpSuccess(), - ], - ); - - blocTest( - "emits [SignUpLoading, SignUpFailed] when signInWithGoogle is Throw Error", - build: () { - when(() => mockAuthService.signInWithGoogle()).thenThrow( - FirebaseException( - plugin: "FirebaseAuthException", - message: "Failed To Sign Up", - ), - ); - when(() => mockUserService.initializeUser(any())).thenAnswer((_) async { - return; - }); - return signUpBloc; - }, - act: (bloc) => bloc.add(SignUpByGoogleRequest()), - expect: () => [ - SignUpLoading(), - const SignUpFailed(error: "Failed To Sign Up"), - ], - ); - - blocTest( - "emits [SignUpLoading, SignUpFailed] SignUpWithGoogle when Initialize User Service is Throw Error", - build: () { - when(() => mockAuthService.signInWithGoogle()) - .thenAnswer((_) async => MockUser()); - when(() => mockUserService.initializeUser(any())) - .thenThrow("Internal Server Error"); - return signUpBloc; - }, - act: (bloc) => bloc.add(SignUpByGoogleRequest()), - expect: () => [ - SignUpLoading(), - const SignUpFailed(error: "Internal Server Error"), - ], - ); - }); -} diff --git a/modules/auth/test/screens/sign_in_screen_test.dart b/modules/auth/test/screens/sign_in_screen_test.dart index c12c340..64b9f4a 100644 --- a/modules/auth/test/screens/sign_in_screen_test.dart +++ b/modules/auth/test/screens/sign_in_screen_test.dart @@ -1,7 +1,7 @@ import 'package:app/presentation/widgets/custom_text_button.dart'; import 'package:app/presentation/widgets/custom_textform_field.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/sign_in/sign_in_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; import 'package:bloc_test/bloc_test.dart'; import 'package:cwa_core/test_helper/test.dart'; import 'package:firebase_auth/firebase_auth.dart'; @@ -11,7 +11,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; import 'package:mocktail/mocktail.dart'; - enum NavigatorAction { push, pop, replaced } class MockNavigatorObserver extends NavigatorObserver { @@ -45,7 +44,7 @@ class MockUser extends Mock implements User { MockUser({this.uid = 'id', this.displayName = 'name', this.email = 'email'}); } -class MockSignInBloc extends Mock implements SignInBloc { +class MockSignInBloc extends Mock implements AuthBloc { @override final AuthService services; @override @@ -57,7 +56,7 @@ class MockSignInBloc extends Mock implements SignInBloc { } void main() { - late SignInBloc signInBloc; + late AuthBloc authBloc; late AuthService mockAuthService; late UserService mockUserService; late GetIt getIt; @@ -84,14 +83,14 @@ void main() { mockAuthService = getIt(); mockUserService = getIt(); - signInBloc = MockSignInBloc( + authBloc = MockSignInBloc( services: mockAuthService, userService: mockUserService, ); }); tearDown(() { - signInBloc.close(); + authBloc.close(); getIt.reset(); }); group('SignInScreen Widgets Test', () { @@ -147,19 +146,19 @@ void main() { testWidgets('BuildSignInForms Widget Test ForgotPassword Success', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), ForgotPasswordLoading(), ForgotPasswordSuccess(), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( TestApp( - home: BlocProvider( - create: (context) => signInBloc, + home: BlocProvider( + create: (context) => authBloc, child: const Material( child: BuildSignInForms(), ), @@ -178,7 +177,7 @@ void main() { await tester.tap(find.text('forgotPasswordText'), warnIfMissed: false); verify( - () => signInBloc.add( + () => authBloc.add( const ForgotPasswordRequest(email: 'email@domain.com'), ), ).called(1); @@ -189,19 +188,19 @@ void main() { testWidgets('BuildSignInForms Widget Test ForgotPassword Failed', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), ForgotPasswordLoading(), const ForgotPasswordFailed(error: "Please emailHintText"), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( TestApp( home: BlocProvider( - create: (context) => signInBloc, + create: (context) => authBloc, child: const Material( child: BuildSignInForms(), ), @@ -218,19 +217,19 @@ void main() { testWidgets('BuildSignInButton Widget Test', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), SignInLoading(), SignInSuccess(), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( LocalizationTestApp( - child: BlocProvider( - create: (context) => signInBloc, + child: BlocProvider( + create: (context) => authBloc, child: Builder( builder: (context) { return Material( @@ -255,7 +254,7 @@ void main() { await tester.tap(find.byType(InkWell), warnIfMissed: false); verify( - () => signInBloc.add( + () => authBloc.add( const SignInRequest( signInDTO: SignInDTO(email: "email@domain.com", password: "password"), @@ -267,17 +266,17 @@ void main() { testWidgets('BuildSignInButton Widget Test Empty Forms', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( LocalizationTestApp( - child: BlocProvider( - create: (context) => signInBloc, + child: BlocProvider( + create: (context) => authBloc, child: Builder( builder: (context) { return Material( @@ -345,11 +344,11 @@ void main() { testWidgets('SignInScreen Widget Test', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( @@ -357,8 +356,8 @@ void main() { home: Material( child: MediaQuery( data: const MediaQueryData(textScaler: TextScaler.linear(0.5)), - child: BlocProvider.value( - value: signInBloc, + child: BlocProvider.value( + value: authBloc, child: SignInScreen(), ), ), @@ -371,18 +370,18 @@ void main() { testWidgets('SignInBlocListener Test', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), SignInLoading(), SignInSuccess(), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( - BlocProvider( - create: (context) => signInBloc, + BlocProvider( + create: (context) => authBloc, child: TestApp( routes: { '/': (_) => MediaQuery( @@ -402,7 +401,7 @@ void main() { await tester.pumpAndSettle(); - signInBloc.add( + authBloc.add( const SignInRequest( signInDTO: SignInDTO( email: "email", @@ -415,18 +414,18 @@ void main() { testWidgets('SignInBlocListener Test Failed Test', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), SignInLoading(), const SignInFailed(error: "Failed to Sign In"), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( - BlocProvider( - create: (context) => signInBloc, + BlocProvider( + create: (context) => authBloc, child: TestApp( routes: { '/': (_) => MediaQuery( @@ -446,7 +445,7 @@ void main() { await tester.pumpAndSettle(); - signInBloc.add( + authBloc.add( const SignInRequest( signInDTO: SignInDTO( email: "email", @@ -463,18 +462,15 @@ void main() { testWidgets('SignInBlocListener Test Failed Forgot Success', (WidgetTester tester) async { whenListen( - signInBloc, - Stream.fromIterable([ - SignInInitial(), - ForgotPasswordLoading(), - ForgotPasswordSuccess() - ]), - initialState: SignInInitial(), + authBloc, + Stream.fromIterable( + [AuthInitial(), ForgotPasswordLoading(), ForgotPasswordSuccess()]), + initialState: AuthInitial(), ); await tester.pumpWidget( - BlocProvider( - create: (context) => signInBloc, + BlocProvider( + create: (context) => authBloc, child: TestApp( routes: { '/': (_) => MediaQuery( @@ -494,7 +490,7 @@ void main() { await tester.pumpAndSettle(); - signInBloc.add( + authBloc.add( const ForgotPasswordRequest( email: "email", ), @@ -508,18 +504,18 @@ void main() { testWidgets('SignInBlocListener Test Failed Forgot Password', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), ForgotPasswordLoading(), const ForgotPasswordFailed(error: "Failed to Send Email"), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( - BlocProvider( - create: (context) => signInBloc, + BlocProvider( + create: (context) => authBloc, child: TestApp( routes: { '/': (_) => MediaQuery( @@ -539,7 +535,7 @@ void main() { await tester.pumpAndSettle(); - signInBloc.add( + authBloc.add( const ForgotPasswordRequest( email: "email", ), diff --git a/modules/auth/test/screens/sign_up_screen_test.dart b/modules/auth/test/screens/sign_up_screen_test.dart index 39a5e40..203913c 100644 --- a/modules/auth/test/screens/sign_up_screen_test.dart +++ b/modules/auth/test/screens/sign_up_screen_test.dart @@ -1,6 +1,6 @@ import 'package:app/presentation/widgets/custom_textform_field.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/sign_up/sign_up_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; import 'package:bloc_test/bloc_test.dart'; import 'package:cwa_core/test_helper/test.dart'; @@ -11,7 +11,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; import 'package:mocktail/mocktail.dart'; - enum NavigatorAction { push, pop, replaced } class MockNavigatorObserver extends NavigatorObserver { @@ -45,19 +44,19 @@ class MockUser extends Mock implements User { MockUser({this.uid = 'id', this.displayName = 'name', this.email = 'email'}); } -class MockSignUpBloc extends Mock implements SignUpBloc { +class MockAuthBloc extends Mock implements AuthBloc { @override final AuthService services; @override final UserService userService; - MockSignUpBloc({required this.services, required this.userService}) { + MockAuthBloc({required this.services, required this.userService}) { when(() => close()).thenAnswer((_) async => {}); } } void main() { - late SignUpBloc signUpBloc; + late AuthBloc authBloc; late AuthService mockAuthService; late UserService mockUserService; late GetIt getIt; @@ -84,14 +83,14 @@ void main() { mockAuthService = getIt(); mockUserService = getIt(); - signUpBloc = MockSignUpBloc( + authBloc = MockAuthBloc( services: mockAuthService, userService: mockUserService, ); }); tearDown(() { - signUpBloc.close(); + authBloc.close(); getIt.reset(); }); @@ -164,19 +163,19 @@ void main() { TextEditingController(text: "Password"); whenListen( - signUpBloc, + authBloc, Stream.fromIterable([ - SignUpInitial(), + AuthInitial(), SignUpLoading(), SignUpSuccess(), ]), - initialState: SignUpInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( LocalizationTestApp( - child: BlocProvider.value( - value: signUpBloc, + child: BlocProvider.value( + value: authBloc, child: Builder(builder: (context) { return Material( child: BuildSignUpButton( @@ -200,7 +199,7 @@ void main() { await tester.pumpAndSettle(); verify( - () => signUpBloc.add( + () => authBloc.add( const SignUpRequest( dto: SignUpDTO( name: "Name", @@ -223,8 +222,8 @@ void main() { await tester.pumpWidget( LocalizationTestApp( - child: BlocProvider( - create: (context) => signUpBloc, + child: BlocProvider( + create: (context) => authBloc, child: Builder(builder: (context) { return Material( child: BuildSignUpButton( @@ -297,18 +296,18 @@ void main() { testWidgets('SignUp BlocListener Test', (WidgetTester tester) async { whenListen( - signUpBloc, + authBloc, Stream.fromIterable([ - SignUpInitial(), + AuthInitial(), SignUpLoading(), SignUpSuccess(), ]), - initialState: SignUpInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( - BlocProvider.value( - value: signUpBloc, + BlocProvider.value( + value: authBloc, child: TestApp( routes: { '/': (_) => const MediaQuery( @@ -327,7 +326,7 @@ void main() { await tester.pumpAndSettle(); - signUpBloc.add( + authBloc.add( const SignUpRequest( dto: SignUpDTO( email: "email", @@ -343,18 +342,18 @@ void main() { testWidgets('SignUp BlocListener Test When Failed Occured', (WidgetTester tester) async { whenListen( - signUpBloc, + authBloc, Stream.fromIterable([ - SignUpInitial(), + AuthInitial(), SignUpLoading(), const SignUpFailed(error: "Failed occured"), ]), - initialState: SignUpInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( - BlocProvider.value( - value: signUpBloc, + BlocProvider.value( + value: authBloc, child: TestApp( routes: { '/': (_) => const MediaQuery( @@ -373,7 +372,7 @@ void main() { await tester.pumpAndSettle(); - signUpBloc.add( + authBloc.add( const SignUpRequest( dto: SignUpDTO( email: "email", diff --git a/modules/auth/test/widgets/google_sign_in_button_test.dart b/modules/auth/test/widgets/google_sign_in_button_test.dart index c6e687a..bf9fe16 100644 --- a/modules/auth/test/widgets/google_sign_in_button_test.dart +++ b/modules/auth/test/widgets/google_sign_in_button_test.dart @@ -1,6 +1,7 @@ import 'package:auth/auth.dart'; -import 'package:auth/bloc/sign_in/sign_in_bloc.dart'; -import 'package:auth/bloc/sign_up/sign_up_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; +import 'package:auth/data/enum/auth_type_enum.dart'; + import 'package:bloc_test/bloc_test.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; @@ -25,31 +26,19 @@ class MockUser extends Mock implements User { MockUser({this.uid = 'id', this.displayName = 'name', this.email = 'email'}); } -class MockSignInBloc extends Mock implements SignInBloc { +class MockAuthBloc extends Mock implements AuthBloc { @override final AuthService services; @override final UserService userService; - MockSignInBloc({required this.services, required this.userService}) { - when(() => close()).thenAnswer((_) async => {}); - } -} - -class MockSignUpBloc extends Mock implements SignUpBloc { - @override - final AuthService services; - @override - final UserService userService; - - MockSignUpBloc({required this.services, required this.userService}) { + MockAuthBloc({required this.services, required this.userService}) { when(() => close()).thenAnswer((_) async => {}); } } void main() { - late SignInBloc signInBloc; - late SignUpBloc signUpBloc; + late AuthBloc authBloc; late AuthService mockAuthService; late UserService mockUserService; late GetIt getIt; @@ -73,18 +62,14 @@ void main() { mockAuthService = getIt(); mockUserService = getIt(); - signInBloc = MockSignInBloc( - services: mockAuthService, - userService: mockUserService, - ); - signUpBloc = MockSignUpBloc( + authBloc = MockAuthBloc( services: mockAuthService, userService: mockUserService, ); }); tearDown(() { - signInBloc.close(); + authBloc.close(); getIt.reset(); }); @@ -94,6 +79,7 @@ void main() { const TestApp( home: Scaffold( body: GoogleSignInButton( + type: AuthType.signIn, padding: EdgeInsets.all(8.0), margin: EdgeInsets.all(16.0), ), @@ -110,7 +96,9 @@ void main() { await tester.pumpWidget( const TestApp( home: Scaffold( - body: GoogleSignInButton(), + body: GoogleSignInButton( + type: AuthType.signIn, + ), ), ), ); @@ -126,6 +114,7 @@ void main() { const TestApp( home: Scaffold( body: GoogleSignInButton( + type: AuthType.signIn, padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 12.0), margin: EdgeInsets.all(20.0), ), @@ -141,25 +130,25 @@ void main() { }); testWidgets( - 'Widget onTap callback is call Bloc Event Correctly SignIn Bloc', + 'Widget onTap callback is call Bloc Event Correctly SignUp Bloc', (WidgetTester tester) async { whenListen( - signUpBloc, + authBloc, Stream.fromIterable([ - SignUpInitial(), + AuthInitial(), SignUpLoading(), SignUpSuccess(), ]), - initialState: SignUpInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( TestApp( - home: BlocProvider( - create: (context) => signUpBloc, + home: BlocProvider( + create: (context) => authBloc, child: const Scaffold( body: GoogleSignInButton( - bloc: SignUpBloc, + type: AuthType.signUp, ), ), ), @@ -174,32 +163,32 @@ void main() { await tester.pumpAndSettle(); verify( - () => signUpBloc.add(SignUpByGoogleRequest()), + () => authBloc.add(SignUpByGoogleRequest()), ).called(1); await tester.pumpAndSettle(); }); testWidgets( - 'Widget onTap callback is call Bloc Event Correctly SignUp Bloc', + 'Widget onTap callback is call Bloc Event Correctly Sign In Bloc', (WidgetTester tester) async { whenListen( - signInBloc, + authBloc, Stream.fromIterable([ - SignInInitial(), + AuthInitial(), SignInLoading(), SignInSuccess(), ]), - initialState: SignInInitial(), + initialState: AuthInitial(), ); await tester.pumpWidget( TestApp( - home: BlocProvider( - create: (context) => signInBloc, + home: BlocProvider( + create: (context) => authBloc, child: const Scaffold( body: GoogleSignInButton( - bloc: SignInBloc, + type: AuthType.signIn, ), ), ), @@ -214,7 +203,7 @@ void main() { await tester.pumpAndSettle(); verify( - () => signInBloc.add(SignInByGoogleRequest()), + () => authBloc.add(SignInByGoogleRequest()), ).called(1); await tester.pumpAndSettle(); diff --git a/modules/auth/test/widgets/oauth_sign_in_button_test.dart b/modules/auth/test/widgets/oauth_sign_in_button_test.dart index d13147a..81b8467 100644 --- a/modules/auth/test/widgets/oauth_sign_in_button_test.dart +++ b/modules/auth/test/widgets/oauth_sign_in_button_test.dart @@ -1,4 +1,5 @@ import 'package:auth/auth.dart'; +import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -11,7 +12,14 @@ void main() { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; await tester.pumpWidget( - const TestApp(home: Material(child: OAuthSignInButton()))); + const TestApp( + home: Material( + child: OAuthSignInButton( + type: AuthType.signIn, + ), + ), + ), + ); expect(find.byType(AppleSignInButton), findsOneWidget); expect(find.byType(GoogleSignInButton), findsNothing); @@ -23,7 +31,14 @@ void main() { debugDefaultTargetPlatformOverride = TargetPlatform.android; await tester.pumpWidget( - const TestApp(home: Material(child: OAuthSignInButton()))); + const TestApp( + home: Material( + child: OAuthSignInButton( + type: AuthType.signIn, + ), + ), + ), + ); expect(find.byType(GoogleSignInButton), findsOneWidget); expect(find.byType(AppleSignInButton), findsNothing); diff --git a/modules/core/lib/injector/bloc.dart b/modules/core/lib/injector/bloc.dart index 9c2ea3c..dd2344d 100644 --- a/modules/core/lib/injector/bloc.dart +++ b/modules/core/lib/injector/bloc.dart @@ -1,19 +1,12 @@ -import 'package:auth/bloc/sign_in/sign_in_bloc.dart'; -import 'package:auth/bloc/sign_up/sign_up_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; import 'package:auth/data/remote/auth_services.dart'; import 'package:auth/data/remote/user_services.dart'; import 'package:get_it/get_it.dart'; void setUpBlocDepedencies(GetIt getIt) { ///Auth Blocs - getIt.registerFactory( - () => SignInBloc( - services: getIt(), - userService: getIt(), - ), - ); - getIt.registerFactory( - () => SignUpBloc( + getIt.registerFactory( + () => AuthBloc( services: getIt(), userService: getIt(), ), diff --git a/modules/core/lib/router/app_router.dart b/modules/core/lib/router/app_router.dart index 399a9b5..aaaed0d 100644 --- a/modules/core/lib/router/app_router.dart +++ b/modules/core/lib/router/app_router.dart @@ -1,11 +1,10 @@ import 'package:app/app.dart'; -import 'package:auth/bloc/sign_in/sign_in_bloc.dart'; -import 'package:auth/bloc/sign_up/sign_up_bloc.dart'; +import 'package:auth/bloc/auth/auth_bloc.dart'; + import 'package:auth/presentation/screens/sign_in_screen.dart'; import 'package:auth/presentation/screens/sign_up_screen.dart'; import 'package:cwa_core/core.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -27,13 +26,13 @@ class AppRouter { case AppRoutes.signUpScreen: return BlocProvider( - create: (context) => locator.getIt(), + create: (context) => locator.getIt(), child: const SignUpScreen(), ); case AppRoutes.signInScreen: return BlocProvider( - create: (context) => locator.getIt(), + create: (context) => locator.getIt(), child: SignInScreen(), ); From 50c3c6c4c81eb73f372499e9b5a5c740e21f9a15 Mon Sep 17 00:00:00 2001 From: Azri Date: Thu, 29 Feb 2024 20:18:05 +0700 Subject: [PATCH 3/3] chore(import):import-cleaning --- modules/auth/lib/auth.dart | 1 + modules/auth/lib/bloc/bloc.dart | 1 + modules/auth/lib/data/data.dart | 3 ++- modules/auth/lib/presentation/screens/sign_in_screen.dart | 2 -- modules/auth/lib/presentation/screens/sign_up_screen.dart | 2 -- .../auth/lib/presentation/widgets/oauth_sign_in_button.dart | 1 - modules/auth/test/screens/sign_in_screen_test.dart | 1 - modules/auth/test/screens/sign_up_screen_test.dart | 1 - modules/auth/test/widgets/google_sign_in_button_test.dart | 2 -- modules/auth/test/widgets/oauth_sign_in_button_test.dart | 1 - modules/core/lib/injector/bloc.dart | 5 ++--- 11 files changed, 6 insertions(+), 14 deletions(-) create mode 100644 modules/auth/lib/bloc/bloc.dart diff --git a/modules/auth/lib/auth.dart b/modules/auth/lib/auth.dart index c9e3985..46ef9a8 100644 --- a/modules/auth/lib/auth.dart +++ b/modules/auth/lib/auth.dart @@ -2,3 +2,4 @@ library auth; export 'presentation/index.dart'; export 'data/data.dart'; +export 'bloc/bloc.dart'; diff --git a/modules/auth/lib/bloc/bloc.dart b/modules/auth/lib/bloc/bloc.dart new file mode 100644 index 0000000..c89ef94 --- /dev/null +++ b/modules/auth/lib/bloc/bloc.dart @@ -0,0 +1 @@ +export 'auth/auth_bloc.dart'; \ No newline at end of file diff --git a/modules/auth/lib/data/data.dart b/modules/auth/lib/data/data.dart index 180c2fc..31eb517 100644 --- a/modules/auth/lib/data/data.dart +++ b/modules/auth/lib/data/data.dart @@ -1,2 +1,3 @@ export "dto/dto.dart"; -export 'remote/services.dart'; \ No newline at end of file +export 'remote/services.dart'; +export 'enum/auth_type_enum.dart'; \ No newline at end of file diff --git a/modules/auth/lib/presentation/screens/sign_in_screen.dart b/modules/auth/lib/presentation/screens/sign_in_screen.dart index 638baef..f6bd588 100644 --- a/modules/auth/lib/presentation/screens/sign_in_screen.dart +++ b/modules/auth/lib/presentation/screens/sign_in_screen.dart @@ -1,7 +1,5 @@ import 'package:app/app.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/auth/auth_bloc.dart'; -import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:cwa_core/core.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; diff --git a/modules/auth/lib/presentation/screens/sign_up_screen.dart b/modules/auth/lib/presentation/screens/sign_up_screen.dart index b71be96..c2bc654 100644 --- a/modules/auth/lib/presentation/screens/sign_up_screen.dart +++ b/modules/auth/lib/presentation/screens/sign_up_screen.dart @@ -1,7 +1,5 @@ import 'package:app/app.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/auth/auth_bloc.dart'; -import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:cwa_core/core.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; diff --git a/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart b/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart index ce7d034..3c178bd 100644 --- a/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart +++ b/modules/auth/lib/presentation/widgets/oauth_sign_in_button.dart @@ -1,5 +1,4 @@ import 'package:auth/auth.dart'; -import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/modules/auth/test/screens/sign_in_screen_test.dart b/modules/auth/test/screens/sign_in_screen_test.dart index 64b9f4a..5363015 100644 --- a/modules/auth/test/screens/sign_in_screen_test.dart +++ b/modules/auth/test/screens/sign_in_screen_test.dart @@ -1,7 +1,6 @@ import 'package:app/presentation/widgets/custom_text_button.dart'; import 'package:app/presentation/widgets/custom_textform_field.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/auth/auth_bloc.dart'; import 'package:bloc_test/bloc_test.dart'; import 'package:cwa_core/test_helper/test.dart'; import 'package:firebase_auth/firebase_auth.dart'; diff --git a/modules/auth/test/screens/sign_up_screen_test.dart b/modules/auth/test/screens/sign_up_screen_test.dart index 203913c..0d629bb 100644 --- a/modules/auth/test/screens/sign_up_screen_test.dart +++ b/modules/auth/test/screens/sign_up_screen_test.dart @@ -1,6 +1,5 @@ import 'package:app/presentation/widgets/custom_textform_field.dart'; import 'package:auth/auth.dart'; -import 'package:auth/bloc/auth/auth_bloc.dart'; import 'package:bloc_test/bloc_test.dart'; import 'package:cwa_core/test_helper/test.dart'; diff --git a/modules/auth/test/widgets/google_sign_in_button_test.dart b/modules/auth/test/widgets/google_sign_in_button_test.dart index bf9fe16..0829af5 100644 --- a/modules/auth/test/widgets/google_sign_in_button_test.dart +++ b/modules/auth/test/widgets/google_sign_in_button_test.dart @@ -1,6 +1,4 @@ import 'package:auth/auth.dart'; -import 'package:auth/bloc/auth/auth_bloc.dart'; -import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:bloc_test/bloc_test.dart'; import 'package:firebase_auth/firebase_auth.dart'; diff --git a/modules/auth/test/widgets/oauth_sign_in_button_test.dart b/modules/auth/test/widgets/oauth_sign_in_button_test.dart index 81b8467..c9b54b4 100644 --- a/modules/auth/test/widgets/oauth_sign_in_button_test.dart +++ b/modules/auth/test/widgets/oauth_sign_in_button_test.dart @@ -1,5 +1,4 @@ import 'package:auth/auth.dart'; -import 'package:auth/data/enum/auth_type_enum.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/modules/core/lib/injector/bloc.dart b/modules/core/lib/injector/bloc.dart index dd2344d..532b5c3 100644 --- a/modules/core/lib/injector/bloc.dart +++ b/modules/core/lib/injector/bloc.dart @@ -1,6 +1,5 @@ -import 'package:auth/bloc/auth/auth_bloc.dart'; -import 'package:auth/data/remote/auth_services.dart'; -import 'package:auth/data/remote/user_services.dart'; + +import 'package:auth/auth.dart'; import 'package:get_it/get_it.dart'; void setUpBlocDepedencies(GetIt getIt) {