import 'package:eatvio_app/core/utils/pagination_utils.dart'; import 'package:eatvio_app/core/widgets/data_error_widget.dart'; import 'package:eatvio_app/core/widgets/loader.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/diets_cubit/diets_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/diets_cubit/diets_state.dart'; import 'package:eatvio_app/features/feed/presentation/pages/feed_screen.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/diet_filter_bottom_sheet.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/diets_widget.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/filter_badge.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:visibility_detector/visibility_detector.dart'; class Diets extends StatelessWidget { const Diets({super.key, required this.handleVisibility}); final Function({required double visibleFraction, required int id, required ViewableContentType type}) handleVisibility; @override Widget build(BuildContext context) { return RefreshIndicator( onRefresh: () => context.read().loadDiets(), child: BlocBuilder( builder: (BuildContext context, DietsState state) { if (state.isLoading) { return Scaffold(backgroundColor: Colors.grey.shade200, body: const Loader()); } else if (state.errorMessage != null) { return DataErrorWidget(onReload: () => context.read().loadDiets()); } else { return Stack( children: [ const SizedBox.expand(), NotificationListener( onNotification: (notification) { loadNewContent(notification, context.read().loadNextPage); return false; }, child: ListView.separated( padding: const EdgeInsets.symmetric(vertical: 8), shrinkWrap: true, physics: const BouncingScrollPhysics(), itemBuilder: (context, index) { return VisibilityDetector( key: ValueKey(index), onVisibilityChanged: (info) { final id = state.dietsList[index].id; handleVisibility(visibleFraction: info.visibleFraction, id: id, type: ViewableContentType.diets); }, child: DietsWidget(diet: state.dietsList[index], index: index), ); }, separatorBuilder: (context, index) { return const SizedBox(height: 8); }, itemCount: state.dietsList.length, ), ), Positioned( right: 0, bottom: 74, child: FilterBadge(filterBottomSheet: DietFilterBottomSheet(dietsCubit: context.read())), ), ], ); } }, ), ); } }