Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,4 @@ dependencies {

flutter {
source = "../.."
}
}
2 changes: 1 addition & 1 deletion android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ subprojects {

tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}
}
35 changes: 35 additions & 0 deletions lib/app/config/di/di.config.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/app/config/di/di.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ final getIt = GetIt.instance;
preferRelativeImports: true, // default
asExtension: true, // default
)
void configureDependencies() => getIt.init();
Future<void> configureDependencies() async => getIt.init();
12 changes: 12 additions & 0 deletions lib/app/core/network/firebase_module.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:injectable/injectable.dart';
import 'package:firebase_auth/firebase_auth.dart';

@module
abstract class FirebaseModule {
@lazySingleton
FirebaseFirestore get firestore => FirebaseFirestore.instance;

@lazySingleton
FirebaseAuth get auth => FirebaseAuth.instance;
}
12 changes: 11 additions & 1 deletion lib/app/core/router/app_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ import 'package:tracking_app/features/auth/presentation/reset_password/pages/res
import 'package:tracking_app/features/auth/presentation/verify_reset/manger/cubit/verify_reset_cubit.dart';
import 'package:tracking_app/features/auth/presentation/verify_reset/pages/verify_reset_page.dart';
import 'package:tracking_app/features/profile/presentation/pages/profile_page.dart';

import 'package:tracking_app/features/track_order/presentation/manager/cubit/track_order_cubit.dart';
import 'package:tracking_app/features/track_order/presentation/pages/track_order_page.dart';

final GoRouter appRouter = GoRouter(
initialLocation: RouteNames.onboarding,
Expand Down Expand Up @@ -75,7 +76,16 @@ final GoRouter appRouter = GoRouter(
path: RouteNames.profile,
builder: (context, state) => const ProfilePage(),
),

GoRoute(
path: RouteNames.trackOrder,
builder: (context, state) => BlocProvider(
create: (_) => getIt<TrackOrderCubit>(),
child: TrackOrderPage(),
),
),
],

redirect: (context, state) async {
final token = await getIt<AuthStorage>().getToken();
final rememberMe = await getIt<AuthStorage>().getRememberMe();
Expand Down
1 change: 1 addition & 0 deletions lib/app/core/router/route_names.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ abstract class RouteNames {
static const changePassword = '/changePassword';
static const applyScreen = '/applyScreen';
static const onboarding = '/onboarding';
static const trackOrder = '/trackOrder';
}
16 changes: 15 additions & 1 deletion lib/features/app_sections/presentation/pages/home_page_test.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,25 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:tracking_app/app/core/router/route_names.dart';
import 'package:tracking_app/app/core/ui_helper/color/colors.dart';

class HomePageTest extends StatelessWidget {
const HomePageTest({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(backgroundColor: AppColors.green);
return Scaffold(
backgroundColor: AppColors.green,
body: Column(
children: [
ElevatedButton(
onPressed: () {
context.go(RouteNames.trackOrder);
},
child: const Text("Track Order"),
),
],
),
);
}
}
11 changes: 10 additions & 1 deletion lib/features/profile/presentation/pages/profile_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ class ProfilePage extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Scaffold(body: Center(child: const Text("Welcome to Profile Page")));
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, RouteNames.trackOrder);
},
child: const Text("Track Order"),
),
),
);
}
}
69 changes: 69 additions & 0 deletions lib/features/track_order/api/track_order_remote_source_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import 'package:injectable/injectable.dart';
import 'package:tracking_app/app/core/network/api_result.dart';
import 'package:tracking_app/features/track_order/data/datasource/track_order_remote_source.dart';
import 'package:tracking_app/features/track_order/data/models/driver_model.dart';
import 'package:tracking_app/features/track_order/data/models/track_order_model.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

