This commit is contained in:
Hamza-Ayed
2024-09-20 20:03:54 +03:00
parent b09e0da403
commit 519f4b651c
20 changed files with 935 additions and 831 deletions

View File

@@ -54,8 +54,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = 23 minSdk = 23
targetSdk = flutter.targetSdkVersion targetSdk = flutter.targetSdkVersion
versionCode = 88 versionCode = 90
versionName = '1.5.88`' versionName = '1.5.90`'
multiDexEnabled =true multiDexEnabled =true
} }

View File

@@ -54,6 +54,7 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name="com.yalantis.ucrop.UCropActivity" android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -214,9 +214,9 @@ PODS:
- record_darwin (1.0.0): - record_darwin (1.0.0):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- SDWebImage (5.19.4): - SDWebImage (5.19.7):
- SDWebImage/Core (= 5.19.4) - SDWebImage/Core (= 5.19.7)
- SDWebImage/Core (5.19.4) - SDWebImage/Core (5.19.7)
- SDWebImageWebPCoder (0.14.6): - SDWebImageWebPCoder (0.14.6):
- libwebp (~> 1.0) - libwebp (~> 1.0)
- SDWebImage/Core (~> 5.17) - SDWebImage/Core (~> 5.17)
@@ -484,7 +484,7 @@ SPEC CHECKSUMS:
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21
record_darwin: df0a677188e5fed18472550298e675f19ddaffbe record_darwin: df0a677188e5fed18472550298e675f19ddaffbe
SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
share: 0b2c3e82132f5888bccca3351c504d0003b3b410 share: 0b2c3e82132f5888bccca3351c504d0003b3b410
sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440 sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440

View File

@@ -33,7 +33,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>57</string> <string>58</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key> <key>CFBundleURLTypes</key>
@@ -48,7 +48,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>4.0.57</string> <string>4.0.58</string>
<key>FirebaseAppDelegateProxyEnabled</key> <key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string> <string>NO</string>
<key>GMSApiKey</key> <key>GMSApiKey</key>

View File

