import 'package:easy_debounce/easy_debounce.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_svg/flutter_svg.dart'; class SatietyRatingWidget extends StatefulWidget { @override State createState() => _SatietyRatingWidgetState(); } class _SatietyRatingWidgetState extends State { late double currentSelectedRating; bool isFirstFetch = true; @override Widget build(BuildContext context) { return BlocBuilder( builder: (BuildContext context, DiaryState state) { if (state is DiaryStateLoaded) { if (isFirstFetch) { currentSelectedRating = state.diary.meals[state.selectedMeal - 1].satiety.toDouble(); isFirstFetch = false; } return Padding( padding: const EdgeInsets.only(top: 24), child: Column( mainAxisSize: MainAxisSize.min, children: [ Text( 'Ваша сытость после приёма пищи', style: TextStyle( fontSize: 16, ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SvgPicture.asset( 'assets/icons/satiety_emoji_left.svg', height: 32, width: 32, ), RatingBar.builder( initialRating: state.diary.meals[state.selectedMeal - 1].satiety.toDouble(), itemCount: 6, itemSize: MediaQuery.of(context).size.width / 6 - (124 / 6), updateOnDrag: true, itemBuilder: (context, index) { switch (index) { case 0: return Container( width: MediaQuery.of(context).size.width / 6, height: 24, margin: currentSelectedRating == 1 ? EdgeInsets.symmetric(horizontal: 2) : null, decoration: BoxDecoration( color: Color(0xFFC82222), border: currentSelectedRating == 1 ? Border.all( width: 2, color: Color(0xFFAA3333), strokeAlign: BorderSide.strokeAlignOutside, ) : null, borderRadius: currentSelectedRating == 1 ? BorderRadius.horizontal( left: Radius.circular(8), right: Radius.circular(2), ) : BorderRadius.horizontal( left: Radius.circular(8), ), ), ); case 1: return Container( width: MediaQuery.of(context).size.width / 6, height: 24, margin: currentSelectedRating == 2 ? EdgeInsets.symmetric(horizontal: 2) : null, decoration: BoxDecoration( color: Color(0xFFFF3E3E), border: currentSelectedRating == 2 ? Border.all( width: 2, color: Color(0xFF550000), strokeAlign: BorderSide.strokeAlignOutside, ) : null, borderRadius: currentSelectedRating == 2 ? BorderRadius.circular(2) : null, ), ); case 2: return Container( width: MediaQuery.of(context).size.width / 6, height: 24, margin: currentSelectedRating == 3 ? EdgeInsets.symmetric(horizontal: 2) : null, decoration: BoxDecoration( color: Color(0xFFF8C926), border: currentSelectedRating == 3 ? Border.all( width: 2, color: Color(0xFF8C5D00), strokeAlign: BorderSide.strokeAlignOutside, ) : null, borderRadius: currentSelectedRating == 3 ? BorderRadius.circular(2) : null, ), ); case 3: return Container( width: MediaQuery.of(context).size.width / 6, height: 24, margin: currentSelectedRating == 4 ? EdgeInsets.symmetric(horizontal: 2) : null, decoration: BoxDecoration( color: Color(0xFFFFF3BF), border: currentSelectedRating == 4 ? Border.all( width: 2, color: Color(0xFFB5911B), strokeAlign: BorderSide.strokeAlignOutside, ) : null, borderRadius: currentSelectedRating == 4 ? BorderRadius.circular(2) : null, ), ); case 4: return Container( width: MediaQuery.of(context).size.width / 6, height: 24, margin: currentSelectedRating == 5 ? EdgeInsets.symmetric(horizontal: 2) : null, decoration: BoxDecoration( color: Color(0xFF62E833), border: currentSelectedRating == 5 ? Border.all( width: 2, color: Color(0xFF276918), strokeAlign: BorderSide.strokeAlignOutside, ) : null, borderRadius: currentSelectedRating == 5 ? BorderRadius.circular(2) : null, ), ); default: return Container( width: MediaQuery.of(context).size.width / 6, height: 24, margin: currentSelectedRating == 6 ? EdgeInsets.symmetric(horizontal: 2) : null, decoration: BoxDecoration( color: Color(0xFF4DCE20), border: currentSelectedRating == 6 ? Border.all( width: 2, color: Color(0xFF184D12), strokeAlign: BorderSide.strokeAlignOutside, ) : null, borderRadius: currentSelectedRating == 6 ? BorderRadius.horizontal( left: Radius.circular(2), right: Radius.circular(8), ) : BorderRadius.horizontal( right: Radius.circular(8), ), ), ); } }, onRatingUpdate: (value) { setState(() { currentSelectedRating = value; }); EasyDebounce.debounce( 'change-satiety', Duration(milliseconds: 250), () { context.read().fillSatiety(diaryId: state.diary.id, satiety: currentSelectedRating.toInt()); }, ); }, ), SvgPicture.asset( 'assets/icons/satiety_emoji_right.svg', height: 32, width: 32, ), ], ), ], ), ); } return const SizedBox.shrink(); }, ); } }