Files
Fondex/lib/screen_ui/cab_service_screens/cab_review_screen.dart

303 lines
15 KiB
Dart

import 'package:customer/constant/const_texts.dart';
import 'package:customer/controllers/cab_review_controller.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../constant/constant.dart';
import '../../controllers/theme_controller.dart';
import '../../themes/app_them_data.dart';
import '../../themes/round_button_fill.dart';
import '../../themes/text_field_widget.dart';
import '../../utils/network_image_widget.dart';
class CabReviewScreen extends StatelessWidget {
const CabReviewScreen({super.key});
@override
Widget build(BuildContext context) {
final themeController = Get.find<ThemeController>();
final isDark = themeController.isDark.value;
return GetX<CabReviewController>(
init: CabReviewController(),
builder: (controller) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
elevation: 0,
backgroundColor: AppThemeData.primary300,
leading: GestureDetector(
onTap: () => Get.back(),
child: Icon(
Icons.arrow_back_ios,
color: isDark ? Colors.white : Colors.black,
),
),
title: Text(
controller.ratingModel.value != null
? ConstTexts.updateReview.tr()
: ConstTexts.addReview.tr(),
style: TextStyle(
color: isDark ? Colors.white : Colors.black,
fontSize: 16,
),
),
),
body: Obx(
() =>
controller.isLoading.value
? Constant.loader()
: Padding(
padding: const EdgeInsets.only(top: 20),
child: Stack(
children: [
Padding(
padding: const EdgeInsets.only(
left: 20,
right: 20,
top: 50,
bottom: 20,
),
child: Card(
elevation: 2,
color:
isDark
? AppThemeData.greyDark50
: AppThemeData.grey50,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(top: 65),
child: Column(
children: [
// Driver Name
Padding(
padding: const EdgeInsets.only(
top: 8.0,
),
child: Text(
controller.order.value!.driver
?.fullName() ??
"",
style: TextStyle(
color:
isDark
? Colors.white
: Colors.black87,
fontFamily: AppThemeData.medium,
fontSize: 18,
),
),
),
// Car info
Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Text(
controller
.driverUser
.value
?.carNumber
?.toUpperCase() ??
'',
style: TextStyle(
color:
isDark
? Colors.white
: Colors.black87,
fontFamily: AppThemeData.medium,
),
),
const SizedBox(width: 8),
Text(
"${controller.driverUser.value?.carName} ${controller.driverUser.value?.carMakes}",
style: TextStyle(
color:
isDark
? Colors.white
: Colors.black38,
fontFamily: AppThemeData.medium,
),
),
],
),
const Padding(
padding: EdgeInsets.symmetric(
vertical: 12,
),
child: Divider(color: Colors.grey),
),
// Title
Padding(
padding: const EdgeInsets.only(top: 16),
child: Text(
ConstTexts.howWasTrip.tr(),
style: TextStyle(
fontSize: 18,
color:
isDark
? Colors.white
: Colors.black,
fontWeight: FontWeight.bold,
letterSpacing: 2,
),
),
),
Padding(
padding: const EdgeInsets.only(top: 8),
child: Text(
ConstTexts.yourFeedbackWillHelp.tr(),
textAlign: TextAlign.center,
style: TextStyle(
color:
isDark
? Colors.white
: Colors.black.withOpacity(
0.60,
),
letterSpacing: 0.8,
),
),
),
// Rating
Padding(
padding: const EdgeInsets.only(top: 20),
child: Text(
ConstTexts.rateFor.tr(),
style: TextStyle(
fontSize: 16,
color:
isDark
? Colors.white
: Colors.black.withValues(
alpha: 0.60,
),
letterSpacing: 0.8,
),
),
),
Padding(
padding: const EdgeInsets.only(top: 8),
child: Text(
controller.order.value!.driver
?.fullName() ??
"",
style: TextStyle(
fontSize: 18,
color:
isDark
? Colors.white
: Colors.black,
fontWeight: FontWeight.bold,
letterSpacing: 2,
),
),
),
Padding(
padding: const EdgeInsets.only(top: 10),
child: RatingBar.builder(
initialRating:
controller.ratings.value,
minRating: 1,
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemBuilder:
(context, _) => const Icon(
Icons.star,
color: Colors.amber,
),
unratedColor:
isDark
? AppThemeData.greyDark400
: AppThemeData.grey400,
onRatingUpdate:
(rating) =>
controller.ratings.value =
rating,
),
),
// Comment
Padding(
padding: const EdgeInsets.all(20.0),
child: TextFieldWidget(
hintText: ConstTexts.typeComment.tr(),
controller: controller.comment.value,
maxLine: 5,
),
),
// Submit Button
Padding(
padding: const EdgeInsets.all(20.0),
child: RoundedButtonFill(
borderRadius: 10.r,
title:
controller.ratingModel.value !=
null
? ConstTexts.updateReview.tr()
: ConstTexts.addReview.tr(),
color: AppThemeData.primary300,
textColor:
isDark
? Colors.white
: Colors.black,
onPress: controller.submitReview,
),
),
],
),
),
),
),
),
Align(
alignment: Alignment.topCenter,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(60),
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.grey.withValues(alpha: 0.15),
blurRadius: 8,
spreadRadius: 6,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(60),
child: NetworkImageWidget(
imageUrl:
controller
.order
.value
?.driver
?.profilePictureURL ??
'',
fit: BoxFit.cover,
height: 110,
width: 110,
),
),
),
),
],
),
),
),
);
},
);
}
}