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.
minSdk = 23
targetSdk = flutter.targetSdkVersion
versionCode = 88
versionName = '1.5.88`'
versionCode = 90
versionName = '1.5.90`'
multiDexEnabled =true
}

View File

@@ -54,6 +54,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.yalantis.ucrop.UCropActivity"
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):
- Flutter
- FlutterMacOS
- SDWebImage (5.19.4):
- SDWebImage/Core (= 5.19.4)
- SDWebImage/Core (5.19.4)
- SDWebImage (5.19.7):
- SDWebImage/Core (= 5.19.7)
- SDWebImage/Core (5.19.7)
- SDWebImageWebPCoder (0.14.6):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.17)
@@ -484,7 +484,7 @@ SPEC CHECKSUMS:
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21
record_darwin: df0a677188e5fed18472550298e675f19ddaffbe
SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
share: 0b2c3e82132f5888bccca3351c504d0003b3b410
sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440

View File

@@ -33,7 +33,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>57</string>
<string>58</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -48,7 +48,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>4.0.57</string>
<string>4.0.58</string>
<key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>
<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
}
}
// 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 {
// final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
// FlutterLocalNotificationsPlugin();
// @override
// void onInit() {
// super.onInit();
// initNotifications();
// tz.initializeTimeZones();
// }
// // Initializes the local notifications plugin
// Future<void> initNotifications() async {
// const AndroidInitializationSettings android =
@@ -212,29 +201,4 @@ class NotificationController extends GetxController {
// NotificationDetails details = NotificationDetails(android: android);
// 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
Map<String, Map<String, String>> get keys => {
"ar": {
'If you need any help or have questions, this is the right place to do that. You are welcome!':
'إذا كنت بحاجة إلى أي مساعدة أو لديك أي أسئلة، فهذا هو المكان المناسب لذلك. أهلاً وسهلاً بك!',
'ID Mismatch': "عدم تطابق الرقم التعريفي",
"face detect": "كشف الوجه",
'An error occurred while saving driver data':

View File

@@ -41,7 +41,7 @@ class NotificationCaptainController extends GetxController {
updateNotification(String id) async {
await CRUD().post(
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 '../../constant/links.dart';
import '../../views/widgets/mydialoug.dart';
import '../functions/crud.dart';
class RideAvailableController extends GetxController {
@@ -18,16 +19,20 @@ class RideAvailableController extends GetxController {
isLoading = false;
update();
} else {
Get.defaultDialog(
title: "No Rides Available".tr,
middleText: '',
titleStyle: AppStyle.title,
confirm: MyElevatedButton(
title: 'Ok'.tr,
onPressed: () {
MyDialog().getDialog("No Rides Available".tr, '', () {
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();
await WakelockPlus.enable();
await GetStorage.init();
Stripe.publishableKey = AK.publishableKeyStripe;
// Request location permission
// PermissionStatus status = await Permission.location.request();
// if (status.isDenied) {
@@ -120,9 +122,6 @@ void main() async {
await LocationController().startLocationUpdates();
}
await GetStorage.init();
Stripe.publishableKey = AK.publishableKeyStripe;
if (Platform.isAndroid || Platform.isIOS) {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,

View File

@@ -25,7 +25,7 @@ class SmsSignupEgypt extends StatelessWidget {
Padding(
padding: const EdgeInsets.only(bottom: 20.0),
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,
),
),
@@ -91,7 +91,9 @@ class SmsSignupEgypt extends StatelessWidget {
// Submit button
registerCaptainController.isLoading
? const MyCircularProgressIndicator()
: MyElevatedButton(
: Padding(
padding: const EdgeInsets.all(16.0),
child: MyElevatedButton(
onPressed: () async {
!registerCaptainController.isSent
? await registerCaptainController.sendOtpMessage()
@@ -99,6 +101,7 @@ class SmsSignupEgypt extends StatelessWidget {
},
title: 'Submit'.tr,
),
),
],
);
}),

View File

@@ -1,24 +1,29 @@
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/constant/style.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_contacts/contact.dart';
import 'package:get/get.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 {
final InviteController controller = Get.put(InviteController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Invite a Driver'.tr)),
body: Padding(
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Invite a Driver'.tr),
leading: CupertinoNavigationBarBackButton(
onPressed: () => Get.back(),
),
),
child: SafeArea(
child: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -26,21 +31,20 @@ class InviteDriverScreen extends StatelessWidget {
Text(
"Invite another driver and both get a gift after he completes 100 trips!"
.tr,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
style: CupertinoTheme.of(context).textTheme.navTitleTextStyle,
),
const SizedBox(height: 20),
Row(
children: [
Expanded(
child: MyTextForm(
child: CupertinoTextField(
controller: controller.invitePhoneController,
label: 'Enter driver\'s phone'.tr,
hint: 'Enter driver\'s phone'.tr,
type: TextInputType.phone,
placeholder: 'Enter driver\'s phone'.tr,
keyboardType: TextInputType.phone,
),
),
IconButton(
icon: const Icon(Icons.contacts),
CupertinoButton(
child: const Icon(CupertinoIcons.person_2),
onPressed: () async {
await controller.pickContacts();
if (controller.contacts.isNotEmpty) {
@@ -48,34 +52,7 @@ class InviteDriverScreen extends StatelessWidget {
controller.savePhoneToServer();
box.write(BoxName.IsSavedPhones, true);
}
Get.defaultDialog(
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())),
),
);
},
),
),
],
),
);
_showContactsDialog(context);
}
},
),
@@ -98,62 +75,69 @@ class InviteDriverScreen extends StatelessWidget {
],
),
const SizedBox(height: 20),
GetBuilder<InviteController>(builder: (controller) {
GetBuilder<InviteController>(
builder: (controller) {
return SizedBox(
height: Get.height * .4,
child: controller.driverInvitationData.isEmpty
? Center(
child: Text(
"No invitation found yet!".tr,
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
),
)
: ListView.builder(
itemCount: controller.driverInvitationData.length,
itemBuilder: (context, index) {
int countOfInvitDriver = 0;
if (controller.driverInvitationData[index]
.containsKey('countOfInvitDriver')) {
countOfInvitDriver = int.tryParse(controller
int countOfInvitDriver = int.tryParse(controller
.driverInvitationData[index]
['countOfInvitDriver']
.toString()) ??
?.toString() ??
'0') ??
0;
}
double progressValue = countOfInvitDriver / 100.0;
if (progressValue > 1.0) progressValue = 1.0;
if (progressValue < 0.0) progressValue = 0.0;
progressValue = progressValue.clamp(0.0, 1.0);
return InkWell(
return GestureDetector(
onTap: () async {
controller.onSelectDriverInvitation(index);
},
child: Container(
margin: const EdgeInsets.symmetric(vertical: 8.0),
margin:
const EdgeInsets.symmetric(vertical: 8.0),
child: Stack(
alignment: AlignmentDirectional.center,
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color:
AppColor.accentColor.withOpacity(.5),
borderRadius:
BorderRadius.circular(12),
color: CupertinoColors.systemGrey5,
),
width: Get.width * .85,
height: 35,
child: ClipRRect(
borderRadius: BorderRadius.circular(12),
borderRadius:
BorderRadius.circular(12),
child: LinearProgressIndicator(
value: progressValue,
color: AppColor.blueColor,
backgroundColor: AppColor.accentColor
.withOpacity(.3),
minHeight: 35,
backgroundColor:
CupertinoColors.systemGrey3,
valueColor:
const AlwaysStoppedAnimation<
Color>(
CupertinoColors.activeBlue),
),
),
),
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:get/get.dart';
import '../../../../constant/colors.dart';
import '../../../../constant/style.dart';
import '../../../../controller/auth/captin/history_captain.dart';
import '../../../widgets/elevated_btn.dart';
import '../../../widgets/my_scafold.dart';
import '../../../widgets/mycircular.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
class HistoryCaptain extends StatelessWidget {
const HistoryCaptain({super.key});
@@ -14,18 +12,25 @@ class HistoryCaptain extends StatelessWidget {
@override
Widget build(BuildContext context) {
Get.put(HistoryCaptainController());
return MyScafolld(
title: 'History Page'.tr,
body: [
GetBuilder<HistoryCaptainController>(
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('History Page'.tr),
leading: CupertinoNavigationBarBackButton(
onPressed: () => Get.back(),
),
),
child: SafeArea(
child: GetBuilder<HistoryCaptainController>(
builder: (historyCaptainController) => historyCaptainController
.isloading
? const MyCircularProgressIndicator()
? const Center(child: CupertinoActivityIndicator())
: historyCaptainController.historyData['message'].length < 1
? Center(
child: Text(
'No ride Yet.'.tr,
style: AppStyle.headTitle,
style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
),
)
: ListView.builder(
@@ -34,22 +39,30 @@ class HistoryCaptain extends StatelessWidget {
itemBuilder: (BuildContext context, int index) {
var list = historyCaptainController
.historyData['message'][index];
return InkWell(
onTap: () {
list['status'] != 'Cancel'
? historyCaptainController
.getHistoryDetails(list['order_id'])
: Get.defaultDialog(
title: 'This Trip Cancelled'.tr,
middleText: '',
titleStyle: AppStyle.title,
confirm: MyElevatedButton(
title: 'Ok'.tr,
onPressed: () => Get.back()));
return Padding(
padding: const EdgeInsets.all(4.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: CupertinoColors.systemGrey, width: 1),
borderRadius:
const BorderRadius.all(Radius.circular(8.0)),
),
child: CupertinoButton(
onPressed: () {
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: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.all(8),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
@@ -60,11 +73,15 @@ class HistoryCaptain extends StatelessWidget {
children: [
Text(
'OrderId'.tr,
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
),
Text(
list['order_id'],
style: AppStyle.subtitle,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
],
),
@@ -74,34 +91,51 @@ class HistoryCaptain extends StatelessWidget {
children: [
Text(
'created time'.tr,
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
),
Text(
list['created_at'],
style: AppStyle.subtitle,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
],
),
Text(
list['status'],
style: list['status'] == 'Apply'
? AppStyle.title.copyWith(
color: AppColor.greenColor)
? CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle
.copyWith(
color: CupertinoColors
.systemGreen)
: list['status'] == 'Refused'
? AppStyle.title.copyWith(
color: AppColor.redColor)
: AppStyle.title.copyWith(
color: AppColor.yellowColor),
? CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle
.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:flutter/material.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/functions/launch.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import '../../../widgets/mycircular.dart';
import 'package:flutter/cupertino.dart';
class HistoryDetailsPage extends StatelessWidget {
HistoryDetailsPage({super.key});
HistoryCaptainController historyCaptainController =
Get.put(HistoryCaptainController());
@override
Widget build(BuildContext context) {
return MyScafolld(
title: 'Trip Detail'.tr,
body: [
GetBuilder<HistoryCaptainController>(
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Trip Detail'.tr),
leading: CupertinoButton(
padding: EdgeInsets.zero,
child: const Icon(CupertinoIcons.back),
onPressed: () => Navigator.pop(context),
),
),
child: GetBuilder<HistoryCaptainController>(
builder: (historyCaptainController) {
var res = historyCaptainController.historyDetailsData['data'];
return historyCaptainController.isloading
? const MyCircularProgressIndicator()
: SingleChildScrollView(
child: Center(
? const Center(
child: CupertinoActivityIndicator(),
)
: CupertinoScrollbar(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: Get.width * .8,
decoration: BoxDecoration(
border: Border.all(
color: AppColor.blueColor, width: 2)),
child: TextButton(
const SizedBox(
height: 20,
),
CupertinoButton(
onPressed: () {
String mapUrl =
'https://www.google.com/maps/dir/${res['start_location']}/${res['end_location']}/';
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(
children: [
const SizedBox(
height: 20,
),
SizedBox(
height: Get.height * .2,
width: Get.width * .75,
height: MediaQuery.of(context).size.height *
0.3,
child: GoogleMap(
initialCameraPosition: CameraPosition(
target: Get.find<LocationController>()
.myLocation, // Assuming passenger location is available
tilt: 80, zoom: 13,
.myLocation,
tilt: 80,
zoom: 13,
),
zoomControlsEnabled: true,
// liteModeEnabled: true,
polylines: {
Polyline(
zIndex: 2,
consumeTapEvents: true,
geodesic: true,
endCap: Cap.buttCap,
startCap: Cap.buttCap,
visible: true,
polylineId: const PolylineId('route'),
points: [
LatLng(
@@ -81,26 +93,28 @@ class HistoryDetailsPage extends StatelessWidget {
.split(',')[1]),
)
],
color: AppColor.primaryColor,
color: CupertinoColors.activeGreen,
width: 5,
),
},
),
),
const SizedBox(
height: 10,
),
const SizedBox(height: 10),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
MainAxisAlignment.spaceBetween,
children: [
Text(
'${'Order ID'.tr} ${res['id']}',
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.navActionTextStyle,
),
Text(
res['date'].toString(),
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.navActionTextStyle,
),
],
),
@@ -108,97 +122,117 @@ class HistoryDetailsPage extends StatelessWidget {
),
),
),
const SizedBox(
height: 10,
),
const SizedBox(height: 20),
Container(
width: Get.width * .8,
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: AppColor.greenColor, width: 2)),
color: CupertinoColors.activeGreen, width: 2),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'${'Price is'.tr} ${res['price_for_driver']}',
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
Text(
'${'Distance is'.tr} ${res['distance']} KM',
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
],
),
),
const SizedBox(
height: 10,
),
const SizedBox(height: 20),
Text(
'Times of Trip'.tr,
style: AppStyle.title,
),
const SizedBox(
height: 10,
style: CupertinoTheme.of(context)
.textTheme
.navTitleTextStyle,
),
const SizedBox(height: 10),
Container(
width: Get.width * .8,
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: AppColor.redColor, width: 2)),
color: CupertinoColors.destructiveRed,
width: 2),
),
child: Column(
children: [
Text(
'${'Time to Passenger is'.tr} ${res['DriverIsGoingToPassenger']}',
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
Text(
'${'TimeStart is'.tr} ${res['rideTimeStart']}',
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
Text(
'${'Time Finish is'.tr} ${res['rideTimeFinish']}',
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
],
),
),
const SizedBox(
height: 10,
),
const SizedBox(height: 20),
Container(
width: Get.width * .8,
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: AppColor.greenColor, width: 2)),
color: CupertinoColors.systemGreen, width: 2),
),
child: Center(
child: Text(
'${'Passenger Name is'.tr} ${res['first_name']} ${res['last_name']}',
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
),
),
),
const SizedBox(
height: 10,
),
const SizedBox(height: 20),
Container(
width: Get.width * .8,
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: AppColor.yellowColor, width: 2)),
color: CupertinoColors.systemYellow,
width: 2),
),
child: Center(
child: Text(
'${'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/links.dart';
import 'package:SEFER/constant/style.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/invite_driver_screen.dart';
@@ -9,7 +8,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:get/get.dart';
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/constant/colors.dart';
import 'package:SEFER/main.dart';
import 'package:SEFER/views/auth/captin/logout_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/notification/notification_captain.dart';
import '../../../../constant/colors.dart';
import '../../../../controller/functions/upload_image.dart';
import '../maintain_center_page.dart';
import 'package:flutter/cupertino.dart';
class DrawerCaptain extends StatelessWidget {
ImageController imageController = Get.put(ImageController());
class CupertinoDrawerCaptain extends StatelessWidget {
final ImageController imageController = Get.put(ImageController());
@override
Widget build(BuildContext context) {
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
const UserAccountHeader(),
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Menu'.tr),
),
child: SafeArea(
child: CustomScrollView(
slivers: [
const SliverToBoxAdapter(child: const UserAccountHeader()),
SliverList(
delegate: SliverChildListDelegate([
_buildDivider(),
_buildDrawerItem(
icon: Icons.account_balance_wallet,
icon: CupertinoIcons.money_dollar,
text: 'Wallet'.tr,
onTap: () =>
Get.to(() => WalletCaptain(), transition: Transition.native),
onTap: () => Get.to(() => WalletCaptain()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.person,
icon: CupertinoIcons.person,
text: 'Profile'.tr,
onTap: () => Get.to(() => ProfileCaptain(),
transition: Transition.rightToLeftWithFade),
onTap: () => Get.to(() => ProfileCaptain()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.history,
icon: CupertinoIcons.clock,
text: 'History of Trip'.tr,
onTap: () => Get.to(() => const HistoryCaptain(),
transition: Transition.downToUp),
onTap: () => Get.to(() => const HistoryCaptain()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.phonelink_ring_rounded,
icon: CupertinoIcons.car_detailed,
text: 'Available for rides'.tr,
onTap: () => Get.to(() => const AvailableRidesPage(),
transition: Transition.rightToLeftWithFade),
onTap: () => Get.to(() => const AvailableRidesPage()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.notifications,
icon: CupertinoIcons.bell,
text: 'Notifications'.tr,
onTap: () => Get.to(() => const NotificationCaptain(),
transition: Transition.upToDown),
onTap: () => Get.to(() => const NotificationCaptain()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.help,
icon: CupertinoIcons.question_circle,
text: 'Helping Center'.tr,
onTap: () =>
Get.to(() => HelpCaptain(), transition: Transition.size),
onTap: () => Get.to(() => HelpCaptain()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.share_outlined,
icon: CupertinoIcons.share,
text: 'Share App'.tr,
onTap: () =>
Get.to(() => InviteDriverScreen(), transition: Transition.size),
onTap: () => Get.to(() => InviteDriverScreen()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.car_repair_outlined,
icon: CupertinoIcons.wrench,
text: "Maintenance Center".tr,
onTap: () =>
Get.to(() => MaintainCenterPage(), transition: Transition.size),
onTap: () => Get.to(() => MaintainCenterPage()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.contact_mail_rounded,
icon: CupertinoIcons.mail,
text: "Contact Us".tr,
onTap: () =>
Get.to(() => ContactUsPage(), transition: Transition.cupertino),
onTap: () => Get.to(() => ContactUsPage()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.settings,
icon: CupertinoIcons.settings,
text: 'Settings'.tr,
onTap: () => Get.to(() => const SettingsCaptain(),
transition: Transition.cupertino),
onTap: () => Get.to(() => const SettingsCaptain()),
),
_buildDivider(),
_buildDrawerItem(
icon: Icons.exit_to_app,
icon: CupertinoIcons.square_arrow_right,
text: 'Sign Out'.tr,
onTap: () => Get.to(() => const LogoutCaptain(),
transition: Transition.cupertinoDialog),
onTap: () => Get.to(() => const LogoutCaptain()),
),
_buildDivider(),
]),
),
],
),
),
);
}
@@ -119,19 +116,27 @@ class DrawerCaptain extends StatelessWidget {
return const Divider(
thickness: 1,
height: 1,
color: AppColor.accentColor,
color: CupertinoColors.systemGrey4,
);
}
Widget _buildDrawerItem({
required IconData icon,
required String text,
required GestureTapCallback onTap,
required VoidCallback onTap,
}) {
return ListTile(
leading: Icon(icon, color: AppColor.accentColor),
title: Text(text, style: AppStyle.title),
onTap: onTap,
return CupertinoButton(
onPressed: onTap,
child: Row(
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
Widget build(BuildContext context) {
return UserAccountsDrawerHeader(
decoration: BoxDecoration(
color: AppColor.greenColor,
return Container(
padding: const EdgeInsets.all(16),
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: AppColor.gradientStartEnd,
colors: [AppColor.blueColor, AppColor.twitterColor],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
currentAccountPictureSize: const Size.square(100),
arrowColor: AppColor.deepPurpleAccent,
accountName: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
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(
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(),
Column(
mainAxisAlignment: MainAxisAlignment.center,
const SizedBox(height: 5),
Text(
box.read(BoxName.emailDriver),
style: const TextStyle(color: CupertinoColors.white, fontSize: 14),
),
const SizedBox(height: 10),
Row(
children: [
Text(
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(
padding:
const EdgeInsets.symmetric(horizontal: 4, vertical: 1),
padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 1),
color: AppColor.greenColor,
child: RatingBar.builder(
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: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/views/home/Captin/home_captain/help_details_replay_page.dart';
import 'package:SEFER/views/widgets/my_scafold.dart';
import '../../../widgets/elevated_btn.dart';
import '../../../widgets/mycircular.dart';
import 'package:flutter/cupertino.dart';
class HelpCaptain extends StatelessWidget {
HelpCaptain({super.key});
@@ -15,57 +11,67 @@ class HelpCaptain extends StatelessWidget {
@override
Widget build(BuildContext context) {
Get.put(HelpController());
return MyScafolld(
title: 'Helping Page'.tr,
body: [
Column(
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Helping Page'.tr),
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: [
Padding(
padding: const EdgeInsets.all(8.0),
padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Container(
decoration: AppStyle.boxDecoration1,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'If you need any help or have question this is right site to do that and your welcome'
.tr,
style: AppStyle.title,
padding: const EdgeInsets.all(16.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
border: Border.all(
color: CupertinoColors.systemGrey2,
),
),
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(
elevation: 3,
color: AppColor.secondaryColor,
color: CupertinoColors.systemGrey6,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(16.0),
child: GetBuilder<HelpController>(
builder: (helpController) => Form(
key: helpController.formKey,
child: Column(
children: [
SizedBox(
width: Get.width * .8,
child: TextFormField(
controller:
helpController.helpQuestionController,
decoration: InputDecoration(
border: const OutlineInputBorder(),
hintText: 'Enter your Question here'.tr,
labelText: 'Question'.tr,
CupertinoTextField(
controller: helpController.helpQuestionController,
placeholder: 'Enter your Question here'.tr,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: CupertinoColors.systemGrey,
),
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),
helpController.isLoading
? const MyCircularProgressIndicator()
: MyElevatedButton(
? const CupertinoActivityIndicator()
: CupertinoButton.filled(
onPressed: () {
if (helpController.formKey.currentState!
.validate()) {
@@ -76,91 +82,88 @@ class HelpCaptain extends StatelessWidget {
.reset();
}
},
title: 'Submit Question'.tr,
child: Text('Submit Question'.tr),
),
],
)),
),
)),
GetBuilder<HelpController>(
),
),
),
),
const SizedBox(height: 20),
Expanded(
child: GetBuilder<HelpController>(
builder: (helpController) => Padding(
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(
decoration: BoxDecoration(
border: Border.all(
color: AppColor.greenColor,
width: 3,
color: CupertinoColors.systemGrey2,
),
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(
onTap: () {
helpController.getIndex(
list['id'], list['helpQuestion']);
helpController.getHelpRepley(
list['id'].toString());
Get.to(
() => const HelpDetailsReplayPage(),
);
helpController
.getHelpRepley(list['id'].toString());
Get.to(() => const HelpDetailsReplayPage());
},
child: Padding(
padding: const EdgeInsets.all(2),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
SizedBox(
width: Get.width * .6,
Expanded(
child: Text(
list['helpQuestion'],
style: AppStyle.title,
style: CupertinoTheme.of(context)
.textTheme
.textStyle,
overflow: TextOverflow.ellipsis,
),
),
SizedBox(
width: Get.width * .3,
child: Text(
Text(
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(
children: [
GetBuilder<HomeCaptainController>(

View File

@@ -1,4 +1,5 @@
import 'package:SEFER/constant/box_name.dart';
import 'package:SEFER/controller/firebase/local_notification.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/sms_signup.dart';
@@ -219,13 +220,14 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
// 'Order'.tr,
// 'from: ',
// // jsonDecode(value)['message'].toString(),
// // 'd3JaCCFAQeu8QTxRnlC1sB:APA91bFuRjbVK32obIFYXFTI4iwsZEPrrgwvPouob2bXivID-W4aXz51J_OIJ2nHpNU2ocOvGLD1Ip65rLViAFx5qHVE-c8FabBwBi5fSQ-lDTQfe36xxKsc9DU-sTyj_FoYrrMnLNVi',
// 'dN7B10MgQKOR13R5wnBqTN:APA91bHAlcfrOhxXdMYB8akJeeJzQ4lxfx7UhOpP0dcjGtRdKXSD9x6jiEoz6ULnQK5Hc030_VRUAV6Q8qGj-RmlbLAm4wppc4gv_Ri4oEbHHwONP5c41-341YkVqsFYTCRaHz7VpUoj',
// 'dUEVBJDPQfKiMuGgDjdyfX:APA91bE3DKYAYs3LIxGmzy55-ojLAZWv0ym4a9Zy9UxdkyRUOgQP8bf1WwU9LJAof0DjfaIxciVYPnue7EdwhujzQe67SImfOF9yI1YgGsKLDH6yo6FsFaAYpsbrSCqlaoRp14lLqymi',
// d,
// 'order.wav');
// try {} catch (e) {
// print('Error showing overlay: $e');
// }
// // NotificationController()
// // .showNotification('VIP Order'.tr, '', 'order', '');
// // try {} catch (e) {
// // print('Error showing overlay: $e');
// // }
// // final Bubble _bubble = Bubble(showCloseButton: true);
// // try {
// // await _bubble.startBubbleHead(sendAppToBackground: false);
@@ -254,7 +256,7 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
// );
// }),
// ),
// // AnimatedContainer(
// AnimatedContainer(
// duration: const Duration(microseconds: 200),
// width: controller.widthMapTypeAndTraffic,
// decoration: BoxDecoration(
@@ -264,16 +266,16 @@ GetBuilder<HomeCaptainController> leftMainMenuCaptainIcons() {
// child: Builder(builder: (context) {
// return IconButton(
// onPressed: () async {
// // FirebaseMessagesController().sendNotificationToAnyWithoutData(
// // 'Order'.tr,
// // 'from: ',
// // // jsonDecode(value)['message'].toString(),
// // 'dEugS-JOT4Ka5riF4s5TEN:APA91bEDL_W7BuEQGbyL-RMaKiMWDlURXhFuaybe5WurTUV8K5eIooSGe22yY22_U2hEZcfPr46ig1v--l00dbOGiivazxvmTyhUyQQW6lJsuIN-wordGtBxtREyeYtEKvxIa1J4ApEu',
// // 'order.wav'
// FirebaseMessagesController().sendNotificationToAnyWithoutData(
// 'Order'.tr,
// 'from: ',
// // jsonDecode(value)['message'].toString(),
// 'dEugS-JOT4Ka5riF4s5TEN:APA91bEDL_W7BuEQGbyL-RMaKiMWDlURXhFuaybe5WurTUV8K5eIooSGe22yY22_U2hEZcfPr46ig1v--l00dbOGiivazxvmTyhUyQQW6lJsuIN-wordGtBxtREyeYtEKvxIa1J4ApEu',
// 'order.wav'
// // // polylineCoordinates.toString()
// // );
// Get.to(SmsSignupEgypt());
// // polylineCoordinates.toString()
// );
// // Get.to(SmsSignupEgypt());
// // print(AppLink.addDriverPaymentPoints);
// },
// 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/my_scafold.dart';
import 'package:SEFER/views/widgets/mycircular.dart';
import 'package:SEFER/views/widgets/mydialoug.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -119,20 +120,26 @@ class AvailableRidesPage extends StatelessWidget {
// .then((value) {
// var json = jsonDecode(res);
if (res == "failure") {
Get.defaultDialog(
title:
MyDialog().getDialog(
"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.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();
// }));
} else if (jsonDecode(res)['status'] ==
"success") {
List<String> bodyToPassenger = [

View File

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