25-7-28-2

This commit is contained in:
Hamza-Ayed
2025-07-28 12:21:28 +03:00
parent 660d60e1f5
commit 83a97baed1
549 changed files with 109870 additions and 0 deletions

View File

@@ -0,0 +1,353 @@
import 'dart:convert';
import 'package:sefer_driver/constant/colors.dart';
import 'package:sefer_driver/constant/style.dart';
import 'package:sefer_driver/controller/notification/ride_available_controller.dart';
import 'package:sefer_driver/views/widgets/my_scafold.dart';
import 'package:sefer_driver/views/widgets/mycircular.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../constant/box_name.dart';
import '../../constant/links.dart';
import '../../controller/firebase/firbase_messge.dart';
import '../../controller/functions/crud.dart';
import '../../controller/home/captin/home_captain_controller.dart';
import '../../main.dart';
import '../home/Captin/driver_map_page.dart';
import '../widgets/mydialoug.dart';
class AvailableRidesPage extends StatelessWidget {
const AvailableRidesPage({super.key});
@override
Widget build(BuildContext context) {
Get.put(RideAvailableController());
return GetBuilder<RideAvailableController>(
builder: (rideAvailableController) {
// rideAvailableController.sortRidesByDistance();
return MyScafolld(
title: 'Available for rides'.tr,
body: [
rideAvailableController.isLoading
? const MyCircularProgressIndicator()
:
// : ListView.builder(
// itemCount: rideAvailableController
// .rideAvailableMap['message']
// .where((rideInfo) {
// var driverType =
// box.read(BoxName.carTypeOfDriver).toString();
// return (driverType == 'Comfort' &&
// ['Speed', 'Comfort']
// .contains(rideInfo['carType'])) ||
// (driverType == 'Speed' &&
// rideInfo['carType'] == 'Speed') ||
// (driverType == 'Scooter' &&
// rideInfo['carType'] == 'Scooter') ||
// (driverType == 'Awfar Car' &&
// rideInfo['carType'] == 'Awfar Car') ||
// (driverType == 'Lady' &&
// ['Comfort', 'Speed', 'Lady']
// .contains(rideInfo['carType']));
// }).length,
// itemBuilder: (context, index) {
// var filteredRides = rideAvailableController
// .rideAvailableMap['message']
// .where((rideInfo) {
// var driverType =
// box.read(BoxName.carTypeOfDriver).toString();
// return (driverType == 'Comfort' &&
// ['Speed', 'Comfort']
// .contains(rideInfo['carType'])) ||
// (driverType == 'Speed' &&
// rideInfo['carType'] == 'Speed') ||
// (driverType == 'Awfar Car' &&
// rideInfo['carType'] == 'Awfar Car') ||
// (driverType == 'Scooter' &&
// rideInfo['carType'] == 'Scooter') ||
// (driverType == 'Lady' &&
// ['Comfort', 'Speed', 'Lady']
// .contains(rideInfo['carType']));
// }).toList();
// return RideAvailableCard(
// rideInfo: filteredRides[index],
// );
// },
// )
ListView.builder(
itemCount: rideAvailableController
.rideAvailableMap['message']
.where((rideInfo) {
var driverType =
box.read(BoxName.carTypeOfDriver).toString();
switch (driverType) {
case 'Comfort':
return ['Speed', 'Comfort']
.contains(rideInfo['carType']);
case 'Speed':
case 'Scooter':
case 'Awfar Car':
return rideInfo['carType'] == driverType;
case 'Lady':
return ['Comfort', 'Speed', 'Lady']
.contains(rideInfo['carType']);
default:
return false;
}
}).length,
itemBuilder: (context, index) {
var filteredRides = rideAvailableController
.rideAvailableMap['message']
.where((rideInfo) {
var driverType =
box.read(BoxName.carTypeOfDriver).toString();
switch (driverType) {
case 'Comfort':
return ['Speed', 'Comfort']
.contains(rideInfo['carType']);
case 'Speed':
case 'Scooter':
case 'Awfar Car':
return rideInfo['carType'] == driverType;
case 'Lady':
return ['Comfort', 'Speed', 'Lady']
.contains(rideInfo['carType']);
default:
return false;
}
}).toList();
return RideAvailableCard(
rideInfo: filteredRides[index],
);
},
)
// rideAvailableController.isLoading
// ? const MyCircularProgressIndicator()
// : ListView.builder(
// itemCount: rideAvailableController
// .rideAvailableMap['message'].length,
// itemBuilder: (context, index) => RideAvailableCard(
// rideInfo: rideAvailableController
// .rideAvailableMap['message'][index],
// ),
// )
],
isleading: true);
});
}
}
class RideAvailableCard extends StatelessWidget {
final Map<String, dynamic> rideInfo;
const RideAvailableCard({Key? key, required this.rideInfo}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
margin: const EdgeInsets.all(8.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
elevation: 4,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildLocationRow('', rideInfo['startName'], AppColor.greenColor),
const SizedBox(height: 8),
_buildLocationRow('', rideInfo['endName'], Colors.red),
const SizedBox(height: 16),
_buildInfoRow(),
const SizedBox(height: 16),
_buildActionRow(),
],
),
),
);
}
Widget _buildLocationRow(String icon, String location, Color iconColor) {
return Row(
children: [
Text(
icon,
style: TextStyle(
fontSize: 20, fontWeight: FontWeight.bold, color: iconColor),
),
const SizedBox(width: 8),
Expanded(
child: Text(
location,
style: AppStyle.subtitle,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
],
);
}
Widget _buildInfoRow() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('${'Price:'.tr} ${rideInfo['price']} \$', style: AppStyle.title),
Text(
rideInfo['carType'],
style: AppStyle.title.copyWith(color: AppColor.greenColor),
),
],
);
}
Widget _buildActionRow() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('📈 ${rideInfo['passengerRate']}', style: AppStyle.title),
const SizedBox(height: 4),
Text(
'📍 ${rideInfo['distance']} ${'KM'.tr}',
style: AppStyle.title.copyWith(color: AppColor.greenColor),
),
],
),
ElevatedButton(
onPressed: () => _acceptRide(),
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.greenColor,
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
child: Text('Accept'.tr),
),
],
);
}
void _acceptRide() async {
var res = await CRUD().post(link: AppLink.updateStausFromSpeed, payload: {
'id': rideInfo['id'],
'rideTimeStart': DateTime.now().toString(),
'status': 'Apply',
'driver_id': box.read(BoxName.driverID),
});
if (AppLink.endPoint.toString() != AppLink.seferCairoServer) {
CRUD().post(
link: '${AppLink.endPoint}rides/updateStausFromSpeed.php',
payload: {
'id': rideInfo['id'],
'rideTimeStart': DateTime.now().toString(),
'status': 'Apply',
'driver_id': box.read(BoxName.driverID),
});
}
// .then((value) {
// var json = jsonDecode(res);
if (res != "failure") {
List<String> bodyToPassenger = [
box.read(BoxName.driverID).toString(),
box.read(BoxName.nameDriver).toString(),
box.read(BoxName.tokenDriver).toString(),
];
box.write(BoxName.statusDriverLocation, 'on');
await CRUD().postFromDialogue(link: AppLink.addDriverOrder, payload: {
'driver_id': box.read(BoxName.driverID),
'order_id': rideInfo['id'],
'status': 'Apply'
});
await CRUD().post(link: AppLink.updateRides, payload: {
'id': rideInfo['id'],
'DriverIsGoingToPassenger': DateTime.now().toString(),
'status': 'Applied'
});
await CRUD().post(
link: AppLink.updateWaitingRide,
payload: {'id': rideInfo['id'], 'status': 'Applied'});
if (AppLink.endPoint.toString() != AppLink.seferCairoServer) {
CRUD().postFromDialogue(
link: '${AppLink.endPoint}/driver_order/add.php',
payload: {
'driver_id': box.read(BoxName.driverID),
// box.read(BoxName.driverID).toString(),
'order_id': rideInfo['id'],
'status': 'Apply'
});
CRUD().post(link: '${AppLink.endPoint}/rides/update.php', payload: {
'id': rideInfo['id'],
'DriverIsGoingToPassenger': DateTime.now().toString(),
'status': 'Applied'
});
CRUD().post(
link:
"${AppLink.endPoint}/ride/notificationCaptain/updateWaitingTrip.php",
payload: {'id': rideInfo['id'], 'status': 'Applied'});
}
FirebaseMessagesController().sendNotificationToPassengerToken(
"Accepted Ride".tr,
'your ride is Accepted'.tr,
// arguments['DriverList'][9].toString(),
rideInfo['passengerToken'].toString(),
// box.read(BoxName.tokenDriver).toString(),
bodyToPassenger,
'start.wav');
Get.back();
Get.to(() => PassengerLocationMapPage(), arguments: {
'passengerLocation': rideInfo['start_location'].toString(),
'passengerDestination': rideInfo['end_location'].toString(),
'Duration': rideInfo['duration'].toString(),
'totalCost': rideInfo['price'].toString(),
'Distance': rideInfo['distance'].toString(),
'name': rideInfo['first_name'].toString(),
'phone': rideInfo['phone'].toString(),
'email': rideInfo['email'].toString(),
'WalletChecked': rideInfo['payment_method'].toString(),
'tokenPassenger': rideInfo['passengerToken'].toString(),
'direction':
'https://www.google.com/maps/dir/${rideInfo['start_location']}/${rideInfo['end_location']}/',
'DurationToPassenger': rideInfo['duration'].toString(),
'rideId': rideInfo['id'].toString(),
'passengerId': rideInfo['passenger_id'].toString(),
'driverId': box.read(BoxName.driverID).toString(),
'durationOfRideValue': rideInfo['duration'].toString(),
'paymentAmount': rideInfo['price'].toString(),
'paymentMethod': 'cash'.toString() == //todo fix payment method
'true'
? 'visa'
: 'cash',
'isHaveSteps': 'startEnd'.toString(),
'step0': ''.toString(),
'step1': ''.toString(),
'step2': ''.toString(),
'step3': ''.toString(),
'step4': ''.toString(),
'passengerWalletBurc': rideInfo['bruc'].toString(),
'timeOfOrder': DateTime.now().toString(),
'totalPassenger': rideInfo['price'].toString(),
'carType': rideInfo['carType'].toString(),
'kazan': Get.find<HomeCaptainController>().kazan.toString(),
});
} else {
MyDialog().getDialog(
"This ride is already taken by another driver.".tr, '', () {
CRUD().post(
link: AppLink.deleteAvailableRide, payload: {'id': rideInfo['id']});
if (AppLink.endPoint.toString() != AppLink.seferCairoServer) {
CRUD().post(
link:
'${AppLink.endPoint}/ride/notificationCaptain/deleteAvailableRide.php',
payload: {'id': rideInfo['id']});
}
Get.back();
});
}
}
}

