Repository: Learnathon-By-Geeky-Solutions/nstu-codebreakers
Pull request #15: Introduce bottom navigation bar
Author: login: Mahbub-Hasan-Talukder
Created: 2025-04-17T17:52:07Z | Merged: 2025-04-17T18:11:20Z



Diff:
diff --git a/task_hive/lib/core/navigation/dummy_pages/dummy_page_1.dart b/task_hive/lib/core/navigation/dummy_pages/dummy_page_1.dart
new file mode 100644
index 0000000..0509229
--- /dev/null
+++ b/task_hive/lib/core/navigation/dummy_pages/dummy_page_1.dart
@@ -0,0 +1,24 @@
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+import 'package:task_hive/core/navigation/routes.dart';
+
+class DummyPage1 extends StatelessWidget {
+  const DummyPage1({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: const Text('Dummy Page 1'),
+      ),
+      body: Center(
+        child: ElevatedButton(
+          onPressed: () {
+            context.go(MyRoutes.dummyPage2);
+          },
+          child: const Text('Go to Dummy Page 2'),
+        ),
+      ),
+    );
+  }
+}
diff --git a/task_hive/lib/core/navigation/dummy_pages/dummy_page_2.dart b/task_hive/lib/core/navigation/dummy_pages/dummy_page_2.dart
new file mode 100644
index 0000000..c855690
--- /dev/null
+++ b/task_hive/lib/core/navigation/dummy_pages/dummy_page_2.dart
@@ -0,0 +1,25 @@
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+import '../routes.dart';
+
+class DummyPage2 extends StatelessWidget {
+  const DummyPage2({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: const Text('Dummy Page 2'),
+      ),
+      body: Center(
+        child: ElevatedButton(
+          onPressed: () {
+            context.go(MyRoutes.dummyPage1);
+          },
+          child: const Text('Go to Dummy Page 1'),
+        ),
+      ),
+    );
+  }
+}
diff --git a/task_hive/lib/core/navigation/nav_bar.dart b/task_hive/lib/core/navigation/nav_bar.dart
new file mode 100644
index 0000000..897f9bb
--- /dev/null
+++ b/task_hive/lib/core/navigation/nav_bar.dart
@@ -0,0 +1,64 @@
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class ScaffoldWithNestedNavigation extends StatelessWidget {
+  ScaffoldWithNestedNavigation({
+    Key? key,
+    required this.navigationShell,
+  }) : super(key: key ?? const ValueKey('ScaffoldWithNestedNavigation'));
+  final StatefulNavigationShell navigationShell;
+
+  void _goBranch(int index) {
+    navigationShell.goBranch(
+      index,
+      initialLocation: index == navigationShell.currentIndex,
+    );
+  }
+
+  Widget _buildBottomNavigationBar(BuildContext context) {
+    final selectedColor =
+        Theme.of(context).colorScheme.primary.withOpacity(0.5);
+    return BottomNavigationBar(
+      type: BottomNavigationBarType.fixed,
+      currentIndex: navigationShell.currentIndex,
+      elevation: 0,
+      items: [
+        BottomNavigationBarItem(
+          icon: Icon(Icons.house_outlined),
+          label: 'Home',
+          activeIcon: Icon(Icons.house_rounded),
+          tooltip: 'Home',
+        ),
+        BottomNavigationBarItem(
+          icon: Icon(Icons.add_outlined),
+          label: 'Add',
+          activeIcon: Icon(
+            Icons.add_circle,
+          ),
+          tooltip: 'Add',
+        ),
+        BottomNavigationBarItem(
+          icon: Icon(
+            Icons.person_outlined,
+          ),
+          label: 'Profile',
+          activeIcon: Icon(
+            Icons.person_rounded,
+          ),
+          tooltip: 'Profile',
+        ),
+      ],
+      onTap: _goBranch,
+    );
+  }
+
+  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      key: scaffoldKey,
+      body: navigationShell,
+      bottomNavigationBar: _buildBottomNavigationBar(context),
+    );
+  }
+}
diff --git a/task_hive/lib/core/navigation/router_config.dart b/task_hive/lib/core/navigation/router_config.dart
index 1dc6ddc..a6c5ae7 100644
--- a/task_hive/lib/core/navigation/router_config.dart
+++ b/task_hive/lib/core/navigation/router_config.dart
@@ -1,26 +1,83 @@
+import 'package:flutter/material.dart';
 import 'package:go_router/go_router.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_1.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_2.dart';
 import 'package:task_hive/features/auth/presentation/screens/forget_pass_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/sign_up_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/signin_screen.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_1.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_2.dart';
-import 'package:task_hive/features/onboarding/presentation/screens/splash_screen.dart';
 import 'package:task_hive/features/profile/presentation/screens/profile_screen.dart';
 
+import '../../features/auth/domain/entity/user_entity.dart';
 import '../../features/onboarding/presentation/screens/onboard_screen_3.dart';
 import 'error_page.dart';
