import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../core/design/tokens.dart'; import '../../../core/design/tripz_colors.dart'; import '../../../core/di.dart'; import '../../../core/l10n/l10n.dart'; import '../../../core/ui/tripz_button.dart'; import '../../../core/ui/tripz_scaffold.dart'; import '../../../core/ui/tripz_text_field.dart'; import '../cubit/rating_cubit.dart'; import '../cubit/rating_state.dart'; import '../data/rating_repository.dart'; import 'star_row.dart'; /// شاشة التقييم — **تُفرض عند فتح التطبيق** إن كانت هناك رحلة معلّقة /// (`GET /trips/rating/pending`، docs/38 §7). لذلك بلا زرّ رجوع في الشريط: /// الطريق الوحيد للخروج هو التقييم أو التخطّي الصريح. class RatingPage extends StatefulWidget { const RatingPage({super.key, required this.pending, required this.onDone}); final PendingRating pending; final VoidCallback onDone; @override State createState() => _RatingPageState(); } class _RatingPageState extends State { late final RatingCubit _cubit = sl()..attach(widget.pending); final _comment = TextEditingController(); @override void dispose() { _comment.dispose(); _cubit.close(); super.dispose(); } @override Widget build(BuildContext context) { final l10n = context.l10n; // من يقيّم مَن: دور **هذا** المستخدم في الرحلة يأتي من الخادم، ولا // يُستنتج من نوع التطبيق — الرقم نفسه قد يكون له حسابان (docs/38 §1). final title = widget.pending.isDriver ? l10n.rateTitleDriver : l10n.rateTitle; return BlocProvider.value( value: _cubit, child: BlocConsumer( listenWhen: (p, n) => p.status != n.status, listener: (context, state) { if (state.status == RatingStatus.done || state.status == RatingStatus.alreadyRated) { widget.onDone(); } }, builder: (context, state) { return TripzScaffold( showAppBar: false, bottomAction: Column( mainAxisSize: MainAxisSize.min, children: [ TripzButton.primary( label: l10n.rateSubmit, loading: state.status == RatingStatus.submitting, onPressed: state.canSubmit ? _cubit.submit : null, ), TripzButton.text( label: l10n.rateSkip, onPressed: widget.onDone, ), ], ), child: ListView( children: [ const SizedBox(height: Space.xxl), Icon( Icons.star_rounded, size: 56, color: context.tripzColors.warning, ), const SizedBox(height: Space.md), Text( title, textAlign: TextAlign.center, style: context.texts.headlineSmall, ), const SizedBox(height: Space.xs), Text( l10n.rateLead, textAlign: TextAlign.center, style: context.texts.bodyMedium?.copyWith( color: context.colors.onSurfaceVariant, ), ), const SizedBox(height: Space.lg), StarRow(value: state.stars, onChanged: _cubit.setStars), const SizedBox(height: Space.lg), TripzTextField( controller: _comment, hint: l10n.rateComment, onChanged: _cubit.setComment, ), if (state.status == RatingStatus.failed) ...[ const SizedBox(height: Space.sm), Text( l10n.errorGeneric, textAlign: TextAlign.center, style: context.texts.bodySmall?.copyWith( color: context.tripzColors.danger, ), ), ], // مساحة للـCTA السفلي كي لا يغطّي الحقل عند فتح الكيبورد. const SizedBox(height: Sizes.control), ], ), ); }, ), ); } }