View File

@@ -0,0 +1,87 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sefer_driver/controller/notification/notification_captain_controller.dart';
import 'package:flutter/cupertino.dart';
class NotificationCaptain extends StatelessWidget {
const NotificationCaptain({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Get.put(NotificationCaptainController());
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Notifications'.tr),
leading: CupertinoNavigationBarBackButton(
onPressed: () => Get.back(),
),
),
child: SafeArea(
child: GetBuilder<NotificationCaptainController>(
builder: (notificationCaptainController) =>
notificationCaptainController.isLoading
? const Center(child: CupertinoActivityIndicator())
: ListView.builder(
itemCount: notificationCaptainController
.notificationData['message'].length,
itemBuilder: (BuildContext context, int index) {
if (notificationCaptainController
.notificationData['message'] ==
"No notification data found") {
_showCupertinoDialog(context, 'No Notifications',
'There are no notifications at this time.');
return const SizedBox.shrink();
}
var res = notificationCaptainController
.notificationData['message'][index];
return CupertinoListTile(
leading: const Icon(CupertinoIcons.bell_fill),
title: Text(
res['title'],
style:
CupertinoTheme.of(context).textTheme.textStyle,
),
subtitle: Text(
res['body'],
style: CupertinoTheme.of(context)
.textTheme
.tabLabelTextStyle,
),
onTap: () {
_showCupertinoDialog(
context,
res['title'],
res['body'],
onConfirm: () {
notificationCaptainController
.updateNotification(res['id'].toString());
Navigator.of(context).pop();
},
);
},
);
},
),
),
),
);
}
void _showCupertinoDialog(BuildContext context, String title, String content,
{VoidCallback? onConfirm}) {
showCupertinoDialog(
context: context,
builder: (BuildContext context) => CupertinoAlertDialog(
title: Text(title),
content: Text(content),
actions: <CupertinoDialogAction>[
CupertinoDialogAction(
child: const Text('OK'),
onPressed: onConfirm ?? () => Navigator.of(context).pop(),
),
],
),
);
}
}