@@ -174,22 +174,11 @@ class NotificationController extends GetxController {
// display a dialog with the notification details, tap ok to go to another page // display a dialog with the notification details, tap ok to go to another page
} }
} }
// import 'package:flutter_local_notifications/flutter_local_notifications.dart';
// import 'package:get/get.dart';
// import 'package:timezone/data/latest.dart' as tz;
// import 'package:timezone/timezone.dart' as tz;
// class NotificationController extends GetxController { // class NotificationController extends GetxController {
// final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = // final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
// FlutterLocalNotificationsPlugin(); // FlutterLocalNotificationsPlugin();
// @override
// void onInit() {
// super.onInit();
// initNotifications();
// tz.initializeTimeZones();
// }
// // Initializes the local notifications plugin // // Initializes the local notifications plugin
// Future<void> initNotifications() async { // Future<void> initNotifications() async {
// const AndroidInitializationSettings android = // const AndroidInitializationSettings android =
@@ -212,29 +201,4 @@ class NotificationController extends GetxController {
// NotificationDetails details = NotificationDetails(android: android); // NotificationDetails details = NotificationDetails(android: android);
// await _flutterLocalNotificationsPlugin.show(0, title, message, details); // await _flutterLocalNotificationsPlugin.show(0, title, message, details);
// } // }
// // Schedules a notification for a specific time
// Future<void> scheduleNotification(
// String title, String body, DateTime scheduledTime) async {
// await _flutterLocalNotificationsPlugin.zonedSchedule(
// 0,
// title,
// body,
// tz.TZDateTime.from(scheduledTime, tz.local),
// const NotificationDetails(
// android: AndroidNotificationDetails(
// 'your_channel_id',
// 'your_channel_name',
// channelDescription: 'your_channel_description',
// importance: Importance.max,
// priority: Priority.high,
// showWhen: false,
// ),
// ),
// androidAllowWhileIdle: true,
// uiLocalNotificationDateInterpretation:
// UILocalNotificationDateInterpretation.absoluteTime,
// matchDateTimeComponents: DateTimeComponents.time,
// );
// }
// } // }

View File

@@ -4,6 +4,8 @@ class MyTranslation extends Translations {
@override @override
Map<String, Map<String, String>> get keys => { Map<String, Map<String, String>> get keys => {
"ar": { "ar": {
'If you need any help or have questions, this is the right place to do that. You are welcome!':
'إذا كنت بحاجة إلى أي مساعدة أو لديك أي أسئلة، فهذا هو المكان المناسب لذلك. أهلاً وسهلاً بك!',
'ID Mismatch': "عدم تطابق الرقم التعريفي", 'ID Mismatch': "عدم تطابق الرقم التعريفي",
"face detect": "كشف الوجه", "face detect": "كشف الوجه",
'An error occurred while saving driver data': 'An error occurred while saving driver data':

View File

@@ -41,7 +41,7 @@ class NotificationCaptainController extends GetxController {
updateNotification(String id) async { updateNotification(String id) async {
await CRUD().post( await CRUD().post(
link: AppLink.updateNotificationCaptain, link: AppLink.updateNotificationCaptain,
payload: {'isShown': true, 'id': id}, payload: {'isShown': 'true', 'id': id},
); );
} }

View File

@@ -5,6 +5,7 @@ import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../constant/links.dart'; import '../../constant/links.dart';
import '../../views/widgets/mydialoug.dart';
import '../functions/crud.dart'; import '../functions/crud.dart';
class RideAvailableController extends GetxController { class RideAvailableController extends GetxController {
@@ -18,16 +19,20 @@ class RideAvailableController extends GetxController {
isLoading = false; isLoading = false;
update(); update();
} else { } else {
Get.defaultDialog( MyDialog().getDialog("No Rides Available".tr, '', () {
title: "No Rides Available".tr,
middleText: '',
titleStyle: AppStyle.title,
confirm: MyElevatedButton(
title: 'Ok'.tr,
onPressed: () {
Get.back(); Get.back();
Get.back(); Get.back();
})); });
// Get.defaultDialog(
// title: "No Rides Available".tr,
// middleText: '',
// titleStyle: AppStyle.title,
// confirm: MyElevatedButton(
// title: 'Ok'.tr,
// onPressed: () {
// Get.back();
// Get.back();
// }));
} }
} }

View File

@@ -107,6 +107,8 @@ void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await WakelockPlus.enable(); await WakelockPlus.enable();
await GetStorage.init();
Stripe.publishableKey = AK.publishableKeyStripe;
// Request location permission // Request location permission
// PermissionStatus status = await Permission.location.request(); // PermissionStatus status = await Permission.location.request();
// if (status.isDenied) { // if (status.isDenied) {
@@ -120,9 +122,6 @@ void main() async {
await LocationController().startLocationUpdates(); await LocationController().startLocationUpdates();
} }
await GetStorage.init();
Stripe.publishableKey = AK.publishableKeyStripe;
if (Platform.isAndroid || Platform.isIOS) { if (Platform.isAndroid || Platform.isIOS) {
await Firebase.initializeApp( await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform, options: DefaultFirebaseOptions.currentPlatform,

View File

@@ -25,7 +25,7 @@ class SmsSignupEgypt extends StatelessWidget {
Padding( Padding(
padding: const EdgeInsets.only(bottom: 20.0), padding: const EdgeInsets.only(bottom: 20.0),
child: Image.asset( child: Image.asset(
'assets/images/logo.png', // Make sure you have a logo image in your assets folder 'assets/images/logo.gif', // Make sure you have a logo image in your assets folder
height: 100, height: 100,
), ),
), ),
@@ -91,7 +91,9 @@ class SmsSignupEgypt extends StatelessWidget {
// Submit button // Submit button
registerCaptainController.isLoading registerCaptainController.isLoading
? const MyCircularProgressIndicator() ? const MyCircularProgressIndicator()
: MyElevatedButton( : Padding(
padding: const EdgeInsets.all(16.0),
child: MyElevatedButton(
onPressed: () async { onPressed: () async {
!registerCaptainController.isSent !registerCaptainController.isSent
? await registerCaptainController.sendOtpMessage() ? await registerCaptainController.sendOtpMessage()
@@ -99,6 +101,7 @@ class SmsSignupEgypt extends StatelessWidget {
}, },
title: 'Submit'.tr, title: 'Submit'.tr,
), ),
),
], ],
); );
}), }),

View File

@@ -1,24 +1,29 @@
import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart'; import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/main.dart'; import 'package:SEFER/main.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/my_textField.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_contacts/contact.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../../controller/auth/captin/invit_controller.dart'; import '../../../controller/auth/captin/invit_controller.dart';
import '../../../print.dart'; import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import '../../widgets/elevated_btn.dart';
class InviteDriverScreen extends StatelessWidget { class InviteDriverScreen extends StatelessWidget {
final InviteController controller = Get.put(InviteController()); final InviteController controller = Get.put(InviteController());
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return CupertinoPageScaffold(
appBar: AppBar(title: Text('Invite a Driver'.tr)), navigationBar: CupertinoNavigationBar(
body: Padding( middle: Text('Invite a Driver'.tr),
leading: CupertinoNavigationBarBackButton(
onPressed: () => Get.back(),
),
),
child: SafeArea(
child: SingleChildScrollView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -26,21 +31,20 @@ class InviteDriverScreen extends StatelessWidget {
Text( Text(
"Invite another driver and both get a gift after he completes 100 trips!" "Invite another driver and both get a gift after he completes 100 trips!"
.tr, .tr,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), style: CupertinoTheme.of(context).textTheme.navTitleTextStyle,
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: MyTextForm( child: CupertinoTextField(
controller: controller.invitePhoneController, controller: controller.invitePhoneController,
label: 'Enter driver\'s phone'.tr, placeholder: 'Enter driver\'s phone'.tr,
hint: 'Enter driver\'s phone'.tr, keyboardType: TextInputType.phone,
type: TextInputType.phone,
), ),
), ),
IconButton( CupertinoButton(
icon: const Icon(Icons.contacts), child: const Icon(CupertinoIcons.person_2),
onPressed: () async { onPressed: () async {
await controller.pickContacts(); await controller.pickContacts();
if (controller.contacts.isNotEmpty) { if (controller.contacts.isNotEmpty) {
@@ -48,34 +52,7 @@ class InviteDriverScreen extends StatelessWidget {
controller.savePhoneToServer(); controller.savePhoneToServer();
box.write(BoxName.IsSavedPhones, true); box.write(BoxName.IsSavedPhones, true);
} }
Get.defaultDialog( _showContactsDialog(context);
title: 'Choose from contact'.tr,
content: Column(
children: [
SizedBox(
height: 300,
child: ListView.builder(
itemCount: controller.contactMaps.length,
itemBuilder: (context, index) {
final contact = controller.contactMaps[index];
return InkWell(
onTap: () {
controller.selectPhone(
contact['phones'].toString());
},
child: ListTile(
title: Text(contact['name'].toString()),
subtitle: Text(
controller.formatPhoneNumber(
contact['phones'][0].toString())),
),
);
},
),
),
],
),
);
} }
}, },
), ),
@@ -98,62 +75,69 @@ class InviteDriverScreen extends StatelessWidget {
], ],
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
GetBuilder<InviteController>(builder: (controller) { GetBuilder<InviteController>(
builder: (controller) {
return SizedBox( return SizedBox(
height: Get.height * .4, height: Get.height * .4,
child: controller.driverInvitationData.isEmpty child: controller.driverInvitationData.isEmpty
? Center( ? Center(
child: Text( child: Text(
"No invitation found yet!".tr, "No invitation found yet!".tr,
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
), ),
) )
: ListView.builder( : ListView.builder(
itemCount: controller.driverInvitationData.length, itemCount: controller.driverInvitationData.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
int countOfInvitDriver = 0; int countOfInvitDriver = int.tryParse(controller
if (controller.driverInvitationData[index]
.containsKey('countOfInvitDriver')) {
countOfInvitDriver = int.tryParse(controller
.driverInvitationData[index] .driverInvitationData[index]
['countOfInvitDriver'] ['countOfInvitDriver']
.toString()) ?? ?.toString() ??
'0') ??
0; 0;
}
double progressValue = countOfInvitDriver / 100.0; double progressValue = countOfInvitDriver / 100.0;
if (progressValue > 1.0) progressValue = 1.0; progressValue = progressValue.clamp(0.0, 1.0);
if (progressValue < 0.0) progressValue = 0.0;
return InkWell( return GestureDetector(
onTap: () async { onTap: () async {
controller.onSelectDriverInvitation(index); controller.onSelectDriverInvitation(index);
}, },
child: Container( child: Container(
margin: const EdgeInsets.symmetric(vertical: 8.0), margin:
const EdgeInsets.symmetric(vertical: 8.0),
child: Stack( child: Stack(
alignment: AlignmentDirectional.center, alignment: AlignmentDirectional.center,
children: [ children: [
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12), borderRadius:
color: BorderRadius.circular(12),
AppColor.accentColor.withOpacity(.5), color: CupertinoColors.systemGrey5,
), ),
width: Get.width * .85, width: Get.width * .85,
height: 35,
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(12), borderRadius:
BorderRadius.circular(12),
child: LinearProgressIndicator( child: LinearProgressIndicator(
value: progressValue, value: progressValue,
color: AppColor.blueColor, backgroundColor:
backgroundColor: AppColor.accentColor CupertinoColors.systemGrey3,
.withOpacity(.3), valueColor:
minHeight: 35, const AlwaysStoppedAnimation<
Color>(
CupertinoColors.activeBlue),
), ),
), ),
), ),
Text( Text(
'${controller.driverInvitationData[index]['invitorName']} ${controller.driverInvitationData[index]['countOfInvitDriver']} / 100 ${'Trip'.tr}', '${controller.driverInvitationData[index]['invitorName']} ${countOfInvitDriver} / 100 ${'Trip'.tr}',
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
], ],
), ),
@@ -162,10 +146,48 @@ class InviteDriverScreen extends StatelessWidget {
}, },
), ),
); );
}) },
)
], ],
), ),
), ),
),
);
}
void _showContactsDialog(BuildContext context) {
showCupertinoModalPopup(
context: context,
builder: (BuildContext context) => CupertinoActionSheet(
title: Text('Choose from contact'.tr),
actions: [
SizedBox(
height: 300,
child: CupertinoScrollbar(
child: ListView.builder(
itemCount: controller.contactMaps.length,
itemBuilder: (context, index) {
final contact = controller.contactMaps[index];
return CupertinoActionSheetAction(
child: Text(
'${contact['name']} - ${controller.formatPhoneNumber(contact['phones'][0].toString())}'),
onPressed: () {
controller.selectPhone(contact['phones'].toString());
// Navigator.pop(context);
},
);
},
),
),
),
],
cancelButton: CupertinoActionSheetAction(
child: Text('Cancel'.tr),
onPressed: () {
Navigator.pop(context);
},
),
),
); );
} }
} }

