summaryrefslogtreecommitdiff
path: root/mobile/lib
diff options
context:
space:
mode:
authoromagdy7 <omar.professional8777@gmail.com>2023-12-23 01:39:59 +0200
committeromagdy7 <omar.professional8777@gmail.com>2023-12-23 01:39:59 +0200
commitfbaae8f461ff085356670d41506cd92180227beb (patch)
treea7a6b9c83f22961c1b4e5cea02841a2f58f81116 /mobile/lib
parent776f680ca58d066e24284b009eb9a28ced03a6ea (diff)
downloadcarpool-fbaae8f461ff085356670d41506cd92180227beb.tar.xz
carpool-fbaae8f461ff085356670d41506cd92180227beb.zip
Final version
Diffstat (limited to 'mobile/lib')
-rw-r--r--mobile/lib/cart.dart46
-rw-r--r--mobile/lib/drawer.dart122
-rw-r--r--mobile/lib/login.dart6
-rw-r--r--mobile/lib/main.dart90
-rw-r--r--mobile/lib/order_history.dart59
-rw-r--r--mobile/lib/payement_order.dart159
-rw-r--r--mobile/lib/ride_request.dart122
-rw-r--r--mobile/lib/routes.dart131
-rw-r--r--mobile/lib/signup.dart81
9 files changed, 592 insertions, 224 deletions
diff --git a/mobile/lib/cart.dart b/mobile/lib/cart.dart
index 109e407..7464bb4 100644
--- a/mobile/lib/cart.dart
+++ b/mobile/lib/cart.dart
@@ -1,3 +1,5 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
// Define a Ride class to represent the selected ride
@@ -5,13 +7,23 @@ class Ride {
final String name;
final String startLocation;
final String endLocation;
- final String time;
+ final String carBrand;
+ final String carModel;
+ final String carColor;
+ final String plateNumber;
+ final String status;
+ final DateTime orderTime;
Ride({
required this.name,
required this.startLocation,
required this.endLocation,
- required this.time,
+ required this.carBrand,
+ required this.carModel,
+ required this.carColor,
+ required this.plateNumber,
+ required this.status,
+ required this.orderTime,
});
}
@@ -70,7 +82,7 @@ class CartPage extends StatelessWidget {
children: [
const Icon(Icons.access_time, color: Colors.blue),
const SizedBox(width: 4),
- Text(selectedRide.time),
+ // Text(selectedRide.orderTime.toString()),
],
),
],
@@ -78,9 +90,31 @@ class CartPage extends StatelessWidget {
),
const SizedBox(height: 20),
ElevatedButton(
- onPressed: () {
- // Implement payment or confirmation logic here
- // For now, just print a message
+ onPressed: () async {
+ FirebaseFirestore firestore = FirebaseFirestore.instance;
+ User? user = FirebaseAuth.instance.currentUser;
+
+ if (user != null) {
+ String userId = user.uid;
+ CollectionReference collection =
+ firestore.collection('RideRequest');
+
+ Map<String, dynamic> data = {
+ 'dropOff': selectedRide.endLocation,
+ 'pickUp': selectedRide.startLocation,
+ 'status': "Pending",
+ 'cost': "50",
+ 'passengerID': userId,
+ };
+
+ try {
+ await collection.add(data);
+ print('Document added successfully!');
+ } catch (e) {
+ print('Error adding document: $e');
+ }
+ }
+
print('Processing Requesting Ride');
},
child: const Text('Request Ride'),
diff --git a/mobile/lib/drawer.dart b/mobile/lib/drawer.dart
new file mode 100644
index 0000000..34022f6
--- /dev/null
+++ b/mobile/lib/drawer.dart
@@ -0,0 +1,122 @@
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:flutter/material.dart';
+
+class CustomDrawer extends StatelessWidget {
+ const CustomDrawer({Key? key}) : super(key: key);
+
+ Widget _buildDrawerItem({
+ required IconData icon,
+ required String text,
+ required VoidCallback onTap,
+ }) {
+ return ListTile(
+ leading: Icon(icon),
+ title: Text(text),
+ onTap: onTap,
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Drawer(
+ child: ListView(
+ padding: EdgeInsets.zero,
+ children: <Widget>[
+ const DrawerHeader(
+ decoration: BoxDecoration(
+ color: Colors.blue,
+ ),
+ child: Text(
+ 'Menu',
+ style: TextStyle(
+ color: Colors.white,
+ fontSize: 24,
+ ),
+ ),
+ ),
+ _buildDrawerItem(
+ icon: Icons.app_registration_rounded,
+ text: 'Signup',
+ onTap: () {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/signup');
+ },
+ ),
+ _buildDrawerItem(
+ icon: Icons.login,
+ text: 'Login',
+ onTap: () {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/login');
+ },
+ ),
+ _buildDrawerItem(
+ icon: Icons.map,
+ text: 'Routes',
+ onTap: () {
+ User? user = FirebaseAuth.instance.currentUser;
+ if (user != null) {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/routes');
+ } else {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/login');
+ }
+ },
+ ),
+ _buildDrawerItem(
+ icon: Icons.shopping_cart,
+ text: 'Cart',
+ onTap: () {
+ User? user = FirebaseAuth.instance.currentUser;
+ if (user != null) {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/cart');
+ } else {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/login');
+ }
+ },
+ ),
+ _buildDrawerItem(
+ icon: Icons.history,
+ text: 'Order History',
+ onTap: () {
+ User? user = FirebaseAuth.instance.currentUser;
+ if (user != null) {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/order_history');
+ } else {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/login');
+ }
+ },
+ ),
+ _buildDrawerItem(
+ icon: Icons.payment,
+ text: 'Payment & Order Tracking',
+ onTap: () {
+ User? user = FirebaseAuth.instance.currentUser;
+ if (user != null) {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/payment');
+ } else {
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/login');
+ }
+ },
+ ),
+ _buildDrawerItem(
+ icon: Icons.logout,
+ text: 'Logout',
+ onTap: () {
+ FirebaseAuth.instance.signOut();
+ Navigator.pop(context);
+ Navigator.pushNamed(context, '/login');
+ },
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/mobile/lib/login.dart b/mobile/lib/login.dart
index b210650..7eadcf4 100644
--- a/mobile/lib/login.dart
+++ b/mobile/lib/login.dart
@@ -1,3 +1,4 @@
+import 'package:carpool/drawer.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:firebase_auth/firebase_auth.dart';
@@ -23,6 +24,8 @@ class _LoginPageState extends State<LoginPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
+ appBar: AppBar(title: const Text('Login')),
+ drawer: CustomDrawer(),
backgroundColor: Colors.grey[300],
body: Form(
key: _formKey,
@@ -118,7 +121,7 @@ class _LoginPageState extends State<LoginPage> {
password: _controllerPassword.text.trim())
.then((value) =>
Navigator.pushNamedAndRemoveUntil(
- context, '/', (route) => false));
+ context, '/routes', (route) => false));
} on FirebaseAuthException catch (e) {
Fluttertoast.showToast(
msg: e.message.toString(),
@@ -156,6 +159,7 @@ class _LoginPageState extends State<LoginPage> {
_focusNodePassword.dispose();
_controllerUsername.dispose();
_controllerPassword.dispose();
+ _controllerPassword.dispose();
super.dispose();
}
}
diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart
index 5fd2374..f40a6ca 100644
--- a/mobile/lib/main.dart
+++ b/mobile/lib/main.dart
@@ -1,9 +1,11 @@
+import 'package:carpool/drawer.dart';
+import 'package:carpool/ride_request.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'firebase_options.dart';
import 'routes.dart';
import 'login.dart';
-import 'cart.dart';
+// import 'cart.dart';
import 'payement_order.dart';
import 'signup.dart';
import 'order_history.dart';
@@ -30,13 +32,17 @@ class MyApp extends StatelessWidget {
'/routes': (context) => RoutesPage(),
'/order_history': (context) => OrderHistoryPage(),
'/payment': (context) => PaymentOrderTrackingPage(),
- '/cart': (context) => CartPage(
- selectedRide: Ride(
- name: 'Sample Ride',
- startLocation: 'Sample Start',
- endLocation: 'Sample End',
- time: 'Sample Time',
- )),
+ '/request_ride': (context) => RequestRidePage(
+ selectedRide: Ride(
+ name: "",
+ startLocation: "",
+ endLocation: "",
+ carModel: "",
+ carBrand: "",
+ carColor: "",
+ plateNumber: "",
+ status: "",
+ orderTime: DateTime.now())),
},
);
}
@@ -49,73 +55,7 @@ class HomePage extends StatelessWidget {
appBar: AppBar(
title: const Text('Home'),
),
- drawer: Drawer(
- child: ListView(
- padding: EdgeInsets.zero,
- children: <Widget>[
- const DrawerHeader(
- decoration: BoxDecoration(
- color: Colors.blue,
- ),
- child: Text(
- 'Menu',
- style: TextStyle(
- color: Colors.white,
- fontSize: 24,
- ),
- ),
- ),
- _buildDrawerItem(
- icon: Icons.app_registration_rounded,
- text: 'Signup',
- onTap: () {
- Navigator.pop(context);
- Navigator.pushNamed(context, '/signup');
- },
- ),
- _buildDrawerItem(
- icon: Icons.login,
- text: 'Login',
- onTap: () {
- Navigator.pop(context);
- Navigator.pushNamed(context, '/login');
- },
- ),
- _buildDrawerItem(
- icon: Icons.map,
- text: 'Routes',
- onTap: () {
- Navigator.pop(context);
- Navigator.pushNamed(context, '/routes');
- },
- ),
- _buildDrawerItem(
- icon: Icons.shopping_cart,
- text: 'Cart',
- onTap: () {
- Navigator.pop(context);
- Navigator.pushNamed(context, '/cart');
- },
- ),
- _buildDrawerItem(
- icon: Icons.history,
- text: 'Order History',
- onTap: () {
- Navigator.pop(context);
- Navigator.pushNamed(context, '/order_history');
- },
- ),
- _buildDrawerItem(
- icon: Icons.payment,
- text: 'Payment & Order Tracking',
- onTap: () {
- Navigator.pop(context);
- Navigator.pushNamed(context, '/payment');
- },
- ),
- ],
- ),
- ),
+ drawer: CustomDrawer(),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
diff --git a/mobile/lib/order_history.dart b/mobile/lib/order_history.dart
index 543a5ec..ef9b1d5 100644
--- a/mobile/lib/order_history.dart
+++ b/mobile/lib/order_history.dart
@@ -25,66 +25,12 @@ class OrderHistoryPage extends StatelessWidget {
final List<RideOrder> orders = [
RideOrder(
orderID: '001',
- driverName: 'John Doe',
+ driverName: 'Omar Magdy',
carModel: 'Toyota Corolla',
carColor: Colors.black,
plateNumber: 'ABC-123',
status: 'Completed',
- orderTime: DateTime.now().subtract(const Duration(days: 5)),
- ),
- RideOrder(
- orderID: '002',
- driverName: 'Alice Smith',
- carModel: 'Honda Civic',
- carColor: Colors.blue,
- plateNumber: 'XYZ-789',
- status: 'Cancelled',
- orderTime: DateTime.now().subtract(const Duration(days: 2)),
- ),
- RideOrder(
- orderID: '004',
- driverName: 'Emily Johnson',
- carModel: 'Chevrolet Malibu',
- carColor: Colors.green,
- plateNumber: 'GHI-789',
- status: 'Completed',
- orderTime: DateTime.now().subtract(const Duration(days: 7)),
- ),
- RideOrder(
- orderID: '005',
- driverName: 'David Wilson',
- carModel: 'Tesla Model 3',
- carColor: Colors.grey,
- plateNumber: 'JKL-012',
- status: 'Pending',
- orderTime: DateTime.now().subtract(const Duration(days: 2)),
- ),
- RideOrder(
- orderID: '006',
- driverName: 'Sophia Brown',
- carModel: 'BMW X5',
- carColor: Colors.black,
- plateNumber: 'MNO-345',
- status: 'Cancelled',
- orderTime: DateTime.now().subtract(const Duration(days: 4)),
- ),
- RideOrder(
- orderID: '007',
- driverName: 'James Davis',
- carModel: 'Audi A4',
- carColor: Colors.blueGrey,
- plateNumber: 'PQR-678',
- status: 'pending',
- orderTime: DateTime.now().subtract(const Duration(days: 6)),
- ),
- RideOrder(
- orderID: '008',
- driverName: 'Olivia Martinez',
- carModel: 'Hyundai Elantra',
- carColor: Colors.orange,
- plateNumber: 'STU-901',
- status: 'Completed',
- orderTime: DateTime.now().subtract(const Duration(days: 9)),
+ orderTime: DateTime.now(),
),
];
@@ -96,7 +42,6 @@ class OrderHistoryPage extends StatelessWidget {
return Colors.orange;
case 'cancelled':
return Colors.red;
- // Add more cases for other statuses
default:
return Colors.grey;
}
diff --git a/mobile/lib/payement_order.dart b/mobile/lib/payement_order.dart
index eac05ec..19fa357 100644
--- a/mobile/lib/payement_order.dart
+++ b/mobile/lib/payement_order.dart
@@ -1,81 +1,122 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
+import 'package:firebase_auth/firebase_auth.dart';
import 'credit_card_payment.dart';
class Order {
- final String orderID;
- final String rideName;
+ final String pickUp;
+ final String dropOff;
final String status;
final double amount;
- Order(
- {required this.orderID,
- required this.rideName,
- required this.status,
- required this.amount});
+ Order({
+ required this.pickUp,
+ required this.dropOff,
+ required this.status,
+ required this.amount,
+ });
}
class PaymentOrderTrackingPage extends StatelessWidget {
- final List<Order> orders = [
- Order(
- orderID: '001',
- rideName: 'Morning Ride - Gate 3 to Abdu-Basha',
- status: 'Completed',
- amount: 15.0),
- Order(
- orderID: '002',
- rideName: 'Afternoon Ride - Abdu-Basha to Gate 3',
- status: 'Pending',
- amount: 12.5),
- ];
+ final FirebaseFirestore _firestore = FirebaseFirestore.instance;
+ final FirebaseAuth _auth = FirebaseAuth.instance;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
- title: Text('Payment & Order Tracking'),
+ title: const Text('Payment & Order Tracking'),
),
- body: ListView.builder(
- itemCount: orders.length,
- itemBuilder: (BuildContext context, int index) {
- final Order order = orders[index];
- return GestureDetector(
- onTap: () {
- Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) =>
- CreditCardDetailsPage(orderID: order.orderID),
- ),
- );
- },
- child: Card(
- elevation: 3,
- margin: EdgeInsets.symmetric(vertical: 8, horizontal: 16),
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(12),
- ),
- child: ListTile(
- title: Text(
- 'Order ID: ${order.orderID}',
- style: TextStyle(
- fontWeight: FontWeight.bold,
+ body: FutureBuilder<List<Order>>(
+ future: _fetchOrders(),
+ builder: (context, snapshot) {
+ if (snapshot.connectionState == ConnectionState.waiting) {
+ return Center(child: CircularProgressIndicator());
+ } else if (snapshot.hasError) {
+ return Center(child: Text('Error: ${snapshot.error}'));
+ } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
+ return Center(child: Text('No orders found.'));
+ } else {
+ return ListView.builder(
+ itemCount: snapshot.data!.length,
+ itemBuilder: (BuildContext context, int index) {
+ final Order order = snapshot.data![index];
+ return GestureDetector(
+ onTap: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) =>
+ CreditCardDetailsPage(orderID: "13251231254"),
+ ),
+ );
+ },
+ child: Card(
+ elevation: 3,
+ margin: const EdgeInsets.symmetric(
+ vertical: 8,
+ horizontal: 16,
+ ),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(12),
+ ),
+ child: ListTile(
+ subtitle: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Ride: ${order.pickUp} - ${order.dropOff}',
+ style: const TextStyle(color: Colors.black),
+ ),
+ Text(
+ 'Status: ${order.status}',
+ style: const TextStyle(color: Colors.black),
+ ),
+ Text(
+ 'Amount: \$${order.amount.toStringAsFixed(2)}',
+ style: const TextStyle(color: Colors.black),
+ ),
+ ],
+ ),
+ leading: const Icon(Icons.payment),
+ ),
),
- ),
- subtitle: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text('Ride: ${order.rideName}'),
- Text('Status: ${order.status}'),
- Text('Amount: \$${order.amount.toStringAsFixed(2)}'),
- ],
- ),
- leading: Icon(Icons
- .payment), // TODO Use an appropriate icon for payment/order tracking
- ),
- ),
- );
+ );
+ },
+ );
+ }
},
),
);
}
+
+ Future<List<Order>> _fetchOrders() async {
+ final currentUser = _auth.currentUser;
+ if (currentUser != null) {
+ final passengerID = currentUser.uid;
+
+ QuerySnapshot rideRequests = await _firestore
+ .collection('RideRequest')
+ .where('passengerID', isEqualTo: passengerID)
+ .get();
+
+ List<Order> orders = [];
+ rideRequests.docs.forEach((doc) {
+ String pickUp = doc['pickUp'];
+ String dropOff = doc['dropOff'];
+ String status = doc['status'];
+
+ Order order = Order(
+ pickUp: pickUp,
+ dropOff: dropOff,
+ status: status,
+ amount: 50,
+ );
+ orders.add(order);
+ });
+ return orders;
+ } else {
+ return [];
+ }
+ }
}
diff --git a/mobile/lib/ride_request.dart b/mobile/lib/ride_request.dart
new file mode 100644
index 0000000..454134f
--- /dev/null
+++ b/mobile/lib/ride_request.dart
@@ -0,0 +1,122 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:flutter/material.dart';
+
+// Define a Ride class to represent the selected ride
+class Ride {
+ final String name;
+ final String startLocation;
+ final String endLocation;
+ final String carBrand;
+ final String carModel;
+ final String carColor;
+ final String plateNumber;
+ final String status;
+ final DateTime orderTime;
+
+ Ride({
+ required this.name,
+ required this.startLocation,
+ required this.endLocation,
+ required this.carBrand,
+ required this.carModel,
+ required this.carColor,
+ required this.plateNumber,
+ required this.status,
+ required this.orderTime,
+ });
+}
+
+class RequestRidePage extends StatelessWidget {
+ final Ride selectedRide;
+
+ RequestRidePage({required this.selectedRide});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Ride Request'),
+ ),
+ body: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Card(
+ elevation: 5,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(12),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: <Widget>[
+ const Text(
+ 'Selected Ride:',
+ style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
+ ),
+ const SizedBox(height: 12),
+ ListTile(
+ leading: const Icon(Icons.directions_car, color: Colors.blue),
+ title: Text(selectedRide.name),
+ subtitle: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 8),
+ Row(
+ children: [
+ const Icon(Icons.location_on, color: Colors.blue),
+ const SizedBox(width: 4),
+ Text(selectedRide.startLocation),
+ ],
+ ),
+ const SizedBox(height: 4),
+ Row(
+ children: [
+ const Icon(Icons.arrow_forward, color: Colors.blue),
+ const SizedBox(width: 4),
+ Text(selectedRide.endLocation),
+ ],
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(height: 20),
+ ElevatedButton(
+ onPressed: () async {
+ FirebaseFirestore firestore = FirebaseFirestore.instance;
+ User? user = FirebaseAuth.instance.currentUser;
+
+ if (user != null) {
+ String userId = user.uid;
+ print("UserId: ${userId}");
+ CollectionReference collection =
+ firestore.collection('RideRequest');
+
+ Map<String, dynamic> data = {
+ 'dropOff': selectedRide.endLocation,
+ 'pickUp': selectedRide.startLocation,
+ 'status': "Pending",
+ 'passengerID': userId,
+ };
+
+ try {
+ // Add a new document with an automatically generated ID
+ await collection.add(data);
+ print('Document added successfully!');
+ } catch (e) {
+ print('Error adding document: $e');
+ }
+ }
+
+ print('Processing Requesting Ride');
+ },
+ child: const Text('Request Ride'),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/mobile/lib/routes.dart b/mobile/lib/routes.dart
index 5073271..88fb9fb 100644
--- a/mobile/lib/routes.dart
+++ b/mobile/lib/routes.dart
@@ -1,6 +1,7 @@
+import 'package:carpool/drawer.dart';
+import 'package:carpool/ride_request.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
-import 'cart.dart';
import 'package:intl/intl.dart';
// Accessing Firestore instance
@@ -10,11 +11,51 @@ class Route {
final String name;
final String startLocation;
final String endLocation;
+ final String carBrand;
+ final String carModel;
+ final String carColor;
+ final String plateNumber;
+ final String status;
+ final DateTime orderTime;
- Route(
- {required this.name,
- required this.startLocation,
- required this.endLocation});
+ Route({
+ required this.name,
+ required this.startLocation,
+ required this.endLocation,
+ required this.carBrand,
+ required this.carModel,
+ required this.carColor,
+ required this.plateNumber,
+ required this.status,
+ required this.orderTime,
+ });
+}
+
+Color getColorFromString(String color) {
+ switch (color.toLowerCase()) {
+ case 'red':
+ return Colors.red;
+ case 'blue':
+ return Colors.blue;
+ case 'green':
+ return Colors.green;
+ case 'yellow':
+ return Colors.yellow;
+ case 'orange':
+ return Colors.orange;
+ case 'purple':
+ return Colors.purple;
+ case 'pink':
+ return Colors.pink;
+ case 'cyan':
+ return Colors.cyan;
+ case 'silver':
+ return Colors.grey;
+ // You can add more cases for additional colors as needed
+ default:
+ // Return a default color if the input doesn't match any specified colors
+ return Colors.black;
+ }
}
Future<List<Route>> getDataFromFirestore() async {
@@ -24,17 +65,29 @@ Future<List<Route>> getDataFromFirestore() async {
QuerySnapshot querySnapshot = await firestore.collection('Rides').get();
// Loop through the documents in the collection
- querySnapshot.docs.forEach((doc) {
+ querySnapshot.docs
+ .where((element) => element['status'] == 'Unreserved')
+ .forEach((doc) {
String name = doc['driverName'];
- // String carModel = doc['carModel'];
- // String carColor = doc['carColor'];
- // String plateNumber = doc['plateNumber'];
- // String status = doc['status'];
- // DateTime orderTime = doc['orderTime'];
String fromLocation = doc['fromLocation'];
String toLocation = doc['toLocation'];
+ String carModel = doc['carModel'];
+ String carBrand = doc['carBrand'];
+ String carColor = doc['carColor'];
+ String plateNumber = doc['plateNumber'];
+ String status = doc['status'];
+ Timestamp orderTime = doc['orderTime'];
routes.add(Route(
- name: name, startLocation: fromLocation, endLocation: toLocation));
+ name: name,
+ startLocation: fromLocation,
+ endLocation: toLocation,
+ carModel: carModel,
+ carBrand: carBrand,
+ carColor: carColor,
+ plateNumber: plateNumber,
+ status: status,
+ orderTime: orderTime.toDate(),
+ ));
});
} catch (e) {
print('Error retrieving data: $e');
@@ -43,7 +96,10 @@ Future<List<Route>> getDataFromFirestore() async {
}
class RoutesPage extends StatefulWidget {
+ const RoutesPage({super.key});
+
@override
+ // ignore: library_private_types_in_public_api
_RoutesPageState createState() => _RoutesPageState();
}
@@ -67,6 +123,7 @@ class _RoutesPageState extends State<RoutesPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Routes')),
+ drawer: const CustomDrawer(),
body: ListView.builder(
itemCount: routes.length,
itemBuilder: (BuildContext context, int index) {
@@ -74,18 +131,21 @@ class _RoutesPageState extends State<RoutesPage> {
return GestureDetector(
onTap: () {
DateTime now = DateTime.now();
- String formattedDateTime =
- DateFormat('EEEE dd/MM/yyyy hh:mm a').format(now);
Ride selectedRide = Ride(
- name: route.name,
- startLocation: route.startLocation,
- endLocation: route.endLocation,
- time: formattedDateTime,
- );
+ name: route.name,
+ startLocation: route.startLocation,
+ endLocation: route.endLocation,
+ carModel: route.carModel,
+ carBrand: route.carBrand,
+ carColor: route.carColor,
+ plateNumber: route.plateNumber,
+ status: route.status,
+ orderTime: route.orderTime);
Navigator.push(
context,
MaterialPageRoute(
- builder: (context) => CartPage(selectedRide: selectedRide),
+ builder: (context) =>
+ RequestRidePage(selectedRide: selectedRide),
),
);
},
@@ -120,6 +180,37 @@ class _RoutesPageState extends State<RoutesPage> {
Flexible(child: Text(route.endLocation)),
],
),
+ Row(
+ children: [
+ Icon(Icons.directions_car,
+ color: getColorFromString(route.carColor)),
+ const SizedBox(width: 4),
+ Text('${route.carBrand} - ${route.carModel}'),
+ ],
+ ),
+ Row(
+ children: [
+ const Icon(Icons.confirmation_number,
+ color: Colors.blue),
+ const SizedBox(width: 4),
+ Text('Plate: ${route.plateNumber}'),
+ ],
+ ),
+ Row(
+ children: [
+ const Icon(Icons.info, color: Colors.blue),
+ const SizedBox(width: 4),
+ Text('Status: ${route.status}'),
+ ],
+ ),
+ Row(
+ children: [
+ const Icon(Icons.schedule, color: Colors.blue),
+ const SizedBox(width: 4),
+ Text(DateFormat('EEEE dd/MM/yyyy hh:mm a')
+ .format(route.orderTime)),
+ ],
+ ),
],
),
leading: const Icon(Icons.directions_car),
diff --git a/mobile/lib/signup.dart b/mobile/lib/signup.dart
index 18a27ad..0650711 100644
--- a/mobile/lib/signup.dart
+++ b/mobile/lib/signup.dart
@@ -1,3 +1,5 @@
+import 'package:carpool/drawer.dart';
+import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:fluttertoast/fluttertoast.dart';
@@ -18,6 +20,8 @@ class _SignUpPageState extends State<SignUpPage> {
final FocusNode _focusNodeConfirmPassword = FocusNode();
final TextEditingController _controllerUsername = TextEditingController();
final TextEditingController _controllerPassword = TextEditingController();
+ final TextEditingController _controllerName = TextEditingController();
+ final TextEditingController _controllerPhoneNumber = TextEditingController();
final TextEditingController _corfirmPassword = TextEditingController();
bool _obscurePassword = true;
@@ -25,6 +29,8 @@ class _SignUpPageState extends State<SignUpPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
+ appBar: AppBar(title: const Text('Sign Up')),
+ drawer: CustomDrawer(),