View File

@@ -0,0 +1,83 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sefer_driver/constant/colors.dart';
import 'package:sefer_driver/constant/style.dart';
import '../../controller/notification/passenger_notification_controller.dart';
import '../widgets/elevated_btn.dart';
import '../widgets/my_scafold.dart';
import '../widgets/mycircular.dart';
class NotificationPage extends StatelessWidget {
const NotificationPage({super.key});
@override
Widget build(BuildContext context) {
Get.put(PassengerNotificationController());
return MyScafolld(
isleading: true,
title: 'Notifications',
body: [
GetBuilder<PassengerNotificationController>(
builder: (notificationCaptainController) =>
notificationCaptainController.isloading
? const MyCircularProgressIndicator()
: SafeArea(
child: ListView.builder(
itemCount: notificationCaptainController
.notificationData['message'].length,
itemBuilder: (BuildContext context, int index) {
if (notificationCaptainController
.notificationData['message'] ==
"No notification data found") {
Get.defaultDialog();
}
var res = notificationCaptainController
.notificationData['message'][index];
return Card(
elevation: 4,
color: res['isShown'] == 'true'
? AppColor.secondaryColor.withOpacity(.5)
: AppColor.secondaryColor.withOpacity(.9),
child: ListTile(
onTap: () {
Get.defaultDialog(
title: res['title'],
titleStyle: AppStyle.title,
content: SizedBox(
width: Get.width * .8,
// height: Get.height * .4,
child: Text(
res['body'],
style: AppStyle.title,
),
),
confirm: MyElevatedButton(
title: 'Ok',
onPressed: () {
notificationCaptainController
.updateNotification(
res['id'].toString());
}));
},
leading: res['isShown'] == 'true'
? const Icon(
Icons.notifications_off_outlined)
: const Icon(Icons.notifications_active),
title: Text(
res['title'],
style: AppStyle.title,
),
subtitle: Text(
res['body'],
style: AppStyle.subtitle,
),
),
);
},
),
))
],
);
}
}