@Injectable(as: TrackOrderRemoteDataSource)
class TrackOrderRemoteDataSourceImpl implements TrackOrderRemoteDataSource {
final FirebaseFirestore firestore;

TrackOrderRemoteDataSourceImpl(this.firestore);
@override
ApiResult<Stream<List<TrackOrderModel>>> trackOrder(String userId) {
try {
final stream = firestore
.collection('orders')
.where(
Filter.or(
Filter('userAddress.user_id', isEqualTo: userId),
Filter('driver_id', isEqualTo: userId),
),
)
.snapshots()
.map((snapshot) {
return snapshot.docs
.map((doc) => TrackOrderModel.fromFirestore(doc.id, doc.data()))
.toList();
});
return SuccessApiResult<Stream<List<TrackOrderModel>>>(data: stream);
} catch (e) {
return ErrorApiResult<Stream<List<TrackOrderModel>>>(error: e.toString());
}
}

@override
ApiResult<Stream<DriverModel>> trackDriver(String driverId) {
try {
final stream = firestore
.collection('drivers')
.doc(driverId)
.snapshots()
.map((snapshot) {
final data = snapshot.data();
if (data == null) throw Exception("Driver not found");
return DriverModel.fromFirestore(snapshot.id, data);
});
return SuccessApiResult<Stream<DriverModel>>(data: stream);
} catch (e) {
return ErrorApiResult<Stream<DriverModel>>(error: e.toString());
}
}

@override
Future<DocumentSnapshot<Map<String, dynamic>>> updateOrderStatus(
String orderId,
String status,
) async {
try {
await firestore.collection('orders').doc(orderId).update({
'status': status,
});

return await firestore.collection('orders').doc(orderId).get();
} catch (e) {
rethrow; // Let upper layer handle it
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:tracking_app/app/core/network/api_result.dart';
import 'package:tracking_app/features/track_order/data/models/driver_model.dart';
import 'package:tracking_app/features/track_order/data/models/track_order_model.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

abstract class TrackOrderRemoteDataSource {
ApiResult<Stream<List<TrackOrderModel>>> trackOrder(String userId);
ApiResult<Stream<DriverModel>> trackDriver(String driverId);
Future<DocumentSnapshot<Map<String, dynamic>>> updateOrderStatus(String orderId, String status);
}
22 changes: 22 additions & 0 deletions lib/features/track_order/data/models/driver_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class DriverModel {
final String id;
final double lat;
final double lng;

DriverModel({
required this.id,
required this.lat,
required this.lng,
});


factory DriverModel.fromFirestore(String id, Map<String, dynamic> data) {
return DriverModel(

id: id,
lat: (data['lat'] as num).toDouble(),
lng: (data['lng'] as num).toDouble(),
);
}

}
50 changes: 50 additions & 0 deletions lib/features/track_order/data/models/track_order_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
class TrackOrderModel {
final String driverId;
final String id;
final String status;
final String totalPrice;
final String userId;

TrackOrderModel({
required this.driverId,
required this.id,
required this.status,
required this.totalPrice,
required this.userId,
});

factory TrackOrderModel.fromFirestore(String id, Map<String, dynamic> data) {
String safeString(dynamic value) {
if (value == null) return '';
if (value is String) return value;
return value.toString();
}

dynamic userAddress = data['userAddress'];
String parsedUserId = '';
if (userAddress is Map) {
parsedUserId = safeString(userAddress['user_id']);
} else {
parsedUserId = safeString(data['userId']);
}

dynamic orderDt = data['oder_dt'];
String parsedStatus = '';
String parsedTotal = '';
if (orderDt is Map) {
parsedStatus = safeString(orderDt['status']);
parsedTotal = safeString(orderDt['totalPrice']);
} else {
parsedStatus = safeString(data['status']);
parsedTotal = safeString(data['totalPrice']);
}

return TrackOrderModel(
id: id,
driverId: safeString(data['driver_id'] ?? data['driverId']),
status: parsedStatus,
totalPrice: parsedTotal,
userId: parsedUserId,
);
}
}
Loading
Loading