View File

@@ -1,12 +1,10 @@
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../../../constant/colors.dart';
import '../../../../constant/style.dart';
import '../../../../controller/auth/captin/history_captain.dart'; import '../../../../controller/auth/captin/history_captain.dart';
import '../../../widgets/elevated_btn.dart'; import 'package:flutter/cupertino.dart';
import '../../../widgets/my_scafold.dart'; import 'package:get/get.dart';
import '../../../widgets/mycircular.dart';
class HistoryCaptain extends StatelessWidget { class HistoryCaptain extends StatelessWidget {
const HistoryCaptain({super.key}); const HistoryCaptain({super.key});
@@ -14,18 +12,25 @@ class HistoryCaptain extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Get.put(HistoryCaptainController()); Get.put(HistoryCaptainController());
return MyScafolld( return CupertinoPageScaffold(
title: 'History Page'.tr, navigationBar: CupertinoNavigationBar(
body: [ middle: Text('History Page'.tr),
GetBuilder<HistoryCaptainController>( leading: CupertinoNavigationBarBackButton(
onPressed: () => Get.back(),
),
),
child: SafeArea(
child: GetBuilder<HistoryCaptainController>(
builder: (historyCaptainController) => historyCaptainController builder: (historyCaptainController) => historyCaptainController
.isloading .isloading
? const MyCircularProgressIndicator() ? const Center(child: CupertinoActivityIndicator())
: historyCaptainController.historyData['message'].length < 1 : historyCaptainController.historyData['message'].length < 1
? Center( ? Center(
child: Text( child: Text(
'No ride Yet.'.tr, 'No ride Yet.'.tr,
style: AppStyle.headTitle, style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
), ),
) )
: ListView.builder( : ListView.builder(
@@ -34,22 +39,30 @@ class HistoryCaptain extends StatelessWidget {
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
var list = historyCaptainController var list = historyCaptainController
.historyData['message'][index]; .historyData['message'][index];
return InkWell( return Padding(
onTap: () { padding: const EdgeInsets.all(4.0),
list['status'] != 'Cancel' child: Container(
? historyCaptainController decoration: BoxDecoration(
.getHistoryDetails(list['order_id']) border: Border.all(
: Get.defaultDialog( color: CupertinoColors.systemGrey, width: 1),
title: 'This Trip Cancelled'.tr, borderRadius:
middleText: '', const BorderRadius.all(Radius.circular(8.0)),
titleStyle: AppStyle.title, ),
confirm: MyElevatedButton( child: CupertinoButton(
title: 'Ok'.tr, onPressed: () {
onPressed: () => Get.back())); if (list['status'] != 'Cancel') {
historyCaptainController
.getHistoryDetails(list['order_id']);
} else {
MyDialog().getDialog(
'This Trip Cancelled'.tr,
'This Trip Cancelled'.tr,
() => Get.back(),
);
}
}, },
child: Card( child: Container(
child: Padding( margin: const EdgeInsets.all(8),
padding: const EdgeInsets.all(8.0),
child: Row( child: Row(
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.spaceBetween, MainAxisAlignment.spaceBetween,
@@ -60,11 +73,15 @@ class HistoryCaptain extends StatelessWidget {
children: [ children: [
Text( Text(
'OrderId'.tr, 'OrderId'.tr,
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
), ),
Text( Text(
list['order_id'], list['order_id'],
style: AppStyle.subtitle, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
], ],
), ),
@@ -74,34 +91,51 @@ class HistoryCaptain extends StatelessWidget {
children: [ children: [
Text( Text(
'created time'.tr, 'created time'.tr,
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
), ),
Text( Text(
list['created_at'], list['created_at'],
style: AppStyle.subtitle, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
], ],
), ),
Text( Text(
list['status'], list['status'],
style: list['status'] == 'Apply' style: list['status'] == 'Apply'
? AppStyle.title.copyWith( ? CupertinoTheme.of(context)
color: AppColor.greenColor) .textTheme
.navTitleTextStyle
.copyWith(
color: CupertinoColors
.systemGreen)
: list['status'] == 'Refused' : list['status'] == 'Refused'
? AppStyle.title.copyWith( ? CupertinoTheme.of(context)
color: AppColor.redColor) .textTheme
: AppStyle.title.copyWith( .navTitleTextStyle
color: AppColor.yellowColor), .copyWith(
color: CupertinoColors
.systemRed)
: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle
.copyWith(
color: CupertinoColors
.systemYellow),
), ),
], ],
), ),
), ),
), ),
),
); );
}, },
)) ),
], ),
isleading: true, ),
); );
} }
} }

View File

