From d098978c659d9fea095f8559611039ae5133ee34 Mon Sep 17 00:00:00 2001 From: Aayushmaan Date: Tue, 27 Feb 2024 22:37:21 +0530 Subject: [PATCH] feat: adds No Internet Connectivity screen --- devtools_options.yaml | 1 + lib/data/constants/env_config.dart | 2 +- lib/data/core/router/registry/paths.dart | 3 ++ lib/data/core/router/registry/routes.dart | 10 ++++++ lib/presentation/app/app.dart | 2 ++ lib/presentation/app/bloc/app_bloc.dart | 14 ++++++-- lib/presentation/app/bloc/app_event.dart | 4 +++ lib/presentation/app/bloc/app_state.dart | 1 + .../no_internet/bloc/no_internet_bloc.dart | 22 +++++++++++++ .../no_internet/bloc/no_internet_event.dart | 12 +++++++ .../no_internet/bloc/no_internet_state.dart | 9 ++++++ .../components/no_internet_banner.dart | 31 ++++++++++++++++++ lib/presentation/no_internet/no_internet.dart | 32 +++++++++++++++++++ 13 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 devtools_options.yaml create mode 100644 lib/presentation/no_internet/bloc/no_internet_bloc.dart create mode 100644 lib/presentation/no_internet/bloc/no_internet_event.dart create mode 100644 lib/presentation/no_internet/bloc/no_internet_state.dart create mode 100644 lib/presentation/no_internet/components/no_internet_banner.dart create mode 100644 lib/presentation/no_internet/no_internet.dart diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 00000000..7e7e7f67 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1 @@ +extensions: diff --git a/lib/data/constants/env_config.dart b/lib/data/constants/env_config.dart index cb33130f..56775c89 100644 --- a/lib/data/constants/env_config.dart +++ b/lib/data/constants/env_config.dart @@ -1,7 +1,7 @@ class EnvironmentConfig { static const String BASE_URL = String.fromEnvironment( 'BASE_URL', - defaultValue: 'https://appetizer.onrender.com', + defaultValue: 'https://faf1-103-37-201-177.ngrok-free.app', ); static const String OAUTH_CLIENT_ID = String.fromEnvironment( diff --git a/lib/data/core/router/registry/paths.dart b/lib/data/core/router/registry/paths.dart index 45ddc3bc..945c7173 100644 --- a/lib/data/core/router/registry/paths.dart +++ b/lib/data/core/router/registry/paths.dart @@ -17,4 +17,7 @@ class AppPathsRegistry { static const String leavesAndRebate = 'leavesAndRebate'; static const String feedback = 'feedback'; static const String resetPassword = 'resetPassword'; + + static const String noInternetWrapper = '/noInternetWrapper'; + static const String noInternetConnection = 'noInternetConnection'; } diff --git a/lib/data/core/router/registry/routes.dart b/lib/data/core/router/registry/routes.dart index d75f7abb..28650b51 100644 --- a/lib/data/core/router/registry/routes.dart +++ b/lib/data/core/router/registry/routes.dart @@ -61,5 +61,15 @@ class AppRoutesRegistry { ), ], ), + CustomRoute( + path: AppPathsRegistry.noInternetWrapper, + page: NoInternetWrapper.page, + children: [ + CustomRoute( + initial: true, + path: AppPathsRegistry.noInternetConnection, + page: NoInternetRoute.page, + ), + ]), ]; } diff --git a/lib/presentation/app/app.dart b/lib/presentation/app/app.dart index 623848b4..6c6e5b46 100644 --- a/lib/presentation/app/app.dart +++ b/lib/presentation/app/app.dart @@ -46,6 +46,8 @@ class _AppetizerAppState extends State { return [const LoginWrapper()]; case NavigateTo.showHomeScreen: return [const HomeWrapper()]; + case NavigateTo.showNoInternetScreen: + return [const NoInternetWrapper()]; default: return []; } diff --git a/lib/presentation/app/bloc/app_bloc.dart b/lib/presentation/app/bloc/app_bloc.dart index 846f04ae..0592861c 100644 --- a/lib/presentation/app/bloc/app_bloc.dart +++ b/lib/presentation/app/bloc/app_bloc.dart @@ -25,6 +25,7 @@ class AppBloc extends Bloc { on(_onGetUser); on(_onNavigateToHome); on(_onNavigateToLogin); + on(_onNavigateToNoInternetScreen); on(_onToggleCheckOutStatus); } @@ -64,8 +65,12 @@ class AppBloc extends Bloc { emit(state.copyWith(user: user)); add(const NavigateToHomeScreen()); } catch (err) { - LocalStorageService.setValue(key: AppConstants.LOGGED_IN, value: false); - add(const NavigateToLoginScreen()); + if (LocalStorageService.getValue(AppConstants.LOGGED_IN) ?? false) { + add(const NavigateToNoInternetScreen()); + } else { + LocalStorageService.setValue(key: AppConstants.LOGGED_IN, value: false); + add(const NavigateToLoginScreen()); + } } } @@ -81,5 +86,10 @@ class AppBloc extends Bloc { emit(state.copyWith(navigateTo: NavigateTo.showLoginScreen)); } + FutureOr _onNavigateToNoInternetScreen( + NavigateToNoInternetScreen event, Emitter emit) { + emit(state.copyWith(navigateTo: NavigateTo.showNoInternetScreen)); + } + String get userName => _user?.name ?? 'A'; } diff --git a/lib/presentation/app/bloc/app_event.dart b/lib/presentation/app/bloc/app_event.dart index ef716800..cd5578b8 100644 --- a/lib/presentation/app/bloc/app_event.dart +++ b/lib/presentation/app/bloc/app_event.dart @@ -23,6 +23,10 @@ class NavigateToLoginScreen extends AppEvent { const NavigateToLoginScreen(); } +class NavigateToNoInternetScreen extends AppEvent { + const NavigateToNoInternetScreen(); +} + class ToggleCheckOutStatusEvent extends AppEvent { const ToggleCheckOutStatusEvent(); } diff --git a/lib/presentation/app/bloc/app_state.dart b/lib/presentation/app/bloc/app_state.dart index 7e6ac28c..6b237202 100644 --- a/lib/presentation/app/bloc/app_state.dart +++ b/lib/presentation/app/bloc/app_state.dart @@ -4,6 +4,7 @@ enum NavigateTo { inital, showLoginScreen, showHomeScreen, + showNoInternetScreen, } class AppState { diff --git a/lib/presentation/no_internet/bloc/no_internet_bloc.dart b/lib/presentation/no_internet/bloc/no_internet_bloc.dart new file mode 100644 index 00000000..03e327e8 --- /dev/null +++ b/lib/presentation/no_internet/bloc/no_internet_bloc.dart @@ -0,0 +1,22 @@ +import 'package:appetizer/domain/models/user/user.dart'; +import 'package:appetizer/domain/repositories/user/user_repository.dart'; +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; + +part 'no_internet_event.dart'; +part 'no_internet_state.dart'; + +class NoInternetBloc extends Bloc { + final UserRepository repo; + NoInternetBloc({required this.repo}) : super(const NoInternetState()) { + on(_onReloadPressed); + } + + void _onReloadPressed( + ReloadPressed event, Emitter emit) async { + try { + User user = await repo.getCurrentUser(); + + } catch (e) {} + } +} diff --git a/lib/presentation/no_internet/bloc/no_internet_event.dart b/lib/presentation/no_internet/bloc/no_internet_event.dart new file mode 100644 index 00000000..b7d8c691 --- /dev/null +++ b/lib/presentation/no_internet/bloc/no_internet_event.dart @@ -0,0 +1,12 @@ +part of 'no_internet_bloc.dart'; + +class NoInternetEvent extends Equatable { + const NoInternetEvent(); + + @override + List get props => []; +} + +class ReloadPressed extends NoInternetEvent { + const ReloadPressed(); +} \ No newline at end of file diff --git a/lib/presentation/no_internet/bloc/no_internet_state.dart b/lib/presentation/no_internet/bloc/no_internet_state.dart new file mode 100644 index 00000000..4c485e71 --- /dev/null +++ b/lib/presentation/no_internet/bloc/no_internet_state.dart @@ -0,0 +1,9 @@ +part of 'no_internet_bloc.dart'; + +class NoInternetState extends Equatable { + const NoInternetState(); + + @override + List get props => []; +} + diff --git a/lib/presentation/no_internet/components/no_internet_banner.dart b/lib/presentation/no_internet/components/no_internet_banner.dart new file mode 100644 index 00000000..c5b9fbb6 --- /dev/null +++ b/lib/presentation/no_internet/components/no_internet_banner.dart @@ -0,0 +1,31 @@ +import 'package:appetizer/data/core/theme/dimensional/dimensional.dart'; +import 'package:appetizer/presentation/components/app_banner.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class NoInternetBanner extends StatelessWidget { + const NoInternetBanner({super.key}); + + @override + Widget build(BuildContext context) { + return AppBanner( + height: 140.toAutoScaledHeight, + child: Row( + children: [ + SizedBox( + width: 12.toAutoScaledWidth, + ), + Text( + 'Appetizer', + style: GoogleFonts.notoSans( + color: Colors.white, + fontSize: 24.toAutoScaledWidth, + fontWeight: FontWeight.w700, + decoration: TextDecoration.none, + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/no_internet/no_internet.dart b/lib/presentation/no_internet/no_internet.dart new file mode 100644 index 00000000..1c503c96 --- /dev/null +++ b/lib/presentation/no_internet/no_internet.dart @@ -0,0 +1,32 @@ +import 'package:appetizer/presentation/components/no_data_found_container.dart'; +import 'package:appetizer/presentation/no_internet/components/no_internet_banner.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +@RoutePage() +class NoInternetWrapper extends StatelessWidget { + const NoInternetWrapper({super.key}); + + @override + Widget build(BuildContext context) { + return const AutoRouter(); + } +} + +@RoutePage() +class NoInternetScreen extends StatelessWidget { + const NoInternetScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + child: const Column( + children: [ + NoInternetBanner(), + NoDataFoundContainer(title: "No Internet Connection"), + ], + ), + ); + } +}