import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/widgets/bottom_sheet_with_blur.dart'; import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/core/widgets/loader.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_state.dart'; import 'package:eatvio_app/features/chat/presentation/pages/payment_screen.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/chose_plan_date_widget.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/complete_plan_bottom_sheet.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/plan_complain_bottom_sheet.dart'; import 'package:eatvio_app/features/my_finance/presentation/pages/card_settings.dart'; import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; class NotificationBanner extends StatefulWidget { const NotificationBanner({super.key, required this.bannerType, this.planPrice, this.planName, this.chosenPlanId}); final BannerType bannerType; final double? planPrice; final String? planName; final int? chosenPlanId; @override State createState() => _NotificationBannerState(); } class _NotificationBannerState extends State { bool isLoading = false; @override Widget build(BuildContext context) { final size = MediaQuery.sizeOf(context); final s = S.of(context); return Container( decoration: BoxDecoration( color: appTheme.gray50, borderRadius: BorderRadius.circular(20), ), child: Column( children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.bannerType != BannerType.collectCharge && widget.bannerType != BannerType.finishPlan) Padding( padding: const EdgeInsets.only(top: 12, right: 8, left: 12), child: SvgPicture.asset('assets/icons/reversed_exclamation_mark.svg', height: 68, width: 68), ) else const Padding( padding: EdgeInsets.only(top: 12, right: 8, left: 12), child: _StarIcon(), ), if (isLoading) const Padding( padding: EdgeInsets.only(left: 40, top: 24), child: Loader(), ) else Padding( padding: const EdgeInsets.only(top: 16), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: switch (widget.bannerType) { BannerType.date => [ SizedBox( width: size.width * 0.6, child: Text(s.choose_plan_start_date, style: TextStyles.textMMedium.copyWith(color: appTheme.black)), ), const SizedBox(height: 12), GestureDetector( onTap: () { final cubit = context.read(); showModalBottomSheet( context: context, builder: (context) => ChosePlanDateWidget( chatCubit: cubit, ), ); }, child: Text(s.choose_date, style: TextStyles.textLSemibold.copyWith(color: appTheme.blueA400)), ), const SizedBox(height: 16), ], BannerType.card => [ SizedBox( width: size.width * 0.6, child: Text(s.can_not_choose_start_date, style: TextStyles.textMMedium.copyWith(color: appTheme.black)), ), const SizedBox(height: 12), GestureDetector( onTap: () { GoRouter.of(context).pushReplacement( CardSettingsScreen.path, ); }, child: Text(s.add_card, style: TextStyles.textLSemibold.copyWith(color: appTheme.blueA400)), ), const SizedBox(height: 16), ], BannerType.payment => [ SizedBox( width: size.width * 0.6, child: Text(s.tap_on_link_to_pay, style: TextStyles.textMMedium.copyWith(color: appTheme.black)), ), const SizedBox(height: 12), GestureDetector( onTap: () async { final planId = (context.read().state as ChatRoomStateLoaded).chatRoom.chosenPlan?.id; setState(() { isLoading = true; }); final paymentLink = await context.read().getPaymentLink(); setState(() { isLoading = false; }); if (paymentLink != null && planId != null) { if (!context.mounted) return; GoRouter.of(context).pushReplacement( PaymentScreen.path, extra: {'url': paymentLink, 'planId': planId}, ); } }, child: Text(s.pay, style: TextStyles.textLSemibold.copyWith(color: appTheme.blueA400)), ), const SizedBox(height: 16), ], BannerType.collectCharge => [ SizedBox( width: size.width * 0.6, child: Text('${s.congratsYouHaveFinishedPlan} «${widget.planName}»', style: TextStyles.textMSemibold.copyWith(color: appTheme.black)), ), const SizedBox(height: 8), SizedBox( width: size.width * 0.6, child: Text('${s.userConfirmedPlanCompletion} ${widget.planPrice}₽', style: TextStyles.textSMedium.copyWith(color: appTheme.black)), ), const SizedBox(height: 8), ], BannerType.finishPlan => [ SizedBox( width: size.width * 0.6, child: Text('${s.congratsYouHaveFinishedPlan} «${widget.planName}». ${s.pleaseConfirmPlan}', style: TextStyles.textMMediumAuto.copyWith(color: appTheme.black)), ), const SizedBox(height: 8), SizedBox( width: size.width * 0.7, child: Text(s.planWillBeConfirmedAfterThreeDays, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), ), const SizedBox(height: 8), ], }, ), ), ], ), if (widget.bannerType == BannerType.collectCharge) Padding( padding: const EdgeInsets.symmetric(horizontal: 12), child: CustomOutlinedButton( text: s.collectCharge, height: 52, buttonTextStyle: TextStyles.textMSemibold.copyWith(color: appTheme.whiteA700), buttonStyle: ButtonStyle(side: const WidgetStatePropertyAll(BorderSide.none), backgroundColor: WidgetStatePropertyAll(appTheme.green)), onPressed: () async { GoRouter.of(context).push(CardSettingsScreen.path, extra: widget.chosenPlanId); }, ), ), if (widget.bannerType == BannerType.finishPlan) ...[ Padding( padding: const EdgeInsets.symmetric(horizontal: 12), child: CustomOutlinedButton( text: s.confirm, height: 52, buttonTextStyle: TextStyles.textMSemibold.copyWith(color: appTheme.whiteA700), buttonStyle: ButtonStyle(side: const WidgetStatePropertyAll(BorderSide.none), backgroundColor: WidgetStatePropertyAll(appTheme.blueA400)), onPressed: () async { final cubit = context.read(); showBottomSheetWithBlur( userRootNavigator: true, context: context, height: null, child: CompletePlanBottomSheet( cubit: cubit, ), ); }, ), ), const SizedBox(height: 12), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: SizedBox( child: Text(s.youCanComplain, style: TextStyles.textSMedium.copyWith(color: appTheme.black)), ), ), const SizedBox(height: 8), Align( alignment: Alignment.centerLeft, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: GestureDetector( onTap: () { final cubit = context.read(); showBottomSheetWithBlur( userRootNavigator: true, context: context, height: null, child: PlanComplainBottomSheet( cubit: cubit, ), ); }, child: Text(s.leaveComplainRequest, style: TextStyles.textSMedium.copyWith(color: appTheme.red))), ), ), const SizedBox(height: 8), ] ], ), ); } } class _StarIcon extends StatelessWidget { const _StarIcon(); @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration(color: appTheme.whiteA700, shape: BoxShape.circle), child: SvgPicture.asset('assets/icons/star.svg'), ); } } enum BannerType { date, card, payment, collectCharge, finishPlan }