@@ -1,67 +1,79 @@
import 'package:SEFER/controller/functions/location_controller.dart'; import 'package:SEFER/controller/functions/location_controller.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/auth/captin/history_captain.dart'; import 'package:SEFER/controller/auth/captin/history_captain.dart';
import 'package:SEFER/controller/functions/launch.dart'; import 'package:SEFER/controller/functions/launch.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart';
import '../../../widgets/mycircular.dart'; import 'package:flutter/cupertino.dart';
class HistoryDetailsPage extends StatelessWidget { class HistoryDetailsPage extends StatelessWidget {
HistoryDetailsPage({super.key}); HistoryDetailsPage({super.key});
HistoryCaptainController historyCaptainController = HistoryCaptainController historyCaptainController =
Get.put(HistoryCaptainController()); Get.put(HistoryCaptainController());
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MyScafolld( return CupertinoPageScaffold(
title: 'Trip Detail'.tr, navigationBar: CupertinoNavigationBar(
body: [ middle: Text('Trip Detail'.tr),
GetBuilder<HistoryCaptainController>( leading: CupertinoButton(
padding: EdgeInsets.zero,
child: const Icon(CupertinoIcons.back),
onPressed: () => Navigator.pop(context),
),
),
child: GetBuilder<HistoryCaptainController>(
builder: (historyCaptainController) { builder: (historyCaptainController) {
var res = historyCaptainController.historyDetailsData['data']; var res = historyCaptainController.historyDetailsData['data'];
return historyCaptainController.isloading return historyCaptainController.isloading
? const MyCircularProgressIndicator() ? const Center(
: SingleChildScrollView( child: CupertinoActivityIndicator(),
child: Center( )
: CupertinoScrollbar(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( const SizedBox(
width: Get.width * .8, height: 20,
decoration: BoxDecoration( ),
border: Border.all( CupertinoButton(
color: AppColor.blueColor, width: 2)),
child: TextButton(
onPressed: () { onPressed: () {
String mapUrl = String mapUrl =
'https://www.google.com/maps/dir/${res['start_location']}/${res['end_location']}/'; 'https://www.google.com/maps/dir/${res['start_location']}/${res['end_location']}/';
showInBrowser(mapUrl); showInBrowser(mapUrl);
}, },
child: Container(
width: MediaQuery.of(context).size.width * 0.9,
padding: const EdgeInsets.all(12.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
border: Border.all(
color: CupertinoColors.activeBlue,
width: 2),
),
child: Column( child: Column(
children: [ children: [
const SizedBox(
height: 20,
),
SizedBox( SizedBox(
height: Get.height * .2, height: MediaQuery.of(context).size.height *
width: Get.width * .75, 0.3,
child: GoogleMap( child: GoogleMap(
initialCameraPosition: CameraPosition( initialCameraPosition: CameraPosition(
target: Get.find<LocationController>() target: Get.find<LocationController>()
.myLocation, // Assuming passenger location is available .myLocation,
tilt: 80, zoom: 13, tilt: 80,
zoom: 13,
), ),
zoomControlsEnabled: true, zoomControlsEnabled: true,
// liteModeEnabled: true,
polylines: { polylines: {
Polyline( Polyline(
zIndex: 2,
consumeTapEvents: true,
geodesic: true,
endCap: Cap.buttCap,
startCap: Cap.buttCap,
visible: true,
polylineId: const PolylineId('route'), polylineId: const PolylineId('route'),
points: [ points: [
LatLng( LatLng(
@@ -81,26 +93,28 @@ class HistoryDetailsPage extends StatelessWidget {
.split(',')[1]), .split(',')[1]),
) )
], ],
color: AppColor.primaryColor, color: CupertinoColors.activeGreen,
width: 5, width: 5,
), ),
}, },
), ),
), ),
const SizedBox( const SizedBox(height: 10),
height: 10,
),
Row( Row(
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.spaceEvenly, MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'${'Order ID'.tr} ${res['id']}', '${'Order ID'.tr} ${res['id']}',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.navActionTextStyle,
), ),
Text( Text(
res['date'].toString(), res['date'].toString(),
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.navActionTextStyle,
), ),
], ],
), ),
@@ -108,97 +122,117 @@ class HistoryDetailsPage extends StatelessWidget {
), ),
), ),
), ),
const SizedBox( const SizedBox(height: 20),
height: 10,
),
Container( Container(
width: Get.width * .8, width: MediaQuery.of(context).size.width * 0.9,
padding: const EdgeInsets.all(12.0),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
border: Border.all( border: Border.all(
color: AppColor.greenColor, width: 2)), color: CupertinoColors.activeGreen, width: 2),
),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'${'Price is'.tr} ${res['price_for_driver']}', '${'Price is'.tr} ${res['price_for_driver']}',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
Text( Text(
'${'Distance is'.tr} ${res['distance']} KM', '${'Distance is'.tr} ${res['distance']} KM',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
], ],
), ),
), ),
const SizedBox( const SizedBox(height: 20),
height: 10,
),
Text( Text(
'Times of Trip'.tr, 'Times of Trip'.tr,
style: AppStyle.title, style: CupertinoTheme.of(context)
), .textTheme
const SizedBox( .navTitleTextStyle,
height: 10,
), ),
const SizedBox(height: 10),
Container( Container(
width: Get.width * .8, width: MediaQuery.of(context).size.width * 0.9,
padding: const EdgeInsets.all(12.0),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
border: Border.all( border: Border.all(
color: AppColor.redColor, width: 2)), color: CupertinoColors.destructiveRed,
width: 2),
),
child: Column( child: Column(
children: [ children: [
Text( Text(
'${'Time to Passenger is'.tr} ${res['DriverIsGoingToPassenger']}', '${'Time to Passenger is'.tr} ${res['DriverIsGoingToPassenger']}',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
Text( Text(
'${'TimeStart is'.tr} ${res['rideTimeStart']}', '${'TimeStart is'.tr} ${res['rideTimeStart']}',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
Text( Text(
'${'Time Finish is'.tr} ${res['rideTimeFinish']}', '${'Time Finish is'.tr} ${res['rideTimeFinish']}',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
], ],
), ),
), ),
const SizedBox( const SizedBox(height: 20),
height: 10,
),
Container( Container(
width: Get.width * .8, width: MediaQuery.of(context).size.width * 0.9,
padding: const EdgeInsets.all(12.0),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
border: Border.all( border: Border.all(
color: AppColor.greenColor, width: 2)), color: CupertinoColors.systemGreen, width: 2),
),
child: Center( child: Center(
child: Text( child: Text(
'${'Passenger Name is'.tr} ${res['first_name']} ${res['last_name']}', '${'Passenger Name is'.tr} ${res['first_name']} ${res['last_name']}',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
), ),
), ),
const SizedBox( const SizedBox(height: 20),
height: 10,
),
Container( Container(
width: Get.width * .8, width: MediaQuery.of(context).size.width * 0.9,
padding: const EdgeInsets.all(12.0),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
border: Border.all( border: Border.all(
color: AppColor.yellowColor, width: 2)), color: CupertinoColors.systemYellow,
width: 2),
),
child: Center( child: Center(
child: Text( child: Text(
'${'Status is'.tr} ${res['status']}', '${'Status is'.tr} ${res['status']}',
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
), ),
), ),
), ),
], ],
), ),
), ),
),
); );
}) },
], ),
isleading: true,
); );
} }
} }