+import 'nav_bar.dart';
 import 'routes.dart';
 
 class MyRouterConfig {
+  static final GlobalKey<NavigatorState> rootNavigatorKey =
+      GlobalKey<NavigatorState>();
+
+  static void refresh() {
+    router.go(MyRoutes.profile);
+  }
+
   static final router = GoRouter(
+    navigatorKey: rootNavigatorKey,
+    observers: [MyRouterObserver()],
     errorBuilder: (context, state) {
       return const ErrorPage();
     },
+    redirect: (context, state) {
+      if (state.uri.path == '/') {
+        return MyRoutes.profile;
+      }
+      return null;
+    },
     initialLocation: MyRoutes.initialRoute,
     routes: [
-      GoRoute(
-        path: MyRoutes.initialRoute,
-        builder: (context, state) => const SplashScreen(),
+      StatefulShellRoute.indexedStack(
+        builder: (context, state, navigationShell) {
+          return ScaffoldWithNestedNavigation(
+            navigationShell: navigationShell,
+          );
+        },
+        branches: [
+          StatefulShellBranch(
+            routes: [
+              GoRoute(
+                path: MyRoutes.dummyPage1,
+                builder: (context, state) {
+                  return const DummyPage1();
+                },
+              ),
+            ],
+          ),
+          StatefulShellBranch(
+            routes: [
+              GoRoute(
+                path: MyRoutes.dummyPage2,
+                builder: (context, state) {
+                  return const DummyPage2();
+                },
+              ),
+            ],
+          ),
+          StatefulShellBranch(
+            routes: [
+              GoRoute(
+                path: MyRoutes.profile,
+                builder: (context, state) {
+                  final userData = state.extra is UserEntity
+                      ? state.extra as UserEntity
+                      : null;
+                  return ProfileScreen(userData: userData);
+                },
+              ),
+            ],
+          ),
+        ],
       ),
       GoRoute(
         path: "/${MyRoutes.onboard1}",
@@ -42,10 +99,6 @@ class MyRouterConfig {
         path: MyRoutes.signInRoute,
         builder: (context, state) => const SignInScreen(),
       ),
-      GoRoute(
-        path: MyRoutes.profile,
-        builder: (context, state) => const ProfileScreen(),
-      ),
       GoRoute(
         path: "/${MyRoutes.signUpRoute}",
         builder: (context, state) => const SignUpScreen(),
@@ -57,3 +110,27 @@ class MyRouterConfig {
     ],
   );
 }
+
+class MyRouterObserver extends NavigatorObserver {
+  @override
+  void didPush(Route route, Route? previousRoute) {
+    super.didPush(route, previousRoute);
+    _updateBackButtonBehavior(route);
+  }
+
+  @override
+  void didPop(Route route, Route? previousRoute) {
+    super.didPop(route, previousRoute);
+    _updateBackButtonBehavior(previousRoute);
+  }
+
+  @override
+  void didReplace({Route? newRoute, Route? oldRoute}) {
+    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
+    _updateBackButtonBehavior(newRoute);
+  }
+
+  Future<void> _updateBackButtonBehavior(Route? route) async {
+    // TODO: Implement platform-specific back-button handling (e.g. call SystemNavigator.pop on root)
+  }
+}
diff --git a/task_hive/lib/core/navigation/routes.dart b/task_hive/lib/core/navigation/routes.dart
index 2537785..8e14a5f 100644
--- a/task_hive/lib/core/navigation/routes.dart
+++ b/task_hive/lib/core/navigation/routes.dart
@@ -13,4 +13,7 @@ class MyRoutes {
 
   static String signInRoute = '/signIn';
   static String profile = '/profile';
+
+  static String dummyPage1 = '/dummyPage1';
+  static String dummyPage2 = '/dummyPage2';
 }
diff --git a/task_hive/lib/features/auth/data/data_source/remote/auth_data_source.dart b/task_hive/lib/features/auth/data/data_source/remote/auth_data_source.dart
index 68bad2f..1115821 100644
--- a/task_hive/lib/features/auth/data/data_source/remote/auth_data_source.dart
+++ b/task_hive/lib/features/auth/data/data_source/remote/auth_data_source.dart
@@ -1,10 +1,10 @@
-import '../../../domain/entity/user_info.dart';
+import '../../../domain/entity/user_entity.dart';
 
 abstract class AuthDataSource {
-  Future<void> signUp(UserInfo userInfo);
-  Future<void> signIn(UserInfo userInfo);
+  Future<void> signUp(UserEntity userInfo);
+  Future<void> signIn(UserEntity userInfo);
   Future<void> forgetPassword(String email);
   Future<void> verifyOtp();
-  Future<void> addUser(UserInfo userInfo);
+  Future<void> addUser(UserEntity userInfo);
   Future<Map<String, dynamic>> getUser();
 }
diff --git a/task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart b/task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart
index 550fc40..ab2859c 100644
--- a/task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart
+++ b/task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart
@@ -2,7 +2,7 @@ import 'package:supabase_flutter/supabase_flutter.dart';
 
 import '../../../../../core/services/auth_service/auth_service.dart';
 import '../../../../../core/di/di.dart';
-import '../../../domain/entity/user_info.dart';
+import '../../../domain/entity/user_entity.dart';
 import 'auth_data_source.dart';
 
 class AuthDataSourceImpl implements AuthDataSource {
@@ -13,7 +13,7 @@ class AuthDataSourceImpl implements AuthDataSource {
             supabaseClient ?? getIt<AuthService>().getSupabaseClient();
 
   @override
-  Future<void> signIn(UserInfo userInfo) async {
+  Future<void> signIn(UserEntity userInfo) async {
     await authClient.signInWithPassword(
       email: userInfo.email ?? '',
       password: userInfo.password ?? '',
@@ -21,7 +21,7 @@ class AuthDataSourceImpl implements AuthDataSource {
   }
 
   @override
-  Future<void> signUp(UserInfo userInfo) async {
+  Future<void> signUp(UserEntity userInfo) async {
     await authClient.signUp(
       email: userInfo.email ?? '',
       password: userInfo.password ?? '',
@@ -40,7 +40,7 @@ class AuthDataSourceImpl implements AuthDataSource {
   }
 
   @override
-  Future<void> addUser(UserInfo userInfo) async {
+  Future<void> addUser(UserEntity userInfo) async {
     try {
       await supabaseClient.from('users').insert(userInfo.toJson());
     } catch (e) {
@@ -49,8 +49,21 @@ class AuthDataSourceImpl implements AuthDataSource {
   }
 
   @override
-  Future<Map<String, dynamic>> getUser() {
-    // TODO: implement getUser
-    throw UnimplementedError();
+  Future<Map<String, dynamic>> getUser() async {
+    final email = supabaseClient.auth.currentUser?.email;
+    if (email == null) {
+      throw Exception(
+          'Current user email not found. User may not be authenticated.');
+    }
+    try {
+      final response = await supabaseClient
+          .from('users')
+          .select()
+          .eq('email', email)
+          .single();
+      return response;
+    } catch (e) {
+      throw Exception('Error retrieving user data: ${e.toString()}');
+    }
   }
 }
diff --git a/task_hive/lib/features/auth/data/model/sign_in_model.dart b/task_hive/lib/features/auth/data/model/sign_in_model.dart
new file mode 100644
index 0000000..113ae71
--- /dev/null
+++ b/task_hive/lib/features/auth/data/model/sign_in_model.dart
@@ -0,0 +1,19 @@
+import 'package:task_hive/features/auth/domain/entity/user_entity.dart';
+
+class SignInModel {
+  String? email;
+  String? name;
+
+  SignInModel(this.email, this.name);
+
+  SignInModel.fromJson(Map<String, dynamic> json) {
+    email = json['email'] ?? 'No email';
+    name = json['full_name'] ?? 'No name';
+  }
+  UserEntity toEntity() {
+    return UserEntity(
+      email: email,
+      name: name,
+    );
+  }
+}
diff --git a/task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart b/task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart
index 5eec798..4ed2e29 100644
--- a/task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart
+++ b/task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart
@@ -1,11 +1,11 @@
 import 'package:dartz/dartz.dart';
 
-import 'package:task_hive/core/io/failure.dart';
-import 'package:task_hive/core/io/success.dart';
-import 'package:task_hive/features/auth/data/data_source/remote/auth_data_source.dart';
-
-import 'package:task_hive/features/auth/domain/entity/user_info.dart';
-
+import '../../../../core/io/failure.dart';
+import '../../../../core/io/success.dart';
+import '../data_source/remote/auth_data_source.dart';
+import '../model/sign_in_model.dart';
+import '../../domain/entity/user_entity.dart';
+import '../../../../core/logger/logger.dart';
 import '../../domain/repository/auth_repository.dart';
 
 class AuthReposityImpl implements AuthRepository {
@@ -24,17 +24,21 @@ class AuthReposityImpl implements AuthRepository {
   }
 
   @override
-  Future<Either<Success, Failure>> signIn(UserInfo userInfo) async {
+  Future<Either<UserEntity, Failure>> signIn(UserEntity userInfo) async {
     try {
       await _authDataSource.signIn(userInfo);
-      return Left(Success('Sign in successful'));
+
+      final user = await _authDataSource.getUser();
+      logger.e(user);
+
+      return Left(SignInModel.fromJson(user).toEntity());
     } catch (e) {
       return Right(Failure(e.toString()));
     }
   }
 
   @override
-  Future<Either<Success, Failure>> signUp(UserInfo userInfo) async {
+  Future<Either<Success, Failure>> signUp(UserEntity userInfo) async {
     try {
       await _authDataSource.signUp(userInfo);
       await _authDataSource.addUser(userInfo);
@@ -45,7 +49,7 @@ class AuthReposityImpl implements AuthRepository {
   }
 
   @override
-  Future<Either<UserInfo, Failure>> verifyOtp() {
-    throw UnimplementedError();
+  Future<Either<UserEntity, Failure>> verifyOtp() async {
+    return Right(Failure('verifyOtp() not yet implemented'));
   }
 }
diff --git a/task_hive/lib/features/auth/domain/entity/user_info.dart b/task_hive/lib/features/auth/domain/entity/user_entity.dart
similarity index 78%
rename from task_hive/lib/features/auth/domain/entity/user_info.dart
rename to task_hive/lib/features/auth/domain/entity/user_entity.dart
index 0533e41..3e6c3a4 100644
--- a/task_hive/lib/features/auth/domain/entity/user_info.dart
+++ b/task_hive/lib/features/auth/domain/entity/user_entity.dart
@@ -1,4 +1,4 @@
-class UserInfo {
+class UserEntity {
   String? name;
   String? email;
   String? password;
@@ -6,7 +6,7 @@ class UserInfo {
   String? createdAt;
   String? updatedAt;
 
-  UserInfo({
+  UserEntity({
     this.name,
     this.email,
     this.password,
@@ -17,10 +17,9 @@ class UserInfo {
 
   Map<String, dynamic> toJson() {
     return {
-      'name': name,
+      'full_name': name,
       'email': email,
-      'password': password,
-      'profile_picture_url': profilePictureUrl,
+      'profile_picture': profilePictureUrl,
       'created_at': createdAt ?? DateTime.now().toIso8601String(),
       'updated_at': updatedAt ?? DateTime.now().toIso8601String(),
     };
diff --git a/task_hive/lib/features/auth/domain/repository/auth_repository.dart b/task_hive/lib/features/auth/domain/repository/auth_repository.dart
index f77e607..e004abd 100644
--- a/task_hive/lib/features/auth/domain/repository/auth_repository.dart
+++ b/task_hive/lib/features/auth/domain/repository/auth_repository.dart
@@ -2,11 +2,11 @@ import 'package:dartz/dartz.dart';
 
 import '../../../../core/io/failure.dart';
 import '../../../../core/io/success.dart';
-import '../entity/user_info.dart';
+import '../entity/user_entity.dart';
 
 abstract class AuthRepository {
-  Future<Either<Success, Failure>> signUp(UserInfo userInfo);
-  Future<Either<Success, Failure>> signIn(UserInfo userInfo);
+  Future<Either<Success, Failure>> signUp(UserEntity userInfo);
+  Future<Either<UserEntity, Failure>> signIn(UserEntity userInfo);
   Future<Either<Success, Failure>> forgetPassword(String email);
-  Future<Either<UserInfo, Failure>> verifyOtp();
+  Future<Either<UserEntity, Failure>> verifyOtp();
 }
diff --git a/task_hive/lib/features/auth/domain/use_case/auth_use_case.dart b/task_hive/lib/features/auth/domain/use_case/auth_use_case.dart
index 97f22e6..bdd0dfb 100644
--- a/task_hive/lib/features/auth/domain/use_case/auth_use_case.dart
+++ b/task_hive/lib/features/auth/domain/use_case/auth_use_case.dart
@@ -4,24 +4,24 @@ import 'package:task_hive/features/auth/domain/repository/auth_repository.dart';
 import '../../../../core/io/failure.dart';
 import '../../../../core/io/success.dart';
 import '../../../../core/base/use_case/base_use_case.dart';
-import '../entity/user_info.dart';
+import '../entity/user_entity.dart';
 
-class SignUpUseCase extends BaseUseCase<UserInfo, Success, Failure> {
+class SignUpUseCase extends BaseUseCase<UserEntity, Success, Failure> {
   final AuthRepository _authRepository;
   SignUpUseCase(this._authRepository);
 
   @override
-  Future<Either<Success, Failure>> call(UserInfo input) async {
+  Future<Either<Success, Failure>> call(UserEntity input) async {
     return await _authRepository.signUp(input);
   }
 }
 
-class SignInUseCase extends BaseUseCase<UserInfo, Success, Failure> {
+class SignInUseCase extends BaseUseCase<UserEntity, UserEntity, Failure> {
   final AuthRepository _authRepository;
   SignInUseCase(this._authRepository);
 
   @override
-  Future<Either<Success, Failure>> call(UserInfo input) async {
+  Future<Either<UserEntity, Failure>> call(UserEntity input) async {
     return await _authRepository.signIn(input);
   }
 }
diff --git a/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_cubit.dart b/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_cubit.dart
index 1395958..8eec9ec 100644
--- a/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_cubit.dart
+++ b/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_cubit.dart
@@ -3,7 +3,7 @@ import 'package:equatable/equatable.dart';
 
 import '../../../../../../core/io/failure.dart';
 import '../../../../../../core/io/success.dart';
-import '../../../../domain/entity/user_info.dart';
+import '../../../../domain/entity/user_entity.dart';
 import '../../../../domain/use_case/auth_use_case.dart';
 
 part 'sign_in_state.dart';
@@ -13,7 +13,7 @@ class SignInCubit extends Cubit<SignInState> {
 
   final SignInUseCase _signInUseCase;
 
-  void signIn(UserInfo userInfo) async {
+  void signIn(UserEntity userInfo) async {
     emit(SignInLoading());
     final res = await _signInUseCase.call(userInfo);
 
diff --git a/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_state.dart b/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_state.dart
index e281600..e68bd68 100644
--- a/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_state.dart
+++ b/task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_state.dart
@@ -6,8 +6,8 @@ class SignInState extends Equatable {
 }
 
 class SignInSuccess extends SignInState {
-  final Success success;
-  SignInSuccess(this.success);
+  final UserEntity userData;
+  SignInSuccess(this.userData);
 }
 
 class SignInFailed extends SignInState {
diff --git a/task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart b/task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart
index 5fe6eb4..4c65695 100644
--- a/task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart
+++ b/task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart
@@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
 
 import '../../../../../../core/io/failure.dart';
 import '../../../../../../core/io/success.dart';
-import '../../../../domain/entity/user_info.dart';
+import '../../../../domain/entity/user_entity.dart';
 import '../../../../domain/use_case/auth_use_case.dart';
 
 part 'sign_up_state.dart';
@@ -13,9 +13,9 @@ class SignUpCubit extends Cubit<SignUpState> {
 
   final SignUpUseCase _signUpUseCase;
 
-  void signUp(UserInfo userInfo) async {
+  void signUp(UserEntity userEntity) async {
     emit(SignUpLoading());
-    final res = await _signUpUseCase.call(userInfo);
+    final res = await _signUpUseCase.call(userEntity);
 
     res.fold((l) {
       emit(SignUpSuccess(l));
diff --git a/task_hive/lib/features/auth/presentation/screens/sign_up_screen.dart b/task_hive/lib/features/auth/presentation/screens/sign_up_screen.dart
index 9a07d40..4a7dda5 100644
--- a/task_hive/lib/features/auth/presentation/screens/sign_up_screen.dart
+++ b/task_hive/lib/features/auth/presentation/screens/sign_up_screen.dart
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:go_router/go_router.dart';
 
-import '../../domain/entity/user_info.dart';
+import '../../domain/entity/user_entity.dart';
 import '../cubits/auth/sign_up/sign_up_cubit.dart';
 import '../../../../core/di/di.dart';
 import '../../../../core/validators/input_field_validation.dart';
@@ -263,7 +263,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
         conPassValidionStatus == null &&
         nameValidationStatus == null &&
         _passCtrl.text == _conPassCtrl.text) {
-      _signUpCubit.signUp(UserInfo(
+      _signUpCubit.signUp(UserEntity(
         name: _nameCtrl.text,
         email: _emailCtrl.text,
         password: _passCtrl.text,
diff --git a/task_hive/lib/features/auth/presentation/screens/signin_screen.dart b/task_hive/lib/features/auth/presentation/screens/signin_screen.dart
index ca976e7..d89891e 100644
--- a/task_hive/lib/features/auth/presentation/screens/signin_screen.dart
+++ b/task_hive/lib/features/auth/presentation/screens/signin_screen.dart
@@ -6,7 +6,7 @@ import 'package:task_hive/features/auth/presentation/cubits/auth/sign_in/sign_in
 import '../../../../core/di/di.dart';
 import '../../../../core/extensions/app_extension.dart';
 import '../../../../core/validators/input_field_validation.dart';
-import '../../domain/entity/user_info.dart';
+import '../../domain/entity/user_entity.dart';
 import '../cubits/validation/email_validation_cubit.dart';
 import '../cubits/validation/pass_validation_cubit.dart';
 import '../widgets/email_field.dart';
@@ -169,7 +169,7 @@ class _SignInScreenState extends State<SignInScreen> {
         bloc: _signInCubit,
         listener: (context, state) {
           if (state is SignInSuccess) {
-            context.go(MyRoutes.profile);
+            context.go(MyRoutes.profile, extra: state.userData);
           } else if (state is SignInFailed) {
             _showSnackbar(context, state.failure.message, colorTheme.error);
           }
@@ -243,7 +243,7 @@ class _SignInScreenState extends State<SignInScreen> {
     }
 
     if (isEmailValid && passValidationStatus == null) {
-      _signInCubit.signIn(UserInfo(
+      _signInCubit.signIn(UserEntity(
         email: _emailCtrl.text,
         password: _passCtrl.text,
       ));
diff --git a/task_hive/lib/features/profile/presentation/screens/profile_screen.dart b/task_hive/lib/features/profile/presentation/screens/profile_screen.dart
index 015dab8..265cd15 100644
--- a/task_hive/lib/features/profile/presentation/screens/profile_screen.dart
+++ b/task_hive/lib/features/profile/presentation/screens/profile_screen.dart
@@ -3,11 +3,13 @@ import 'package:go_router/go_router.dart';
 import 'package:task_hive/core/navigation/router_config.dart';
 import 'package:task_hive/core/navigation/routes.dart';
 import 'package:task_hive/core/services/auth_service/auth_service.dart';
+import 'package:task_hive/features/auth/domain/entity/user_entity.dart';
 
 import '../../../../core/di/di.dart';
 
 class ProfileScreen extends StatelessWidget {
-  const ProfileScreen({super.key});
+  final UserEntity? userData;
+  const ProfileScreen({super.key, this.userData});
 
   @override
   Widget build(BuildContext context) {
@@ -30,12 +32,12 @@ class ProfileScreen extends StatelessWidget {
               ),
               SizedBox(height: 16),
               Text(
-                'User Name',
+                userData?.name ?? 'User Name',
                 style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
               ),
               SizedBox(height: 8),
               Text(
-                'user@example.com',
+                userData?.email ?? 'user@example.com',
                 style: TextStyle(fontSize: 16, color: Colors.grey),
               ),
               SizedBox(height: 24),


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 11**

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 0f955bae0fd64f38d0e6a3371039d065aad72254 and 392b79f1180f2a255c3f65c593a196b81fd4db58.

</details>

<details>
<summary>📒 Files selected for processing (18)</summary>

* `task_hive/lib/core/navigation/dummy_pages/dummy_page_1.dart` (1 hunks)
* `task_hive/lib/core/navigation/dummy_pages/dummy_page_2.dart` (1 hunks)
* `task_hive/lib/core/navigation/nav_bar.dart` (1 hunks)
* `task_hive/lib/core/navigation/router_config.dart` (3 hunks)
* `task_hive/lib/core/navigation/routes.dart` (1 hunks)
* `task_hive/lib/features/auth/data/data_source/remote/auth_data_source.dart` (1 hunks)
* `task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart` (4 hunks)
* `task_hive/lib/features/auth/data/model/sign_in_model.dart` (1 hunks)
* `task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart` (3 hunks)
* `task_hive/lib/features/auth/domain/entity/user_entity.dart` (2 hunks)
* `task_hive/lib/features/auth/domain/repository/auth_repository.dart` (1 hunks)
* `task_hive/lib/features/auth/domain/use_case/auth_use_case.dart` (1 hunks)
* `task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_cubit.dart` (2 hunks)
* `task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_state.dart` (1 hunks)
* `task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart` (2 hunks)
* `task_hive/lib/features/auth/presentation/screens/sign_up_screen.dart` (2 hunks)
* `task_hive/lib/features/auth/presentation/screens/signin_screen.dart` (3 hunks)
* `task_hive/lib/features/profile/presentation/screens/profile_screen.dart` (2 hunks)

</details>

<details>
<summary>🔇 Additional comments (34)</summary><blockquote>

<details>
<summary>task_hive/lib/features/auth/presentation/screens/sign_up_screen.dart (2)</summary>

`5-5`: **IMPORT MODIFICATION DETECTED**

SCANNING CHANGE... REPLACING 'UserInfo' IMPORT WITH 'UserEntity' IMPORT. THIS ALIGNS WITH NEW DOMAIN MODEL ARCHITECTURE.

---

`266-270`: **MODEL INSTANTIATION UPDATED SUCCESSFULLY**

OBJECT CREATION SYNTAX MAINTAINED. PARAMETER PASSING UNCHANGED. ONLY CLASS NAME CONVERTED FROM 'UserInfo' TO 'UserEntity'.

</details>
<details>
<summary>task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_cubit.dart (2)</summary>

`6-6`: **IMPORT PATH REFACTORING DETECTED**

PREVIOUS: IMPORT OF 'user_info.dart'
CURRENT: IMPORT OF 'user_entity.dart'
MODIFICATION ALIGNS WITH DOMAIN ENTITY RENAMING INITIATIVE.

---

`16-16`: **PARAMETER TYPE UPDATED**

METHOD SIGNATURE CHANGE DETECTED: 'UserInfo' → 'UserEntity'
INTERNAL FUNCTION LOGIC PRESERVED. COMPATIBLE WITH UPDATED TYPE SYSTEM.

</details>
<details>
<summary>task_hive/lib/features/auth/presentation/screens/signin_screen.dart (3)</summary>

`9-9`: **IMPORT DECLARATION MODIFIED**

SCANNING... IMPORT PATH ADJUSTED FROM 'user_info.dart' TO 'user_entity.dart'
CONSISTENT WITH APPLICATION-WIDE REFACTORING INITIATIVE.

---

`172-172`: **NAVIGATION ENHANCEMENT DETECTED**

ROUTING LOGIC IMPROVED: NOW PASSING USER DATA TO PROFILE SCREEN THROUGH 'extra' PARAMETER.
THIS ENABLES DYNAMIC USER INFORMATION DISPLAY IN PROFILE SCREEN.

---

`246-249`: **CONSTRUCTOR INVOCATION UPDATED**

INSTANTIATION CHANGED: 'UserInfo' → 'UserEntity'
PARAMETER STRUCTURE MAINTAINED WITH EMAIL AND PASSWORD.

</details>
<details>
<summary>task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart (1)</summary>

`6-6`: **IMPORT STATEMENT MODIFIED**

ANALYSIS: IMPORT PATH CHANGED FROM 'user_info.dart' TO 'user_entity.dart'
THIS MODIFICATION ALIGNS WITH CODEBASE-WIDE ENTITY RENAMING.

</details>
<details>
<summary>task_hive/lib/core/navigation/dummy_pages/dummy_page_2.dart (1)</summary>

`1-25`: **CODE IMPLEMENTATION SATISFACTORY. ANALYSIS COMPLETE.**

WIDGET STRUCTURE FOLLOWS OPTIMAL FLUTTER PATTERNS. NAVIGATION IMPLEMENTATION USING `context.go()` METHOD IS CORRECTLY CONFIGURED FOR INTER-PAGE TRANSITIONS. 

OBSERVATION: THIS COMPONENT SERVES AS SECONDARY DESTINATION IN NEWLY INTRODUCED BOTTOM NAVIGATION SYSTEM.

</details>
<details>
<summary>task_hive/lib/core/navigation/routes.dart (1)</summary>

`16-18`: **ROUTE CONSTANTS ADDED SUCCESSFULLY.**

ROUTES FOR DUMMY NAVIGATION PAGES PROPERLY DEFINED AND FOLLOW EXISTING NAMING CONVENTIONS. THESE CONSTANTS WILL SERVE AS NAVIGATION IDENTIFIERS FOR BOTTOM NAVIGATION STRUCTURE.

</details>
<details>
<summary>task_hive/lib/core/navigation/dummy_pages/dummy_page_1.dart (1)</summary>

`1-24`: **CODE IMPLEMENTATION SATISFACTORY. ANALYSIS COMPLETE.**

WIDGET STRUCTURE FOLLOWS OPTIMAL FLUTTER PATTERNS. NAVIGATION IMPLEMENTATION USING `context.go()` METHOD IS CORRECTLY CONFIGURED. 

OBSERVATION: THIS COMPONENT SERVES AS PRIMARY DESTINATION IN NEWLY INTRODUCED BOTTOM NAVIGATION SYSTEM. COMPLEMENTS DummyPage2 TO DEMONSTRATE MULTI-TAB FUNCTIONALITY.

</details>
<details>
<summary>task_hive/lib/features/profile/presentation/screens/profile_screen.dart (4)</summary>

`6-6`: **IMPORT STATEMENT CORRECTLY ADDED.**

NEW IMPORT STATEMENT PROPERLY REFERENCES UserEntity MODEL FROM AUTH DOMAIN. SUPPORTS UPDATED USER DATA HANDLING MECHANISM.

---

`11-12`: **CONSTRUCTOR PARAMETERS UPDATED CORRECTLY.**

CONSTRUCTOR NOW ACCEPTS OPTIONAL UserEntity PARAMETER. NULL-SAFETY PROPERLY IMPLEMENTED WITH QUESTION MARK OPERATOR.

---

`35-35`: **NULL-SAFE DATA ACCESS IMPLEMENTED CORRECTLY.**

PROFILE SCREEN NOW DYNAMICALLY DISPLAYS USER NAME WITH FALLBACK VALUE IF userData IS NULL. IMPLEMENTATION USES PROPER NULL-COALESCING OPERATOR.

---

`40-40`: **NULL-SAFE DATA ACCESS IMPLEMENTED CORRECTLY.**

EMAIL DISPLAY FOLLOWS SAME PATTERN AS NAME DISPLAY. FALLBACK EMAIL PROVIDED IF userData IS NULL. IMPLEMENTATION USES PROPER NULL-COALESCING OPERATOR.

</details>
<details>
<summary>task_hive/lib/features/auth/presentation/cubits/auth/sign_in/sign_in_state.dart (1)</summary>

`9-10`: **ANALYSIS: FIELD TYPE TRANSFORMATION DETECTED.**

USER ENTITY INTEGRATION COMPLETED SUCCESSFULLY. PREVIOUS CODE UTILIZED GENERIC SUCCESS PARAMETER. NEW IMPLEMENTATION PROVIDES SPECIFIC USER DATA OBJECT WITH ENHANCED INFORMATION CAPACITY.

THIS MODIFICATION ENABLES DIRECT ACCESS TO USER ATTRIBUTES IN CONSUMING COMPONENTS. CHANGE IS LOGICAL AND ALIGNS WITH ARCHITECTURAL IMPROVEMENTS.

</details>
<details>
<summary>task_hive/lib/features/auth/data/data_source/remote/auth_data_source.dart (3)</summary>

`1-1`: **IMPORT REFERENCE UPDATED.**

ENTITY REFERENCE PATH MODIFICATION DETECTED. PREVIOUS REFERENCE TO 'USER_INFO.DART' REPLACED WITH 'USER_ENTITY.DART'. CHANGE IS CONSISTENT WITH ENTITY RENAMING PATTERN.

---

`4-5`: **METHOD SIGNATURE UPDATE DETECTED.**

PARAMETER TYPE CHANGED FROM 'USERINFO' TO 'USERENTITY'. MODIFICATIONS MAINTAIN INTERFACE CONSISTENCY WITH DOMAIN MODEL CHANGES. SIGNATURE UPDATE IS NECESSARY FOR TYPE COMPATIBILITY.

---

`8-8`: **PARAMETER TYPE MODIFICATION DETECTED.**

'ADDUSER' METHOD UPDATED TO ACCEPT 'USERENTITY' PARAMETER. CHANGE MAINTAINS CONSISTENCY WITH OTHER METHOD UPDATES. MODIFICATION IS CORRECTLY IMPLEMENTED.

</details>
<details>
<summary>task_hive/lib/features/auth/data/model/sign_in_model.dart (1)</summary>

`1-19`: **NEW DATA TRANSFER OBJECT IMPLEMENTATION DETECTED.**

ANALYSIS OF 'SIGNINMODEL':
- PURPOSE: CONVERTS JSON RESPONSE TO DOMAIN ENTITY
- STRUCTURE: CONTAINS EMAIL AND NAME WITH NULLABLE PROPERTIES
- CAPABILITIES: JSON DESERIALIZATION AND ENTITY CONVERSION

MODEL DESIGN FOLLOWS DATA TRANSFORMATION PATTERN. 'TOJSON' METHOD MISSING BUT NOT CRITICAL IF ONE-WAY TRANSFORMATION INTENDED.

IMPLEMENTATION IS CORRECTLY STRUCTURED BUT NULLABLE PROPERTIES SHOULD BE VERIFIED AGAINST BUSINESS REQUIREMENTS.


HUMAN VERIFICATION RECOMMENDED: CONFIRM IF NULL EMAIL IS ACCEPTABLE IN BUSINESS LOGIC. IF EMAIL IS REQUIRED FOR AUTHENTICATION, CONSIDER ADDING NULL CHECKS OR MAKING PROPERTY NON-NULLABLE.

</details>
<details>
<summary>task_hive/lib/features/auth/domain/entity/user_entity.dart (3)</summary>

`1-1`: **CLASS DESIGNATION UPDATED.**

CLASS RENAMED FROM 'USERINFO' TO 'USERENTITY'. CHANGE FOLLOWS DOMAIN-DRIVEN DESIGN NAMING CONVENTIONS. MODIFICATION IMPROVES SEMANTIC CLARITY.

---

`9-9`: **CONSTRUCTOR NAME SYNCHRONIZED.**

CONSTRUCTOR RENAMED TO MATCH CLASS NAME CHANGE. MODIFICATION MAINTAINS CONSTRUCTOR-CLASS NAME ALIGNMENT AS PER DART CONVENTIONS.

---

`18-26`: **JSON MAPPING RECONFIGURATION DETECTED.**

KEY CHANGES IN 'TOJSON' METHOD:
1. 'NAME' FIELD NOW MAPS TO 'FULL_NAME' KEY
2. PASSWORD FIELD CORRECTLY OMITTED FROM JSON OUTPUT
3. 'PROFILE_PICTURE_URL' PROPERTY NOW MAPS TO 'PROFILE_PICTURE' KEY

THESE CHANGES ALIGN WITH EXTERNAL API EXPECTATIONS. JSON STRUCTURE NOW MATCHES BACKEND REQUIREMENTS.

ONE OBSERVATION: ISO8601 TIMESTAMP GENERATION REMAINS UNCHANGED.

</details>
<details>
<summary>task_hive/lib/features/auth/domain/repository/auth_repository.dart (3)</summary>

`5-5`: **IMPORT MODIFICATION DETECTED.**

Analysis: Import path has been updated from 'user_info.dart' to 'user_entity.dart'. This indicates entity renaming operation.

---

`8-9`: **PARAMETER AND RETURN TYPE ALTERATION DETECTED.**

Modification changes method signatures to use UserEntity instead of UserInfo. SignIn method now returns UserEntity instead of Success. This update improves data flow by providing actual user data instead of generic success indicator.

---

`11-11`: **RETURN TYPE MODIFICATION DETECTED.**

VerifyOtp method return type changed to Either<UserEntity, Failure>. This maintains consistency with SignIn method changes and improves data accessibility after authentication.

</details>
<details>
<summary>task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart (2)</summary>

`5-5`: **IMPORT MODIFICATION DETECTED.**

Analysis: Import path has been updated from 'user_info.dart' to 'user_entity.dart'. This change maintains consistency with domain layer modifications.

---

`16-16`: **PARAMETER TYPE ALTERATION DETECTED.**

Method parameters updated from UserInfo to UserEntity. This maintains consistency with repository interface changes.



Also applies to: 24-24, 43-43

</details>
<details>
<summary>task_hive/lib/core/navigation/nav_bar.dart (1)</summary>

`1-67`: **NEW NAVIGATION COMPONENT DETECTED.**

ScaffoldWithNestedNavigation widget introduced for bottom navigation. Implementation uses StatefulNavigationShell for navigation state management.

</details>
<details>
<summary>task_hive/lib/features/auth/domain/use_case/auth_use_case.dart (3)</summary>

`7-7`: **IMPORT MODIFICATION DETECTED.**

Import path has been updated from 'user_info.dart' to 'user_entity.dart'. This maintains consistency with repository layer changes.

---

`9-9`: **TYPE MODIFICATION IN SIGNUP USECASE DETECTED.**

SignUpUseCase now uses UserEntity type instead of UserInfo, maintaining consistency with repository changes.



Also applies to: 14-14

---

`19-19`: **TYPE MODIFICATION IN SIGNIN USECASE DETECTED.**

SignInUseCase now returns UserEntity on success instead of generic Success type. This improves data flow by providing direct access to user entity after authentication.



Also applies to: 24-24

</details>
<details>
<summary>task_hive/lib/core/navigation/router_config.dart (1)</summary>

`19-25`: <details>
<summary>❌ Incorrect review comment</summary>

**Beep boop 🤖 – Static `refresh()` risks NPEs if called too early**

`refresh()` depends on the `router` static having already been initialised.  
If another class calls `MyRouterConfig.refresh()` during app start‑up *before* `router` is constructed, a null check error will occur.

```diff
-  static void refresh() {
-    router.go(MyRoutes.profile);
-  }
+  static void refresh() {
+    // defend against premature calls
+    if (router.hasListeners) {
+      router.go(MyRoutes.profile);
+    }
+  }
```

Alternatively, expose a `Future<void>` initialisation API and call `go()` from there.

---

Beep boop 🤖 — Locating the `router` declaration for verification.

---

🏁 Script executed:

```shell
#!/bin/bash
# Search for the static router declaration in the navigation config
grep -R "static .*router" -n task_hive/lib/core/navigation/router_config.dart
```

Length of output: 116

---



</details>

**Invalid null‑safety concern – `router` is a non‑nullable `static final`**  
Dart guarantees that a `static final` with an initializer is lazily initialized on first access, so `router` can never be null when `refresh()` invokes `router.go(...)`. Moreover, `GoRouter` does not expose a `hasListeners` property, so the suggested guard won’t compile. No changes needed. 

> Likely an incorrect or invalid review comment.

</details>
<details>
<summary>task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart (1)</summary>

`42-46`: <details>
<summary>❌ Incorrect review comment</summary>

**Beep boop 🤖 – Double network hit in `signUp`**

You call both `signUp` *and* `addUser`. If the remote API already persists the user, the second request may be redundant or race. Confirm backend contract and refactor into a single call when possible to save latency.

---

Affirmative, initiating codebase inspection for `signUp` and `addUser` definitions… 🤖

---

🏁 Script executed:

```shell
#!/bin/bash
# Locate AuthDataSource interface/implementation
rg -n "class .*AuthDataSource" --glob "*.dart"
rg -n "abstract class .*AuthDataSource" --glob "*.dart"

# Find where signUp and addUser are implemented
rg -n "signUp" --glob "*.dart"
rg -n "addUser" --glob "*.dart"
```

Length of output: 3241

---

Affirmative, retrieving `signUp` and `addUser` implementations… 🤖

---

🏁 Script executed:

```shell
#!/bin/bash
# Show signUp implementation
rg -n "Future<void> signUp" -A10 -B2 task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart

# Show addUser implementation
rg -n "Future<void> addUser" -A10 -B2 task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart
```

Length of output: 942

---



</details>

**Incorrect assumption – these calls serve distinct purposes**  
The `signUp` method invokes the Auth API to register the user’s credentials, while `addUser` writes the user’s profile data into the “users” table. They’re not redundant network hits but a necessary two-step (authentication + profile persistence) flow. No refactoring needed. 

> Likely an incorrect or invalid review comment.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-17T17:55:59Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>♻️ Duplicate comments (5)</summary><blockquote>

<details>
<summary>task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart (1)</summary><blockquote>

`52-68`: **IMPLEMENTATION OF PREVIOUSLY UNIMPLEMENTED METHOD DETECTED.**

METHOD 'getUser()' NOW PROPERLY IMPLEMENTED WITH ROBUST ERROR HANDLING AND CLEAR ERROR MESSAGES. CORRECT EXECUTION OF PREVIOUS REVIEW RECOMMENDATIONS OBSERVED.

</blockquote></details>
<details>
<summary>task_hive/lib/core/navigation/nav_bar.dart (1)</summary><blockquote>

`18-53`: _🧹 Nitpick (assertive)_

**BOTTOM NAVIGATION BAR IMPLEMENTATION DETECTED.**

NAVIGATION STRUCTURE WITH THREE NAVIGATION BRANCHES PROPERLY CONFIGURED. ICON CONSISTENCY ISSUE FROM PREVIOUS REVIEW FIXED WITH 'Icons.add_circle' FOR ACTIVE STATE.




ERROR DETECTED: VARIABLE 'selectedColor' DEFINED ON LINES 19-20 NOT UTILIZED IN IMPLEMENTATION.

```diff
-    final selectedColor =
-        Theme.of(context).colorScheme.primary.withOpacity(0.5);
```

</blockquote></details>
<details>
<summary>task_hive/lib/core/navigation/router_config.dart (2)</summary><blockquote>

`32-37`: **Beep boop 🤖 – Redirect still bypasses auth guard**  

Identical to feedback on a previous commit: `/` immediately redirects to `MyRoutes.profile` without checking authentication. Anonymous users will hit a protected screen and may encounter loops once sign‑out is implemented.

---

`133-135`: **Beep boop 🤖 – `_updateBackButtonBehavior` remains a no‑op**  

The method is still empty, so every navigator callback pays the cost of an asynchronous invocation that does nothing. Either implement the platform‑specific logic or delete the plumbing to avoid dead code.

</blockquote></details>
<details>
<summary>task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart (1)</summary><blockquote>

`52-54`: **Beep boop 🤖 – `verifyOtp()` still unimplemented**  

Function returns a failure placeholder. Wire it to the data‑source or, at minimum, surface a meaningful error for the UI layer.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 392b79f1180f2a255c3f65c593a196b81fd4db58 and de8a45e2651f268e5813c51a83f472edb51b9360.

</details>

<details>
<summary>📒 Files selected for processing (6)</summary>

* `task_hive/lib/core/navigation/nav_bar.dart` (1 hunks)
* `task_hive/lib/core/navigation/router_config.dart` (2 hunks)
* `task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart` (4 hunks)
* `task_hive/lib/features/auth/data/model/sign_in_model.dart` (1 hunks)
* `task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart` (3 hunks)
* `task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart` (2 hunks)

</details>

<details>
<summary>🔇 Additional comments (5)</summary><blockquote>

<details>
<summary>task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart (1)</summary>

`6-6`: **MODEL TYPE TRANSITION DETECTED.**

IDENTIFIED DOMAIN ENTITY REFACTORING FROM 'UserInfo' TO 'UserEntity'. CONSISTENT TYPE CHANGES APPLIED ACROSS IMPORT AND METHOD SIGNATURE. PARAMETER NAME 'userEntity' CORRECTLY MATCHES TYPE NAME.




Also applies to: 16-16, 18-18

</details>
<details>
<summary>task_hive/lib/features/auth/data/model/sign_in_model.dart (1)</summary>

`1-19`: **NEW DATA TRANSFER MODEL IMPLEMENTATION DETECTED.**

MODEL FULFILLS CRITICAL TRANSFORMATION FUNCTION BETWEEN JSON DATA AND DOMAIN ENTITY. DEFAULT VALUES PROVIDED FOR MISSING JSON FIELDS = GOOD PRACTICE.



SUGGESTION: CONSIDER ADDING EMAIL FORMAT VALIDATION FUNCTION TO ENHANCE DATA INTEGRITY WHEN PROCESSING INCOMING JSON.

</details>
<details>
<summary>task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart (1)</summary>

`5-5`: **MODEL TYPE TRANSITION DETECTED.**

TYPE REFERENCES UPDATED FROM 'UserInfo' TO 'UserEntity' IN IMPORT AND METHOD SIGNATURES. CONSISTENT WITH DOMAIN REFACTORING PATTERN.




Also applies to: 16-16, 24-24, 43-43

</details>
<details>
<summary>task_hive/lib/core/navigation/nav_bar.dart (2)</summary>

`4-17`: **NAVIGATION SHELL CLASS IMPLEMENTATION DETECTED.**

CLASS EFFECTIVELY IMPLEMENTS NESTED NAVIGATION USING STATEFULNAVIGATIONSHELL. BRANCH NAVIGATION LOGIC CORRECTLY HANDLES INITIAL LOCATION RESET.

---

`55-63`: **SCAFFOLD IMPLEMENTATION DETECTED.**

SCAFFOLD CORRECTLY CONFIGURED WITH GLOBAL KEY AND NAVIGATION SHELL BODY. STRUCTURE FOLLOWS BEST PRACTICES FOR BOTTOM NAVIGATION IMPLEMENTATION.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-17T18:10:08Z

Review comments:
diff_hunk: @@ -13,7 +13,7 @@ class SignUpCubit extends Cubit<SignUpState> {
 
   final SignUpUseCase _signUpUseCase;
 
-  void signUp(UserInfo userInfo) async {
+  void signUp(UserEntity userInfo) async {
path: task_hive/lib/features/auth/presentation/cubits/auth/sign_up/sign_up_cubit.dart
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**METHOD PARAMETER TYPE UPDATED**

FUNCTION SIGNATURE MODIFICATION: 'UserInfo userInfo' → 'UserEntity userInfo'
PARAMETER NAME PRESERVED. ONLY TYPE CHANGED TO MATCH NEW DOMAIN MODEL.


SUGGESTION: CONSIDER RENAMING PARAMETER FROM 'userInfo' TO 'userEntity' TO MATCH TYPE NAME.

```diff
-  void signUp(UserEntity userInfo) async {
+  void signUp(UserEntity userEntity) async {
```

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -49,8 +49,13 @@ class AuthDataSourceImpl implements AuthDataSource {
   }
 
   @override
-  Future<Map<String, dynamic>> getUser() {
-    // TODO: implement getUser
-    throw UnimplementedError();
+  Future<Map<String, dynamic>> getUser() async {
+    final email = supabaseClient.auth.currentUser?.email;
+    if (email == null) {
+      throw Exception('User not found');
+    }
+    final response =
+        await supabaseClient.from('users').select().eq('email', email).single();
+    return response;
   }
path: task_hive/lib/features/auth/data/data_source/remote/auth_data_source_impl.dart
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**IMPLEMENTATION OF PREVIOUSLY UNIMPLEMENTED METHOD DETECTED.**

GetUser method implementation fetches current user data from Supabase. Error handling could be improved.


```diff
 Future<Map<String, dynamic>> getUser() async {
   final email = supabaseClient.auth.currentUser?.email;
   if (email == null) {
-    throw Exception('User not found');
+    throw Exception('Current user email not found. User may not be authenticated.');
   }
-  final response =
-      await supabaseClient.from('users').select().eq('email', email).single();
-  return response;
+  try {
+    final response =
+        await supabaseClient.from('users').select().eq('email', email).single();
+    return response;
+  } catch (e) {
+    throw Exception('Error retrieving user data: ${e.toString()}');
+  }
 }
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
  Future<Map<String, dynamic>> getUser() async {
    final email = supabaseClient.auth.currentUser?.email;
    if (email == null) {
      throw Exception('Current user email not found. User may not be authenticated.');
    }
    try {
      final response =
          await supabaseClient.from('users').select().eq('email', email).single();
      return response;
    } catch (e) {
      throw Exception('Error retrieving user data: ${e.toString()}');
    }
  }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -0,0 +1,66 @@
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class ScaffoldWithNestedNavigation extends StatelessWidget {
+  ScaffoldWithNestedNavigation({
+    Key? key,
+    required this.navigationShell,
+  }) : super(key: key ?? const ValueKey('ScaffoldWithNestedNavigation'));
+  final StatefulNavigationShell navigationShell;
+
+  void _goBranch(int index) {
+    navigationShell.goBranch(
+      index,
+      initialLocation: index == navigationShell.currentIndex,
+    );
+  }
+
+  Widget _buildBottomNavigationBar(BuildContext context) {
+    final selectedColor =
+        Theme.of(context).colorScheme.primary.withOpacity(0.5);
+    return BottomNavigationBar(
+      type: BottomNavigationBarType.fixed,
+      currentIndex: navigationShell.currentIndex,
+      elevation: 0,
+      items: [
+        BottomNavigationBarItem(
+          icon: Icon(Icons.house_outlined),
+          label: 'Home',
+          activeIcon: Icon(Icons.house_rounded),
+          tooltip: 'Home',
+        ),
+        BottomNavigationBarItem(
+          icon: Icon(Icons.add_outlined),
+          label: 'Add',
+          activeIcon: Icon(
+            Icons.add_outlined,
+          ),
+          tooltip: 'Add',
+        ),
+        BottomNavigationBarItem(
+          icon: Icon(
+            Icons.person_outlined,
+          ),
+          label: 'Profile',
+          activeIcon: Icon(
+            Icons.person_rounded,
+          ),
+          tooltip: 'Profile',
+        ),
+      ],
+      onTap: _goBranch,
+    );
+  }
+
+  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      key: scaffoldKey,
+      body: navigationShell,
+      // floatingActionButton: _buildFloatingActionButton(context),
+      // floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
path: task_hive/lib/core/navigation/nav_bar.dart
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**COMMENTED CODE DETECTED.**

Commented code for floating action button suggests incomplete implementation. Consider removing if not needed or completing implementation.


```diff
- // floatingActionButton: _buildFloatingActionButton(context),
- // floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion

`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -0,0 +1,66 @@
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class ScaffoldWithNestedNavigation extends StatelessWidget {
+  ScaffoldWithNestedNavigation({
+    Key? key,
+    required this.navigationShell,
+  }) : super(key: key ?? const ValueKey('ScaffoldWithNestedNavigation'));
+  final StatefulNavigationShell navigationShell;
+
+  void _goBranch(int index) {
+    navigationShell.goBranch(
+      index,
+      initialLocation: index == navigationShell.currentIndex,
+    );
+  }
+
+  Widget _buildBottomNavigationBar(BuildContext context) {
+    final selectedColor =
+        Theme.of(context).colorScheme.primary.withOpacity(0.5);
+    return BottomNavigationBar(
+      type: BottomNavigationBarType.fixed,
+      currentIndex: navigationShell.currentIndex,
+      elevation: 0,
+      items: [
+        BottomNavigationBarItem(
+          icon: Icon(Icons.house_outlined),
+          label: 'Home',
+          activeIcon: Icon(Icons.house_rounded),
+          tooltip: 'Home',
+        ),
+        BottomNavigationBarItem(
+          icon: Icon(Icons.add_outlined),
+          label: 'Add',
+          activeIcon: Icon(
+            Icons.add_outlined,
+          ),
+          tooltip: 'Add',
path: task_hive/lib/core/navigation/nav_bar.dart
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**INCONSISTENT ICON USAGE DETECTED.**

Add button uses same icon (Icons.add_outlined) for both active and inactive states, unlike Home and Profile buttons which have distinct active states.


```diff
 BottomNavigationBarItem(
   icon: Icon(Icons.add_outlined),
   label: 'Add',
   activeIcon: Icon(
-    Icons.add_outlined,
+    Icons.add_circle,
   ),
   tooltip: 'Add',
 ),
```

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -1,26 +1,82 @@
+import 'package:flutter/material.dart';
 import 'package:go_router/go_router.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_1.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_2.dart';
 import 'package:task_hive/features/auth/presentation/screens/forget_pass_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/sign_up_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/signin_screen.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_1.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_2.dart';
-import 'package:task_hive/features/onboarding/presentation/screens/splash_screen.dart';
 import 'package:task_hive/features/profile/presentation/screens/profile_screen.dart';
 
+import '../../features/auth/domain/entity/user_entity.dart';
 import '../../features/onboarding/presentation/screens/onboard_screen_3.dart';
 import 'error_page.dart';
+import 'nav_bar.dart';
 import 'routes.dart';
 
 class MyRouterConfig {
+  static final GlobalKey<NavigatorState> rootNavigatorKey =
+      GlobalKey<NavigatorState>();
+
+  static void refresh() {
+    router.go(MyRoutes.profile);
+  }
+
   static final router = GoRouter(
+    navigatorKey: rootNavigatorKey,
+    observers: [MyRouterObserver()],
     errorBuilder: (context, state) {
       return const ErrorPage();
     },
+    redirect: (context, state) {
+      if (state.uri.path == '/') {
+        return MyRoutes.profile;
+      }
+      return null;
+    },
     initialLocation: MyRoutes.initialRoute,
     routes: [
-      GoRoute(
-        path: MyRoutes.initialRoute,
-        builder: (context, state) => const SplashScreen(),
+      StatefulShellRoute.indexedStack(
+        builder: (context, state, navigationShell) {
+          return ScaffoldWithNestedNavigation(
+            navigationShell: navigationShell,
+          );
+        },
+        branches: [
+          StatefulShellBranch(
+            initialLocation: MyRoutes.dummyPage1, // Add this
+            routes: [
+              GoRoute(
+                path: MyRoutes.dummyPage1,
+                builder: (context, state) {
+                  return const DummyPage1();
+                },
+              ),
+            ],
+          ),
path: task_hive/lib/core/navigation/router_config.dart
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Beep boop 🤖 – `initialLocation` hard‑codes branch‑0; maybe derive from route**

Hard‑wiring `MyRoutes.dummyPage1` here forces tab‑0 to *always* open that path.  
If you ever deep‑link to `/dummyPage2`, the bottom‑nav index will still start at 0 and switch instantly, producing a flash.

Investigate `StatefulShellRoute.indexedStack.restoreInitialLocation = false` or compute the index from `state.location` so deep links land on the correct tab.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -42,10 +98,12 @@ class MyRouterConfig {
         path: MyRoutes.signInRoute,
         builder: (context, state) => const SignInScreen(),
       ),
-      GoRoute(
-        path: MyRoutes.profile,
-        builder: (context, state) => const ProfileScreen(),
-      ),
+      // GoRoute(
+      //     path: MyRoutes.profile,
+      //     builder: (context, state) {
+      //       final userData = state.extra as UserEntity?;
+      //       return ProfileScreen(userData: userData);
+      //     }),
path: task_hive/lib/core/navigation/router_config.dart
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Beep boop 🤖 – Remove commented legacy code**

Leaving the old `Profile` route commented clutters the file and confuses readers. VCS already retains history. 🤓

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -1,26 +1,82 @@
+import 'package:flutter/material.dart';
 import 'package:go_router/go_router.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_1.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_2.dart';
 import 'package:task_hive/features/auth/presentation/screens/forget_pass_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/sign_up_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/signin_screen.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_1.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_2.dart';
-import 'package:task_hive/features/onboarding/presentation/screens/splash_screen.dart';
 import 'package:task_hive/features/profile/presentation/screens/profile_screen.dart';
 
+import '../../features/auth/domain/entity/user_entity.dart';
 import '../../features/onboarding/presentation/screens/onboard_screen_3.dart';
 import 'error_page.dart';
+import 'nav_bar.dart';
 import 'routes.dart';
 
 class MyRouterConfig {
+  static final GlobalKey<NavigatorState> rootNavigatorKey =
+      GlobalKey<NavigatorState>();
+
+  static void refresh() {
+    router.go(MyRoutes.profile);
+  }
+
   static final router = GoRouter(
+    navigatorKey: rootNavigatorKey,
+    observers: [MyRouterObserver()],
     errorBuilder: (context, state) {
       return const ErrorPage();
     },
+    redirect: (context, state) {
+      if (state.uri.path == '/') {
+        return MyRoutes.profile;
+      }
+      return null;
+    },
path: task_hive/lib/core/navigation/router_config.dart
user: login: coderabbitai[bot]
body: _💡 Verification agent_

_🛠️ Refactor suggestion_

<details>
<summary>🧩 Analysis chain</summary>

**Beep boop 🤖 – Unconditional redirect to profile may break auth flow**

Redirecting `/` → `profile` without authentication checks sends anonymous users straight to a protected screen and might create circular redirects once sign‑out logic lands.

Consider:

```dart
redirect: (context, state) {
  final auth = ref.read(authProvider); // pseudo
  if (!auth.isLoggedIn && state.uri.path == '/') {
    return MyRoutes.signInRoute;
  }
  return null;
},
```

Implement an auth gate or guard to keep flows deterministic.

---

Beep boop 🤖 Initiating codebase scan for auth logic in router_config.dart…

---

🏁 Script executed:

```shell
#!/bin/bash
set -e
# Locate the router configuration file
FILE=$(fd router_config.dart | head -n1)
echo "Found router_config.dart at: $FILE"

# Show the top of the file to find context for redirect
echo "==== Snippet (lines 1–80) of router_config.dart ===="
sed -n '1,80p' "$FILE"

# Search for any auth-related providers or guards
echo "==== Searching for 'authProvider' and 'isLoggedIn' usage in codebase ===="
rg -n "authProvider|isLoggedIn" || echo "No direct auth checks found."
```

Length of output: 3440

---



</details>

**Implement authentication guard in root redirect**

Beep boop 🤖 – The current `redirect` unconditionally sends `/` → `MyRoutes.profile`, with no auth check. Anonymous users will be routed into a protected screen.

Please update `router_config.dart`:

- Import and read your auth state/provider (e.g. `authStateProvider`, `authNotifier`, etc.).
- In the `redirect` callback, only redirect to profile when authenticated; otherwise send unauthenticated users to your sign‑in route.
- Example snippet (adjust to your provider names):

  ```dart
  redirect: (context, state) {
    final isLoggedIn = ref.read(authStateProvider).isLoggedIn;
    if (!isLoggedIn && state.uri.path == '/') {
      return MyRoutes.signIn;
    }
    if (isLoggedIn && state.uri.path == '/') {
      return MyRoutes.profile;
    }
    return null;
  },
  ```

• Ensure you import your auth provider at the top of `task_hive/lib/core/navigation/router_config.dart`.  
• Add any necessary unit/integration tests around your redirect logic.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -57,3 +115,25 @@ class MyRouterConfig {
     ],
   );
 }
+
+class MyRouterObserver extends NavigatorObserver {
+  @override
+  void didPush(Route route, Route? previousRoute) {
+    super.didPush(route, previousRoute);
+    _updateBackButtonBehavior(route);
+  }
+
+  @override
+  void didPop(Route route, Route? previousRoute) {
+    super.didPop(route, previousRoute);
+    _updateBackButtonBehavior(previousRoute);
+  }
+
+  @override
+  void didReplace({Route? newRoute, Route? oldRoute}) {
+    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
+    _updateBackButtonBehavior(newRoute);
+  }
+
+  Future<void> _updateBackButtonBehavior(Route? route) async {}
+}
path: task_hive/lib/core/navigation/router_config.dart
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>❓ Verification inconclusive</summary>

**Beep boop 🤖 – `_updateBackButtonBehavior` is a no‑op**

The observer dutifully calls a method that does nothing. Either implement platform‑specific back‑button tweaks or delete the plumbing to avoid dead code.

```diff
-Future<void> _updateBackButtonBehavior(Route? route) async {}
+Future<void> _updateBackButtonBehavior(Route? route) async {
+  // TODO: Determine desired behaviour, e.g. SystemNavigator.pop on root stack.
+}
```

Unimplemented logic can surprise future maintainers.

---



</details>

Beep boop 🤖  
**Implement or remove empty `_updateBackButtonBehavior`**

- Location: `task_hive/lib/core/navigation/router_config.dart` (lines 119–139)  
- Issue: `_updateBackButtonBehavior(Route? route)` is invoked by all NavigatorObserver callbacks but contains no logic

Suggested fix:

```diff
-Future<void> _updateBackButtonBehavior(Route? route) async {}
+Future<void> _updateBackButtonBehavior(Route? route) async {
+  // TODO: Implement platform-specific back-button handling (e.g. call SystemNavigator.pop on root)
+}
```

Leaving this method unimplemented may confuse future maintainers.

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -1,26 +1,82 @@
+import 'package:flutter/material.dart';
 import 'package:go_router/go_router.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_1.dart';
+import 'package:task_hive/core/navigation/dummy_pages/dummy_page_2.dart';
 import 'package:task_hive/features/auth/presentation/screens/forget_pass_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/sign_up_screen.dart';
 import 'package:task_hive/features/auth/presentation/screens/signin_screen.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_1.dart';
 import 'package:task_hive/features/onboarding/presentation/screens/onboard_screen_2.dart';
-import 'package:task_hive/features/onboarding/presentation/screens/splash_screen.dart';
 import 'package:task_hive/features/profile/presentation/screens/profile_screen.dart';
 
+import '../../features/auth/domain/entity/user_entity.dart';
 import '../../features/onboarding/presentation/screens/onboard_screen_3.dart';
 import 'error_page.dart';
+import 'nav_bar.dart';
 import 'routes.dart';
 
 class MyRouterConfig {
+  static final GlobalKey<NavigatorState> rootNavigatorKey =
+      GlobalKey<NavigatorState>();
+
+  static void refresh() {
+    router.go(MyRoutes.profile);
+  }
+
   static final router = GoRouter(
+    navigatorKey: rootNavigatorKey,
+    observers: [MyRouterObserver()],
     errorBuilder: (context, state) {
       return const ErrorPage();
     },
+    redirect: (context, state) {
+      if (state.uri.path == '/') {
+        return MyRoutes.profile;
+      }
+      return null;
+    },
     initialLocation: MyRoutes.initialRoute,
     routes: [
-      GoRoute(
-        path: MyRoutes.initialRoute,
-        builder: (context, state) => const SplashScreen(),
+      StatefulShellRoute.indexedStack(
+        builder: (context, state, navigationShell) {
+          return ScaffoldWithNestedNavigation(
+            navigationShell: navigationShell,
+          );
+        },
+        branches: [
+          StatefulShellBranch(
+            initialLocation: MyRoutes.dummyPage1, // Add this
+            routes: [
+              GoRoute(
+                path: MyRoutes.dummyPage1,
+                builder: (context, state) {
+                  return const DummyPage1();
+                },
+              ),
+            ],
+          ),
+          StatefulShellBranch(
+            routes: [
+              GoRoute(
+                path: MyRoutes.dummyPage2,
+                builder: (context, state) {
+                  return const DummyPage2();
+                },
+              ),
+            ],
+          ),
+          StatefulShellBranch(
+            routes: [
+              GoRoute(
+                path: MyRoutes.profile,
+                builder: (context, state) {
+                  final userData = state.extra as UserEntity?;
+                  return ProfileScreen(userData: userData);
+                },
path: task_hive/lib/core/navigation/router_config.dart
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Beep boop 🤖 – Blind cast on `state.extra` may crash**

`state.extra` is cast using `as UserEntity?`; if an upstream caller passes a wrong type, an exception is thrown synchronously inside the builder.

```diff
- final userData = state.extra as UserEntity?;
+ final userData = state.extra is UserEntity ? state.extra as UserEntity : null;
```

Or better, introduce a typed `GoRouteData` wrapper for compile‑time safety.  
  


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
                path: MyRoutes.profile,
                builder: (context, state) {
-                  final userData = state.extra as UserEntity?;
+                  final userData = state.extra is UserEntity ? state.extra as UserEntity : null;
                  return ProfileScreen(userData: userData);
                },
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -45,7 +49,7 @@ class AuthReposityImpl implements AuthRepository {
   }
 
   @override
-  Future<Either<UserInfo, Failure>> verifyOtp() {
+  Future<Either<UserEntity, Failure>> verifyOtp() {
     throw UnimplementedError();
   }
path: task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Beep boop 🤖 – `verifyOtp` throws `UnimplementedError`**

Any code path invoking this will crash the app. Provide at least a graceful failure:

```diff
Future<Either<UserEntity, Failure>> verifyOtp() async {
-  throw UnimplementedError();
+  return Right(Failure('verifyOtp() not yet implemented'));
}
```

Better: wire it to `_authDataSource.verifyOtp(...)`.  
  


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
  Future<Either<UserEntity, Failure>> verifyOtp() async {
    return Right(Failure('verifyOtp() not yet implemented'));
  }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit de8a45e
created_at: 2025-04-17T17:55:58Z
author_association: NONE
diff_hunk: @@ -24,17 +24,21 @@ class AuthReposityImpl implements AuthRepository {
   }
 
   @override
-  Future<Either<Success, Failure>> signIn(UserInfo userInfo) async {
+  Future<Either<UserEntity, Failure>> signIn(UserEntity userInfo) async {
     try {
       await _authDataSource.signIn(userInfo);
-      return Left(Success('Sign in successful'));
+
+      final user = await _authDataSource.getUser();
+      logger.e(user);
+
+      return Left(SignInModel.fromJson(user).toEntity());
     } catch (e) {
path: task_hive/lib/features/auth/data/repository/auth_reposity_impl.dart
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Beep boop 🤖 – `Either` polarity is inverted & unsafe user parsing**  

1. In `dartz`, `Left` conventionally holds *Failure* and `Right` holds *Success*. Returning `Left(UserEntity)` and `Right(Failure)` flips that contract and will confuse every consumer of the repo.  
2. `getUser()` might yield `null` or malformed JSON. Calling `SignInModel.fromJson(user)` without a null‑check will crash.  
3. Logging raw user JSON with `logger.e` marks it as an *error* even on success. Use `logger.d` or `logger.i`.

```diff
-      final user = await _authDataSource.getUser();
-      logger.e(user);
-
-      return Left(SignInModel.fromJson(user).toEntity());
+      final raw = await _authDataSource.getUser();
+      if (raw == null) {
+        return Left(Failure('Empty user payload')); // keeps Left = Failure
+      }
+      logger.i('User payload: $raw');
+      return Right(SignInModel.fromJson(raw).toEntity()); // Right = Success
```



> Committable suggestion skipped: line range outside the PR's diff.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-17T18:10:07Z
author_association: NONE

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-04-17T17:52:14Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Summary by CodeRabbit

- **New Features**
  - Introduced new navigation pages with buttons for switching between them.
  - Added a bottom navigation bar for easy access to Home, Add, and Profile sections.
  - Profile screen now displays dynamic user information.

- **Improvements**
  - Enhanced routing structure to support nested navigation and smoother page transitions.
  - Updated authentication flow to use a unified user entity for sign-in and sign-up processes.
  - Profile route now accepts and displays user data passed during navigation.

- **Bug Fixes**
  - Fixed user data mapping and display issues in authentication and profile screens.

- **Refactor**
  - Standardized user data handling across authentication and profile features.
  - Streamlined navigation and routing logic for better maintainability.
## Summary by CodeRabbit

- **New Features**
  - Introduced navigation pages with buttons to switch between them.
  - Added a bottom navigation bar for seamless navigation across Home, Add, and Profile sections.

- **Enhancements**
  - Updated profile screen to display dynamic user information.
  - Improved routing structure to support nested navigation and user data transfer between screens.

- **Authentication Updates**
  - Refined user data handling by replacing previous user model with a new, more detailed user entity.
  - Enhanced sign-in and sign-up processes to return and utilize detailed user information.
  - Added a new model for handling sign-in data from JSON.

- **Bug Fixes**
  - Fixed navigation and user data flow issues in authentication and profile screens.

## Walkthrough

This update introduces a new bottom navigation system using a `ScaffoldWithNestedNavigation` widget and restructures routing to support nested navigation with multiple branches. Two dummy pages and their routes are added for navigation demonstration. The authentication domain is refactored to use a new `UserEntity` model instead of `UserInfo`, affecting data sources, repositories, use cases, cubits, and presentation layers. The profile screen now displays dynamic user data. Additional improvements include enhanced route observer logic and adjustments to model and repository signatures to return user entity data on sign-in.

## Changes

| Files/Groups                                                                 | Change Summary                                                                                                     |
|------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|
| `.../dummy_pages/dummy_page_1.dart`, `.../dummy_page_2.dart`                 | Added two dummy stateless widgets with navigation buttons for demo purposes.                                       |
| `.../nav_bar.dart`                                                           | Introduced `ScaffoldWithNestedNavigation` widget for bottom navigation and nested navigation logic.                |
| `.../router_config.dart`                                                     | Refactored routing to use `StatefulShellRoute.indexedStack` for multi-branch navigation; added observer and redirect logic. |
| `.../routes.dart`                                                            | Added new route constants for dummy pages.                                                                         |
| `.../data/data_source/remote/auth_data_source.dart`,<br>`.../auth_data_source_impl.dart` | Changed method signatures to use `UserEntity` instead of `UserInfo`; implemented `getUser` method.                |
| `.../data/model/sign_in_model.dart`                                          | Added `SignInModel` class for sign-in data conversion between JSON and entity.                                     |
| `.../data/repository/auth_reposity_impl.dart`                                | Updated repository to use `UserEntity`, fetch user data post sign-in, and adjust return types accordingly.         |
| `.../domain/entity/user_entity.dart`                                         | Renamed `UserInfo` to `UserEntity`, updated constructor and JSON mapping logic.                                    |
| `.../domain/repository/auth_repository.dart`                                 | Updated repository interface to use `UserEntity` and changed method signatures and return types.                   |
| `.../domain/use_case/auth_use_case.dart`                                     | Updated use cases to use `UserEntity` as input and output types.                                                   |
| `.../presentation/cubits/auth/sign_in/sign_in_cubit.dart`,<br>`.../sign_up/sign_up_cubit.dart` | Updated cubit methods to use `UserEntity` instead of `UserInfo`.                                                  |
| `.../presentation/cubits/auth/sign_in/sign_in_state.dart`                    | Modified `SignInSuccess` state to hold `UserEntity` instead of `Success`.                                          |
| `.../presentation/screens/sign_up_screen.dart`,<br>`.../signin_screen.dart`  | Updated screen logic to use `UserEntity` for user data and navigation.                                             |
| `.../profile/presentation/screens/profile_screen.dart`                       | Updated `ProfileScreen` to accept and display dynamic `UserEntity` data.                                           |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant DummyPage1
    participant DummyPage2
    participant Router
    participant ProfileScreen

    User->>DummyPage1: Tap "Go to Dummy Page 2"
    DummyPage1->>Router: context.go(MyRoutes.dummyPage2)
    Router->>DummyPage2: Navigate to DummyPage2

    User->>DummyPage2: Tap "Go to Dummy Page 1"
    DummyPage2->>Router: context.go(MyRoutes.dummyPage1)
    Router->>DummyPage1: Navigate to DummyPage1

    User->>BottomNavigationBar: Tap Profile
    Router->>ProfileScreen: Navigate with UserEntity (if available)
```

```mermaid
sequenceDiagram
    participant User
    participant SignInScreen
    participant SignInCubit
    participant AuthUseCase
    participant AuthRepository
    participant AuthDataSource
    participant ProfileScreen

    User->>SignInScreen: Enter credentials and tap Sign In
    SignInScreen->>SignInCubit: signIn(UserEntity)
    SignInCubit->>AuthUseCase: call(UserEntity)
    AuthUseCase->>AuthRepository: signIn(UserEntity)
    AuthRepository->>AuthDataSource: signIn(UserEntity)
    AuthDataSource-->>AuthRepository: Sign-in success
    AuthRepository->>AuthDataSource: getUser()
    AuthDataSource-->>AuthRepository: User data (Map)
    AuthRepository-->>AuthUseCase: UserEntity
    AuthUseCase-->>SignInCubit: UserEntity
    SignInCubit-->>SignInScreen: SignInSuccess(UserEntity)
    SignInScreen->>ProfileScreen: Navigate with UserEntity
```

## Possibly related issues

- [white-cicada#22](https://github.com/Learnathon-By-Geeky-Solutions/white-cicada/issues/22): This PR introduces the `ScaffoldWithNestedNavigation` widget and bottom navigation logic, directly addressing the issue's requirements for a bottom navigation bar feature.

## Poem

> 🤖  
> Beep boop! The routes align,  
> With nested navs and bottom shine.  
> UserEntity takes the stage,  
> Profile now shows name and age!  
> Dummy pages, tap and go—  
> Geeky Bot says: "Bravo, flow!"  
> Beep beep, update complete!

</details>

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Learnathon-By-Geeky-Solutions/nstu-codebreakers&utm_content=15):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: Warhammer4000
created_at: 2025-04-17T17:52:20Z
body: ![](https://res.cloudinary.com/snyk/image/upload/r-d/scm-platform/snyk-pull-requests/pr-banner-default.svg)

### :tada: **Snyk checks have passed. No issues have been found so far.**

:white_check_mark: **security/snyk** check is complete. No issues have been found. [(View Details)](https://app.snyk.io/org/warhammer4000/pr-checks/62361ac3-589d-46ce-a33e-c060b012058c?refs=de8a45e2651f268e5813c51a83f472edb51b9360&source=prChecksComment)



author_association: CONTRIBUTOR