diff --git a/lib/screens/home/home_screen.dart b/lib/screens/home/home_screen.dart index ecd5fa0..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,29 +68,42 @@ class _HomeScreenState extends ConsumerState { ); } return Scaffold( - body: 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, - ), + 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, + ), + ), + ) + ], + 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(