View File

@@ -1,6 +1,5 @@
import 'package:SEFER/constant/api_key.dart'; import 'package:SEFER/constant/api_key.dart';
import 'package:SEFER/constant/links.dart'; import 'package:SEFER/constant/links.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; import 'package:SEFER/controller/home/captin/home_captain_controller.dart';
import 'package:SEFER/views/auth/captin/contact_us_page.dart'; import 'package:SEFER/views/auth/captin/contact_us_page.dart';
import 'package:SEFER/views/auth/captin/invite_driver_screen.dart'; import 'package:SEFER/views/auth/captin/invite_driver_screen.dart';
@@ -9,7 +8,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/main.dart'; import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/captin/logout_captain.dart'; import 'package:SEFER/views/auth/captin/logout_captain.dart';
import 'package:SEFER/views/home/Captin/history/history_captain.dart'; import 'package:SEFER/views/home/Captin/history/history_captain.dart';
@@ -19,99 +17,98 @@ import 'package:SEFER/views/home/my_wallet/walet_captain.dart';
import 'package:SEFER/views/home/profile/profile_captain.dart'; import 'package:SEFER/views/home/profile/profile_captain.dart';
import 'package:SEFER/views/notification/notification_captain.dart'; import 'package:SEFER/views/notification/notification_captain.dart';
import '../../../../constant/colors.dart';
import '../../../../controller/functions/upload_image.dart'; import '../../../../controller/functions/upload_image.dart';
import '../maintain_center_page.dart'; import '../maintain_center_page.dart';
import 'package:flutter/cupertino.dart';
class DrawerCaptain extends StatelessWidget { class CupertinoDrawerCaptain extends StatelessWidget {
ImageController imageController = Get.put(ImageController()); final ImageController imageController = Get.put(ImageController());
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Drawer( return CupertinoPageScaffold(
child: ListView( navigationBar: CupertinoNavigationBar(
padding: EdgeInsets.zero, middle: Text('Menu'.tr),
children: [ ),
const UserAccountHeader(), child: SafeArea(
child: CustomScrollView(
slivers: [
const SliverToBoxAdapter(child: const UserAccountHeader()),
SliverList(
delegate: SliverChildListDelegate([
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.account_balance_wallet, icon: CupertinoIcons.money_dollar,
text: 'Wallet'.tr, text: 'Wallet'.tr,
onTap: () => onTap: () => Get.to(() => WalletCaptain()),
Get.to(() => WalletCaptain(), transition: Transition.native),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.person, icon: CupertinoIcons.person,
text: 'Profile'.tr, text: 'Profile'.tr,
onTap: () => Get.to(() => ProfileCaptain(), onTap: () => Get.to(() => ProfileCaptain()),
transition: Transition.rightToLeftWithFade),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.history, icon: CupertinoIcons.clock,
text: 'History of Trip'.tr, text: 'History of Trip'.tr,
onTap: () => Get.to(() => const HistoryCaptain(), onTap: () => Get.to(() => const HistoryCaptain()),
transition: Transition.downToUp),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.phonelink_ring_rounded, icon: CupertinoIcons.car_detailed,
text: 'Available for rides'.tr, text: 'Available for rides'.tr,
onTap: () => Get.to(() => const AvailableRidesPage(), onTap: () => Get.to(() => const AvailableRidesPage()),
transition: Transition.rightToLeftWithFade),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.notifications, icon: CupertinoIcons.bell,
text: 'Notifications'.tr, text: 'Notifications'.tr,
onTap: () => Get.to(() => const NotificationCaptain(), onTap: () => Get.to(() => const NotificationCaptain()),
transition: Transition.upToDown),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.help, icon: CupertinoIcons.question_circle,
text: 'Helping Center'.tr, text: 'Helping Center'.tr,
onTap: () => onTap: () => Get.to(() => HelpCaptain()),
Get.to(() => HelpCaptain(), transition: Transition.size),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.share_outlined, icon: CupertinoIcons.share,
text: 'Share App'.tr, text: 'Share App'.tr,
onTap: () => onTap: () => Get.to(() => InviteDriverScreen()),
Get.to(() => InviteDriverScreen(), transition: Transition.size),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.car_repair_outlined, icon: CupertinoIcons.wrench,
text: "Maintenance Center".tr, text: "Maintenance Center".tr,
onTap: () => onTap: () => Get.to(() => MaintainCenterPage()),
Get.to(() => MaintainCenterPage(), transition: Transition.size),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.contact_mail_rounded, icon: CupertinoIcons.mail,
text: "Contact Us".tr, text: "Contact Us".tr,
onTap: () => onTap: () => Get.to(() => ContactUsPage()),
Get.to(() => ContactUsPage(), transition: Transition.cupertino),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.settings, icon: CupertinoIcons.settings,
text: 'Settings'.tr, text: 'Settings'.tr,
onTap: () => Get.to(() => const SettingsCaptain(), onTap: () => Get.to(() => const SettingsCaptain()),
transition: Transition.cupertino),
), ),
_buildDivider(), _buildDivider(),
_buildDrawerItem( _buildDrawerItem(
icon: Icons.exit_to_app, icon: CupertinoIcons.square_arrow_right,
text: 'Sign Out'.tr, text: 'Sign Out'.tr,
onTap: () => Get.to(() => const LogoutCaptain(), onTap: () => Get.to(() => const LogoutCaptain()),
transition: Transition.cupertinoDialog),
), ),
_buildDivider(), _buildDivider(),
]),
),
], ],
), ),
),
); );
} }
@@ -119,19 +116,27 @@ class DrawerCaptain extends StatelessWidget {
return const Divider( return const Divider(
thickness: 1, thickness: 1,
height: 1, height: 1,
color: AppColor.accentColor, color: CupertinoColors.systemGrey4,
); );
} }
Widget _buildDrawerItem({ Widget _buildDrawerItem({
required IconData icon, required IconData icon,
required String text, required String text,
required GestureTapCallback onTap, required VoidCallback onTap,
}) { }) {
return ListTile( return CupertinoButton(
leading: Icon(icon, color: AppColor.accentColor), onPressed: onTap,
title: Text(text, style: AppStyle.title), child: Row(
onTap: onTap, children: [
Icon(icon, color: CupertinoColors.activeBlue),
const SizedBox(width: 10),
Text(text, style: const TextStyle(color: CupertinoColors.label)),
const Spacer(),
const Icon(CupertinoIcons.right_chevron,
color: CupertinoColors.systemGrey),
],
),
); );
} }
} }
@@ -141,36 +146,82 @@ class UserAccountHeader extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return UserAccountsDrawerHeader( return Container(
decoration: BoxDecoration( padding: const EdgeInsets.all(16),
color: AppColor.greenColor, decoration: const BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
colors: AppColor.gradientStartEnd, colors: [AppColor.blueColor, AppColor.twitterColor],
begin: Alignment.topLeft, begin: Alignment.topLeft,
end: Alignment.bottomRight, end: Alignment.bottomRight,
), ),
), ),
currentAccountPictureSize: const Size.square(100), child: Column(
arrowColor: AppColor.deepPurpleAccent, crossAxisAlignment: CrossAxisAlignment.start,
accountName: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
children: [ children: [
GetBuilder<ImageController>(
builder: (imageController) {
return Stack(
children: [
imageController.isloading
? const CupertinoActivityIndicator()
: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
shape: BoxShape.circle,
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(
'${AK.serverPHP}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg',
),
),
),
),
Positioned(
right: 0,
top: 0,
child: CupertinoButton(
onPressed: () {
imageController.choosImagePicture(
AppLink.uploadImage1, 'portrait');
},
child: const Icon(CupertinoIcons.pencil_circle_fill,
color: CupertinoColors.white),
),
),
],
);
},
),
const SizedBox(height: 10),
Text( Text(
box.read(BoxName.nameDriver).toString(), box.read(BoxName.nameDriver).toString(),
style: AppStyle.title.copyWith(color: AppColor.secondaryColor), style: const TextStyle(
color: CupertinoColors.white,
fontSize: 18,
fontWeight: FontWeight.bold),
), ),
const Spacer(), const SizedBox(height: 5),
Column( Text(
mainAxisAlignment: MainAxisAlignment.center, box.read(BoxName.emailDriver),
style: const TextStyle(color: CupertinoColors.white, fontSize: 14),
),
const SizedBox(height: 10),
Row(
children: [ children: [
Text( Text(
Get.find<HomeCaptainController>().rating.toString(), Get.find<HomeCaptainController>().rating.toString(),
style: AppStyle.number.copyWith(color: Colors.amber), style: const TextStyle(
color: CupertinoColors.systemYellow, fontSize: 16),
), ),
const SizedBox(width: 5),
// You might want to replace this with a Cupertino-style rating widget
// For now, we'll use text to represent stars
// const Text('★★★★★',
// style: TextStyle(color: CupertinoColors.systemYellow)),
Container( Container(
padding: padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 1),
const EdgeInsets.symmetric(horizontal: 4, vertical: 1),
color: AppColor.greenColor, color: AppColor.greenColor,
child: RatingBar.builder( child: RatingBar.builder(
initialRating: double.parse( initialRating: double.parse(
@@ -191,40 +242,6 @@ class UserAccountHeader extends StatelessWidget {
), ),
], ],
), ),
),
accountEmail: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text(
box.read(BoxName.emailDriver),
style: AppStyle.title.copyWith(color: AppColor.secondaryColor),
),
),
currentAccountPicture:
GetBuilder<ImageController>(builder: (imageController) {
return Stack(
children: [
imageController.isloading
? const CircularProgressIndicator()
: CircleAvatar(
radius: 45,
backgroundImage: NetworkImage(
'${AK.serverPHP}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg',
),
),
Positioned(
right: 0,
top: 0,
child: IconButton(
onPressed: () {
imageController.choosImagePicture(
AppLink.uploadImage1, 'portrait');
},
icon: const Icon(Icons.edit),
),
),
],
);
}),
); );
} }
} }

