From 6c2ea174e26444a430eeff38bd95c6250baa4f4e Mon Sep 17 00:00:00 2001 From: nkhanh44 Date: Thu, 24 Aug 2023 11:37:05 +0700 Subject: [PATCH] [#31] Refactor --- lib/screens/home/home_screen.dart | 65 +++++++++++---------- lib/screens/home/home_view_model.dart | 6 +- test/screens/home/home_view_model_test.dart | 15 ++++- 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/lib/screens/home/home_screen.dart b/lib/screens/home/home_screen.dart index 0d6fe68..88ffa5f 100644 --- a/lib/screens/home/home_screen.dart +++ b/lib/screens/home/home_screen.dart @@ -34,7 +34,7 @@ class _HomeScreenState extends ConsumerState { } Future _initData() async { - ref.read(homeViewModelProvider.notifier).loadSurveys(); + ref.read(homeViewModelProvider.notifier).loadSurveys(isRefreshing: false); } @override @@ -68,39 +68,42 @@ class _HomeScreenState extends ConsumerState { ); } return Scaffold( + backgroundColor: Colors.black, body: RefreshIndicator( - color: Colors.white, - backgroundColor: Colors.black, - onRefresh:() => ref.read(homeViewModelProvider.notifier).loadSurveys(isRefreshing: true), - child: SingleChildScrollView( - physics: const AlwaysScrollableScrollPhysics(), - child: SizedBox( - height: MediaQuery.of(context).size.height, - child: Stack( - children: [ - if (surveys.isNotEmpty) ...[ - HomePagesWidget( - surveys: surveys, - currentPage: _currentPage, - ), - const HomeHeaderWidget(), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.only(bottom: 220), - child: HomePageIndicatorWidget( - surveysLength: surveys.length, - currentPage: _currentPage, + color: Colors.white, + backgroundColor: Colors.black, + onRefresh: () => ref + .read(homeViewModelProvider.notifier) + .loadSurveys(isRefreshing: true), + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: SizedBox( + height: MediaQuery.of(context).size.height, + child: Stack( + children: [ + if (surveys.isNotEmpty) ...[ + HomePagesWidget( + surveys: surveys, + currentPage: _currentPage, + ), + const HomeHeaderWidget(), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 220), + child: HomePageIndicatorWidget( + surveysLength: surveys.length, + currentPage: _currentPage, ), - ), - ) - ], - if (surveys.isEmpty || isLoading) _buildShimmerLoading(), - ], + ), + ) + ], + if (surveys.isEmpty || isLoading) _buildShimmerLoading(), + ], + ), + ), ), - ), - ), - )); + )); } Widget _buildShimmerLoading() { diff --git a/lib/screens/home/home_view_model.dart b/lib/screens/home/home_view_model.dart index 83b0408..6c9faac 100644 --- a/lib/screens/home/home_view_model.dart +++ b/lib/screens/home/home_view_model.dart @@ -39,8 +39,10 @@ class HomeViewModel extends StateNotifier { final _error = StreamController(); Stream get error => _error.stream; - void loadSurveys() async { - _loadSurveysFromCache(); + Future loadSurveys({required bool isRefreshing}) async { + if (!isRefreshing) { + _loadSurveysFromCache(); + } _loadSurveysFromRemote(); } diff --git a/test/screens/home/home_view_model_test.dart b/test/screens/home/home_view_model_test.dart index c783b05..c486072 100644 --- a/test/screens/home/home_view_model_test.dart +++ b/test/screens/home/home_view_model_test.dart @@ -50,7 +50,7 @@ void main() { .thenAnswer((_) => Future.value(Success(surveys))); final surveysStream = homeViewModel.surveys; final stateStream = homeViewModel.stream; - homeViewModel.loadSurveys(); + homeViewModel.loadSurveys(isRefreshing: false); expect(surveysStream, emitsInOrder([surveys])); expect( stateStream, @@ -61,6 +61,17 @@ void main() { }, ); + test( + 'When refreshing surveys successfully and emits a list of surveys with state LoadSurveysSuccess', + () { + when(mockGetSurveysUseCase.call(any)).thenAnswer( + (_) async => Success(surveys), + ); + final surveysStream = homeViewModel.surveys; + homeViewModel.loadSurveys(isRefreshing: true); + expect(surveysStream, emitsInOrder([surveys])); + }); + test( 'loads surveys with error and emits error state', () async { @@ -71,7 +82,7 @@ void main() { (_) async => Failed(exception), ); final errorStream = homeViewModel.error; - homeViewModel.loadSurveys(); + homeViewModel.loadSurveys(isRefreshing: false); expect( errorStream, emitsInOrder(