Enhance HomeScreen with Logout functionality

- Added LogoutViewModel to HomeScreen for managing user logout.
- Updated HomeHeader to utilize the new LogoutViewModel.
- Refactored HomeScreen tests to include LogoutViewModel initialization.
pull/2819/head
mozammal-hossain 2 weeks ago
parent dcaf555586
commit 5840ed876a

@ -11,6 +11,7 @@ import '../ui/activities/view_models/activities_viewmodel.dart';
import '../ui/activities/widgets/activities_screen.dart';
import '../ui/auth/login/view_models/login_viewmodel.dart';
import '../ui/auth/login/widgets/login_screen.dart';
import '../ui/auth/logout/view_models/logout_viewmodel.dart';
import '../ui/booking/view_models/booking_viewmodel.dart';
import '../ui/booking/widgets/booking_screen.dart';
import '../ui/home/view_models/home_viewmodel.dart';
@ -46,7 +47,14 @@ GoRouter router(AuthRepository authRepository) => GoRouter(
bookingRepository: context.read(),
userRepository: context.read(),
);
return HomeScreen(viewModel: viewModel);
final logoutViewModel = LogoutViewModel(
authRepository: context.read(),
itineraryConfigRepository: context.read(),
);
return HomeScreen(
viewModel: viewModel,
logoutViewModel: logoutViewModel,
);
},
routes: [
GoRoute(

@ -11,6 +11,7 @@ import '../../core/localization/applocalization.dart';
import '../../core/themes/colors.dart';
import '../../core/themes/dimens.dart';
import '../../core/ui/date_format_start_end.dart';
import '../../auth/logout/view_models/logout_viewmodel.dart';
import '../../core/ui/error_indicator.dart';
import '../view_models/home_viewmodel.dart';
import 'home_title.dart';
@ -18,9 +19,14 @@ import 'home_title.dart';
const String bookingButtonKey = 'booking-button';
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key, required this.viewModel});
const HomeScreen({
super.key,
required this.viewModel,
required this.logoutViewModel,
});
final HomeViewModel viewModel;
final LogoutViewModel logoutViewModel;
@override
State<HomeScreen> createState() => _HomeScreenState();
@ -88,7 +94,10 @@ class _HomeScreenState extends State<HomeScreen> {
vertical: Dimens.of(context).paddingScreenVertical,
horizontal: Dimens.of(context).paddingScreenHorizontal,
),
child: HomeHeader(viewModel: widget.viewModel),
child: HomeHeader(
viewModel: widget.viewModel,
logoutViewModel: widget.logoutViewModel,
),
),
),
SliverList.builder(

@ -4,7 +4,6 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
import '../../auth/logout/view_models/logout_viewmodel.dart';
import '../../auth/logout/widgets/logout_button.dart';
@ -13,9 +12,14 @@ import '../../core/themes/dimens.dart';
import '../view_models/home_viewmodel.dart';
class HomeHeader extends StatelessWidget {
const HomeHeader({super.key, required this.viewModel});
const HomeHeader({
super.key,
required this.viewModel,
required this.logoutViewModel,
});
final HomeViewModel viewModel;
final LogoutViewModel logoutViewModel;
@override
Widget build(BuildContext context) {
@ -37,12 +41,7 @@ class HomeHeader extends StatelessWidget {
height: Dimens.of(context).profilePictureSize,
),
),
LogoutButton(
viewModel: LogoutViewModel(
authRepository: context.read(),
itineraryConfigRepository: context.read(),
),
),
LogoutButton(viewModel: logoutViewModel),
],
),
const SizedBox(height: Dimens.paddingVertical),

@ -2,16 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:compass_app/data/repositories/auth/auth_repository.dart';
import 'package:compass_app/data/repositories/itinerary_config/itinerary_config_repository.dart';
import 'package:compass_app/routing/routes.dart';
import 'package:compass_app/ui/auth/logout/view_models/logout_viewmodel.dart';
import 'package:compass_app/ui/home/view_models/home_viewmodel.dart';
import 'package:compass_app/ui/home/widgets/home_screen.dart';
import 'package:compass_app/utils/result.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:provider/provider.dart';
import '../../../../testing/app.dart';
import '../../../../testing/fakes/repositories/fake_auth_repository.dart';
@ -24,6 +21,7 @@ import '../../../../testing/models/booking.dart';
void main() {
group('HomeScreen tests', () {
late HomeViewModel viewModel;
late LogoutViewModel logoutViewModel;
late MockGoRouter goRouter;
late FakeBookingRepository bookingRepository;
@ -33,6 +31,10 @@ void main() {
bookingRepository: bookingRepository,
userRepository: FakeUserRepository(),
);
logoutViewModel = LogoutViewModel(
authRepository: FakeAuthRepository(),
itineraryConfigRepository: FakeItineraryConfigRepository(),
);
goRouter = MockGoRouter();
when(() => goRouter.push(any())).thenAnswer((_) => Future.value(null));
});
@ -40,12 +42,9 @@ void main() {
Future<void> loadWidget(WidgetTester tester) async {
await testApp(
tester,
ChangeNotifierProvider.value(
value: FakeAuthRepository() as AuthRepository,
child: Provider.value(
value: FakeItineraryConfigRepository() as ItineraryConfigRepository,
child: HomeScreen(viewModel: viewModel),
),
HomeScreen(
viewModel: viewModel,
logoutViewModel: logoutViewModel,
),
goRouter: goRouter,
);

Loading…
Cancel
Save