View File

@@ -1,13 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/home/captin/help/help_controller.dart'; import 'package:SEFER/controller/home/captin/help/help_controller.dart';
import 'package:SEFER/views/home/Captin/home_captain/help_details_replay_page.dart'; import 'package:SEFER/views/home/Captin/home_captain/help_details_replay_page.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import '../../../widgets/elevated_btn.dart'; import 'package:flutter/cupertino.dart';
import '../../../widgets/mycircular.dart';
class HelpCaptain extends StatelessWidget { class HelpCaptain extends StatelessWidget {
HelpCaptain({super.key}); HelpCaptain({super.key});
@@ -15,57 +11,67 @@ class HelpCaptain extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Get.put(HelpController()); Get.put(HelpController());
return MyScafolld( return CupertinoPageScaffold(
title: 'Helping Page'.tr, navigationBar: CupertinoNavigationBar(
body: [ middle: Text('Helping Page'.tr),
Column( leading: CupertinoButton(
padding: EdgeInsets.zero,
child: Icon(CupertinoIcons.back),
onPressed: () => Navigator.pop(context),
),
),
child: SafeArea(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Container( child: Container(
decoration: AppStyle.boxDecoration1, padding: const EdgeInsets.all(16.0),
child: Padding( decoration: BoxDecoration(
padding: const EdgeInsets.all(8.0), borderRadius: BorderRadius.circular(12.0),
child: Text( border: Border.all(
'If you need any help or have question this is right site to do that and your welcome' color: CupertinoColors.systemGrey2,
.tr,
style: AppStyle.title,
), ),
), ),
child: Text(
'If you need any help or have questions, this is the right place to do that. You are welcome!'
.tr,
style: CupertinoTheme.of(context).textTheme.textStyle,
textAlign: TextAlign.center,
),
), ),
), ),
Card( Card(
elevation: 3, elevation: 3,
color: AppColor.secondaryColor, color: CupertinoColors.systemGrey6,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0),
),
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(16.0),
child: GetBuilder<HelpController>( child: GetBuilder<HelpController>(
builder: (helpController) => Form( builder: (helpController) => Form(
key: helpController.formKey, key: helpController.formKey,
child: Column( child: Column(
children: [ children: [
SizedBox( CupertinoTextField(
width: Get.width * .8, controller: helpController.helpQuestionController,
child: TextFormField( placeholder: 'Enter your Question here'.tr,
controller: decoration: BoxDecoration(
helpController.helpQuestionController, borderRadius: BorderRadius.circular(12),
decoration: InputDecoration( border: Border.all(
border: const OutlineInputBorder(), color: CupertinoColors.systemGrey,
hintText: 'Enter your Question here'.tr,
labelText: 'Question'.tr,
), ),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your Question.'.tr;
}
return null;
},
), ),
padding: const EdgeInsets.all(16),
clearButtonMode: OverlayVisibilityMode.editing,
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
helpController.isLoading helpController.isLoading
? const MyCircularProgressIndicator() ? const CupertinoActivityIndicator()
: MyElevatedButton( : CupertinoButton.filled(
onPressed: () { onPressed: () {
if (helpController.formKey.currentState! if (helpController.formKey.currentState!
.validate()) { .validate()) {
@@ -76,91 +82,88 @@ class HelpCaptain extends StatelessWidget {
.reset(); .reset();
} }
}, },
title: 'Submit Question'.tr, child: Text('Submit Question'.tr),
), ),
], ],
)),
), ),
)), ),
GetBuilder<HelpController>( ),
),
),
const SizedBox(height: 20),
Expanded(
child: GetBuilder<HelpController>(
builder: (helpController) => Padding( builder: (helpController) => Padding(
padding: const EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: Container(
height: Get.height * .45,
decoration: AppStyle.boxDecoration,
child: ListView.builder(
itemCount:
helpController.helpQuestionDate['message'] != null
? helpController
.helpQuestionDate['message'].length
: 0,
itemBuilder: (BuildContext context, int index) {
// if (helpController.helpQuestionDate['message'] ==
// null) {
// return const CircularProgressIndicator();
// }
var list = helpController
.helpQuestionDate['message'][index];
return helpController
.helpQuestionDate['message'].length ==
0
? SizedBox()
: Padding(
padding: const EdgeInsets.all(3),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
color: AppColor.greenColor, color: CupertinoColors.systemGrey2,
width: 3, ),
borderRadius: BorderRadius.circular(12.0),
),
child: ListView.builder(
itemCount: helpController.helpQuestionDate['message'] !=
null
? helpController.helpQuestionDate['message'].length
: 0,
itemBuilder: (BuildContext context, int index) {
var list =
helpController.helpQuestionDate['message'][index];
return Padding(
padding: const EdgeInsets.all(3),
child: Container(
padding: const EdgeInsets.symmetric(
vertical: 12, horizontal: 16),
decoration: BoxDecoration(
border: Border.all(
color: CupertinoColors.activeGreen,
width: 2,
),
borderRadius: BorderRadius.circular(12),
), ),
borderRadius:
BorderRadius.circular(11)),
// elevation: 3,
// color: AppColor.greenColor,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
helpController.getIndex( helpController.getIndex(
list['id'], list['helpQuestion']); list['id'], list['helpQuestion']);
helpController.getHelpRepley( helpController
list['id'].toString()); .getHelpRepley(list['id'].toString());
Get.to( Get.to(() => const HelpDetailsReplayPage());
() => const HelpDetailsReplayPage(),
);
}, },
child: Padding(
padding: const EdgeInsets.all(2),
child: Row( child: Row(
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.spaceBetween, MainAxisAlignment.spaceBetween,
children: [ children: [
SizedBox( Expanded(
width: Get.width * .6,
child: Text( child: Text(
list['helpQuestion'], list['helpQuestion'],
style: AppStyle.title, style: CupertinoTheme.of(context)
.textTheme
.textStyle,
overflow: TextOverflow.ellipsis,
), ),
), ),
SizedBox( Text(
width: Get.width * .3,
child: Text(
list['datecreated'], list['datecreated'],
style: AppStyle.subtitle, style: CupertinoTheme.of(context)
), .textTheme
.tabLabelTextStyle,
), ),
], ],
), ),
), ),
), ),
),
); );
}, },
), ),
), ),
)), ),
], ),
), ),
], ],
isleading: true, ),
),
),
); );
} }
} }

