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
3 changes: 3 additions & 0 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
plugins {
id("com.android.application")
// START: FlutterFire Configuration
id("com.google.gms.google-services")
// END: FlutterFire Configuration
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
Expand Down
48 changes: 48 additions & 0 deletions android/app/google-services.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"project_info": {
"project_number": "795578737478",
"project_id": "fir-app-distribution-33bfe",
"storage_bucket": "fir-app-distribution-33bfe.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:795578737478:android:c344d0b351e151d0e1bb47",
"android_client_info": {
"package_name": "com.example.elevate_ecommerce_app"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyC_PztdFpXnsft2wNBj_3DfkQELDcY4cgQ"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:795578737478:android:0f68939309ee7dc5e1bb47",
"android_client_info": {
"package_name": "com.example.elevate_tracking_app"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyC_PztdFpXnsft2wNBj_3DfkQELDcY4cgQ"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}
7 changes: 7 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:label="elevate_tracking_app"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyBfllIi2NsKaYQJ5ZDWQTWE0dHTy0O67vU" />
<activity
android:name=".MainActivity"
android:exported="true"
Expand Down
3 changes: 3 additions & 0 deletions android/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ pluginManagement {
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.9.1" apply false
// START: FlutterFire Configuration
id("com.google.gms.google-services") version("4.3.15") apply false
// END: FlutterFire Configuration
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
}

Expand Down
Binary file added assets/icons/markerIcon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/motorcycle_delivery.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions firebase.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"flutter":{"platforms":{"android":{"default":{"projectId":"fir-app-distribution-33bfe","appId":"1:795578737478:android:0f68939309ee7dc5e1bb47","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"fir-app-distribution-33bfe","configurations":{"android":"1:795578737478:android:0f68939309ee7dc5e1bb47","ios":"1:795578737478:ios:2f40aa26a69314d5e1bb47"}}}}}}
14 changes: 13 additions & 1 deletion lib/api/client/api_client.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import 'package:dio/dio.dart';
import 'package:elevate_tracking_app/api/models/requests/login_request.dart';
import 'package:elevate_tracking_app/api/models/responses/login_response.dart';
import 'package:elevate_tracking_app/api/models/responses/orders/driver_orders_response.dart';
import 'package:elevate_tracking_app/api/models/responses/orders/start_order_response.dart';
import 'package:injectable/injectable.dart';
import 'package:retrofit/retrofit.dart';

import '../../core/constants/end_points.dart';
import '../models/responses/orders/orders_response.dart';

part 'api_client.g.dart';

Expand All @@ -16,4 +19,13 @@ abstract class ApiClient {

@POST(EndPoints.login)
Future<LoginResponse> login(@Body() LoginRequest loginRequest);
}

@GET(EndPoints.orders)
Future<OrdersResponse> getOrders(@Query("page") int? page);

@GET(EndPoints.driverOrders)
Future<DriverOrdersResponse> getDriverOrders();

@PUT("${EndPoints.startOrder}/{orderId}")
Future<StartOrderResponse> startOrder(@Path("orderId") String orderId);
}
8 changes: 8 additions & 0 deletions lib/api/client/firebase_module.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:injectable/injectable.dart';

@module
abstract class FirebaseModule {
@lazySingleton
FirebaseFirestore get firestore => FirebaseFirestore.instance;
}
78 changes: 78 additions & 0 deletions lib/api/data_source/orders_remote_data_source_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:elevate_tracking_app/api/client/api_client.dart';
import 'package:elevate_tracking_app/api/mapper/orders_mapper.dart';
import 'package:elevate_tracking_app/core/api_result/api_result.dart';
import 'package:elevate_tracking_app/core/api_result/safe_api_call.dart';
import 'package:elevate_tracking_app/domain/entites/order_firestore_entity.dart';
import 'package:elevate_tracking_app/domain/entites/start_order_entity.dart';
import 'package:injectable/injectable.dart';

import '../../data/data_source/orders_remote_data_source.dart';
import '../../domain/entites/pending_orders_entity.dart';

@Injectable(as: OrdersRemoteDataSource)
class OrdersRemoteDataSourceImpl implements OrdersRemoteDataSource {
final ApiClient _apiClient;
final FirebaseFirestore _firestore;

OrdersRemoteDataSourceImpl(this._apiClient, this._firestore);

@override
Future<ApiResult<PendingOrdersEntity>> getOrders(int? page) {
return safeApiCall(
() => _apiClient.getOrders(page),
(response) => response.toEntity(),
);
}

@override
Future<ApiResult<StartOrderEntity>> startOrder(String orderId) async {
return safeApiCall(() => _apiClient.startOrder(orderId), (response) {
return response.orders!.toEntity();
});
}

@override
Future<ApiResult<bool>> addFirestoreOrder(OrderFirestoreEntity order) async {
try {
final collection = _firestore.collection('orders');
await collection
.doc(order.order?.id ?? "")
.set(order.toMap(), SetOptions(merge: true));
return ApiSuccessResult(true);
} catch (e) {
return ApiErrorResult(e);
}
}

@override
Future<ApiResult<OrderFirestoreEntity>> getFirestoreOrder(
String orderId,
) async {
try {
final doc = await _firestore.collection('orders').doc(orderId).get();
if (doc.exists) {
return ApiSuccessResult(OrderFirestoreEntity.fromMap(doc.data()!));
} else {
return ApiErrorResult("Document does not exist");
}
} catch (e) {
return ApiErrorResult(e);
}
}

@override
Stream<ApiResult<OrderFirestoreEntity>> streamFirestoreOrder(String orderId) async* {
try {
await for (final doc in _firestore.collection('orders').doc(orderId).snapshots()) {
if (doc.exists) {
yield ApiSuccessResult(OrderFirestoreEntity.fromMap(doc.data()!));
} else {
yield ApiErrorResult("Document does not exist");
}
}
} catch (e) {
yield ApiErrorResult(e.toString());
}
}
}
183 changes: 183 additions & 0 deletions lib/api/mapper/orders_mapper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
import 'package:elevate_tracking_app/api/models/driver_order_dto.dart';
import 'package:elevate_tracking_app/domain/entites/driver_order_entity.dart';

import '../../domain/entites/meta_data_entity.dart';
import '../../domain/entites/order_entity.dart';
import '../../domain/entites/order_item_entity.dart';
import '../../domain/entites/pending_orders_entity.dart';
import '../../domain/entites/product_entity.dart';
import '../../domain/entites/shipping_address_entity.dart';
import '../../domain/entites/start_order_entity.dart';
import '../../domain/entites/start_order_items_entity.dart';
import '../../domain/entites/store_entity.dart';
import '../../domain/entites/user_entity.dart';
import '../models/meta_data_dto.dart';
import '../models/order_dto.dart';
import '../models/order_item_dto.dart';
import '../models/product_dto.dart';
import '../models/responses/orders/orders_response.dart';
import '../models/shipping_address_dto.dart';
import '../models/start_order_dto.dart';
import '../models/start_order_items_dto.dart';
import '../models/store_dto.dart';
import '../models/user_dto.dart';

extension DriverOrderMapper on DriverOrderDTO {
DriverOrderEntity toEntity() {
return DriverOrderEntity(
id: id,
driver: driver,
order: order?.toEntity(),
v: v,
createdAt: createdAt,
updatedAt: updatedAt,
store: store?.toEntity(),
);
}
}

extension OrderMapper on OrderDTO {
OrderEntity toEntity() {
return OrderEntity(
id: id,
user: user?.toEntity(),
orderItems: orderItems?.map((dto) => dto.toEntity()).toList(),
totalPrice: totalPrice,
shippingAddress: shippingAddress?.toEntity(),
paymentType: paymentType,
isPaid: isPaid,
isDelivered: isDelivered,
state: state,
createdAt: createdAt,
updatedAt: updatedAt,
orderNumber: orderNumber,
v: v,
store: store?.toEntity(),
);
}
}

extension OrderItemMapper on OrderItemDTO {
OrderItemEntity toEntity() {
return OrderItemEntity(
product: product?.toEntity(),
price: price,
quantity: quantity,
id: id,
);
}
}

extension ProductMapper on ProductDTO {
ProductEntity toEntity() {
return ProductEntity(
id: id,
title: title,
slug: slug,
description: description,
imgCover: imgCover,
images: images,
price: price,
priceAfterDiscount: priceAfterDiscount,
quantity: quantity,
category: category,
occasion: occasion,
createdAt: createdAt,
updatedAt: updatedAt,
v: v,
isSuperAdmin: isSuperAdmin,
sold: sold,
rateAvg: rateAvg,
rateCount: rateCount,
);
}
}

extension StoreMapper on StoreDTO {
StoreEntity toEntity() {
return StoreEntity(
name: name,
image: image,
address: address,
phoneNumber: phoneNumber,
latLong: latLong,
);
}
}

extension UserMapper on UserDTO {
UserEntity toEntity() {
return UserEntity(
id: id,
firstName: firstName,
lastName: lastName,
email: email,
gender: gender,
phone: phone,
photo: photo,
passwordChangedAt: passwordChangedAt,
);
}
}

extension StartOrderMapper on StartOrderDto {
StartOrderEntity toEntity() {
return StartOrderEntity(
id: id,
user: user,
orderItems: orderItems?.map((dto) => dto.toEntity()).toList(),
totalPrice: totalPrice,
paymentType: paymentType,
isPaid: isPaid,
isDelivered: isDelivered,
state: state,
createdAt: createdAt,
updatedAt: updatedAt,
orderNumber: orderNumber,
v: v,
);
}
}

extension StartOrderItemsMapper on StartOrderItemsDto {
StartOrderItemsEntity toEntity() {
return StartOrderItemsEntity(
product: product,
price: price,
quantity: quantity,
id: id,
);
}
}

extension ShippingAddressMapper on ShippingAddressDTO {
ShippingAddressEntity toEntity() {
return ShippingAddressEntity(
street: street,
city: city,
phone: phone,
lat: lat,
long: long,
);
}
}

extension MetaDataMapper on MetaDataDTO {
MetaDataEntity toEntity() {
return MetaDataEntity(
currentPage: currentPage,
totalPages: totalPages,
totalItems: totalItems,
limit: limit,
);
}
}

extension OrderResponseMapper on OrdersResponse {
PendingOrdersEntity toEntity() {
return PendingOrdersEntity(
metadata: metadata?.toEntity(),
orders: orders?.map((dto) => dto.toEntity()).toList(),
);
}
}
Loading
Loading