View File

@@ -67,7 +67,7 @@ class HomeCaptain extends StatelessWidget {
// ), // ),
], ],
), ),
drawer: DrawerCaptain(), drawer: CupertinoDrawerCaptain(),
body: Stack( body: Stack(
children: [ children: [
GetBuilder<HomeCaptainController>( GetBuilder<HomeCaptainController>(

View File

@@ -1,4 +1,5 @@
import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/controller/firebase/local_notification.dart';
import 'package:SEFER/main.dart'; import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/captin/cards/egypt_card_a_i.dart'; import 'package:SEFER/views/auth/captin/cards/egypt_card_a_i.dart';
import 'package:SEFER/views/auth/captin/cards/sms_signup.dart'; import 'package:SEFER/views/auth/captin/cards/sms_signup.dart';
@@ -219,13 +220,14 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
// 'Order'.tr, // 'Order'.tr,
// 'from: ', // 'from: ',
// // jsonDecode(value)['message'].toString(), // // jsonDecode(value)['message'].toString(),
// // 'd3JaCCFAQeu8QTxRnlC1sB:APA91bFuRjbVK32obIFYXFTI4iwsZEPrrgwvPouob2bXivID-W4aXz51J_OIJ2nHpNU2ocOvGLD1Ip65rLViAFx5qHVE-c8FabBwBi5fSQ-lDTQfe36xxKsc9DU-sTyj_FoYrrMnLNVi', // 'dUEVBJDPQfKiMuGgDjdyfX:APA91bE3DKYAYs3LIxGmzy55-ojLAZWv0ym4a9Zy9UxdkyRUOgQP8bf1WwU9LJAof0DjfaIxciVYPnue7EdwhujzQe67SImfOF9yI1YgGsKLDH6yo6FsFaAYpsbrSCqlaoRp14lLqymi',
// 'dN7B10MgQKOR13R5wnBqTN:APA91bHAlcfrOhxXdMYB8akJeeJzQ4lxfx7UhOpP0dcjGtRdKXSD9x6jiEoz6ULnQK5Hc030_VRUAV6Q8qGj-RmlbLAm4wppc4gv_Ri4oEbHHwONP5c41-341YkVqsFYTCRaHz7VpUoj',
// d, // d,
// 'order.wav'); // 'order.wav');
// try {} catch (e) { // // NotificationController()
// print('Error showing overlay: $e'); // // .showNotification('VIP Order'.tr, '', 'order', '');
// } // // try {} catch (e) {
// // print('Error showing overlay: $e');
// // }
// // final Bubble _bubble = Bubble(showCloseButton: true); // // final Bubble _bubble = Bubble(showCloseButton: true);
// // try { // // try {
// // await _bubble.startBubbleHead(sendAppToBackground: false); // // await _bubble.startBubbleHead(sendAppToBackground: false);
@@ -254,7 +256,7 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
// ); // );
// }), // }),
// ), // ),
// // AnimatedContainer( // AnimatedContainer(
// duration: const Duration(microseconds: 200), // duration: const Duration(microseconds: 200),
// width: controller.widthMapTypeAndTraffic, // width: controller.widthMapTypeAndTraffic,
// decoration: BoxDecoration( // decoration: BoxDecoration(
@@ -264,16 +266,16 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
// child: Builder(builder: (context) { // child: Builder(builder: (context) {
// return IconButton( // return IconButton(
// onPressed: () async { // onPressed: () async {
// // FirebaseMessagesController().sendNotificationToAnyWithoutData( // FirebaseMessagesController().sendNotificationToAnyWithoutData(
// // 'Order'.tr, // 'Order'.tr,
// // 'from: ', // 'from: ',
// // // jsonDecode(value)['message'].toString(), // // jsonDecode(value)['message'].toString(),
// // 'dEugS-JOT4Ka5riF4s5TEN:APA91bEDL_W7BuEQGbyL-RMaKiMWDlURXhFuaybe5WurTUV8K5eIooSGe22yY22_U2hEZcfPr46ig1v--l00dbOGiivazxvmTyhUyQQW6lJsuIN-wordGtBxtREyeYtEKvxIa1J4ApEu', // 'dEugS-JOT4Ka5riF4s5TEN:APA91bEDL_W7BuEQGbyL-RMaKiMWDlURXhFuaybe5WurTUV8K5eIooSGe22yY22_U2hEZcfPr46ig1v--l00dbOGiivazxvmTyhUyQQW6lJsuIN-wordGtBxtREyeYtEKvxIa1J4ApEu',
// // 'order.wav' // 'order.wav'
// // // polylineCoordinates.toString() // // polylineCoordinates.toString()
// // ); // );
// Get.to(SmsSignupEgypt()); // // Get.to(SmsSignupEgypt());
// // print(AppLink.addDriverPaymentPoints); // // print(AppLink.addDriverPaymentPoints);
// }, // },
// icon: const Icon( // icon: const Icon(

View File

@@ -7,6 +7,7 @@ import 'package:SEFER/controller/notification/ride_available_controller.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:SEFER/views/widgets/elevated_btn.dart';
import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:SEFER/views/widgets/my_scafold.dart';
import 'package:SEFER/views/widgets/mycircular.dart'; import 'package:SEFER/views/widgets/mycircular.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -119,20 +120,26 @@ class AvailableRidesPage extends StatelessWidget {
// .then((value) { // .then((value) {
// var json = jsonDecode(res); // var json = jsonDecode(res);
if (res == "failure") { if (res == "failure") {
Get.defaultDialog( MyDialog().getDialog(
title:
"This ride is already taken by another driver." "This ride is already taken by another driver."
.tr, .tr,
middleText: '', '', () {
titleStyle: AppStyle.title,
middleTextStyle: AppStyle.title,
confirm: MyElevatedButton(
title: 'Ok'.tr,
onPressed: () {
Get.back(); Get.back();
});
// Get.defaultDialog(
// title:
// "This ride is already taken by another driver."
// .tr,
// middleText: '',
// titleStyle: AppStyle.title,
// middleTextStyle: AppStyle.title,
// confirm: MyElevatedButton(
// title: 'Ok'.tr,
// onPressed: () {
// Get.back(); // Get.back();
// Get.back(); // // Get.back();
})); // // Get.back();
// }));
} else if (jsonDecode(res)['status'] == } else if (jsonDecode(res)['status'] ==
"success") { "success") {
List<String> bodyToPassenger = [ List<String> bodyToPassenger = [

View File

@@ -1,77 +1,88 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:SEFER/constant/style.dart';
import 'package:SEFER/controller/notification/notification_captain_controller.dart'; import 'package:SEFER/controller/notification/notification_captain_controller.dart';
import 'package:SEFER/views/widgets/elevated_btn.dart'; import 'package:flutter/cupertino.dart';
import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:get/get.dart';
import 'package:SEFER/views/widgets/mycircular.dart';
class NotificationCaptain extends StatelessWidget { class NotificationCaptain extends StatelessWidget {
const NotificationCaptain({super.key}); const NotificationCaptain({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Get.put(NotificationCaptainController()); Get.put(NotificationCaptainController());
return MyScafolld( return CupertinoPageScaffold(
title: 'Notifications'.tr, navigationBar: CupertinoNavigationBar(
body: [ middle: Text('Notifications'.tr),
GetBuilder<NotificationCaptainController>( leading: CupertinoNavigationBarBackButton(
onPressed: () => Get.back(),
),
),
child: SafeArea(
child: GetBuilder<NotificationCaptainController>(
builder: (notificationCaptainController) => builder: (notificationCaptainController) =>
notificationCaptainController.isLoading notificationCaptainController.isLoading
? const MyCircularProgressIndicator() ? const Center(child: CupertinoActivityIndicator())
: SafeArea( : ListView.builder(
child: ListView.builder(
itemCount: notificationCaptainController itemCount: notificationCaptainController
.notificationData['message'].length, .notificationData['message'].length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
if (notificationCaptainController if (notificationCaptainController
.notificationData['message'] == .notificationData['message'] ==
"No notification data found") { "No notification data found") {
Get.defaultDialog(); _showCupertinoDialog(context, 'No Notifications',
'There are no notifications at this time.');
return const SizedBox.shrink();
} }
var res = notificationCaptainController var res = notificationCaptainController
.notificationData['message'][index]; .notificationData['message'][index];
return Card( return CupertinoListTile(
elevation: 4, leading: const Icon(CupertinoIcons.bell_fill),
child: ListTile(
onTap: () {
Get.defaultDialog(
title: res['title'],
titleStyle: AppStyle.title.copyWith(
fontWeight: FontWeight.bold),
content: SizedBox(
width: Get.width * .8,
height: Get.height * .4,
child: Text(
res['body'],
style: AppStyle.subtitle,
),
),
confirm: MyElevatedButton(
title: 'Ok',
onPressed: () {
//todo sql readen
notificationCaptainController
.updateNotification(res['id']);
}));
},
leading:
const Icon(Icons.notification_important),
title: Text( title: Text(
res['title'], res['title'],
style: AppStyle.title, style:
CupertinoTheme.of(context).textTheme.textStyle,
), ),
subtitle: Text( subtitle: Text(
res['body'], res['body'],
style: AppStyle.subtitle, 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(),
),
], ],
isleading: true, ),
); );
} }
} }