Merge branch 'master' of gitlab.com:Cloud_Solution/driver-app into delivery_confirmed
# Conflicts: # lib/pages/landing/landing_page.dartlogut
commit
5e604c4778
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 6.9 KiB |
@ -0,0 +1,87 @@
|
|||||||
|
# Uncomment this line to define a global platform for your project
|
||||||
|
# platform :ios, '9.0'
|
||||||
|
|
||||||
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
|
project 'Runner', {
|
||||||
|
'Debug' => :debug,
|
||||||
|
'Profile' => :release,
|
||||||
|
'Release' => :release,
|
||||||
|
}
|
||||||
|
|
||||||
|
def parse_KV_file(file, separator='=')
|
||||||
|
file_abs_path = File.expand_path(file)
|
||||||
|
if !File.exists? file_abs_path
|
||||||
|
return [];
|
||||||
|
end
|
||||||
|
generated_key_values = {}
|
||||||
|
skip_line_start_symbols = ["#", "/"]
|
||||||
|
File.foreach(file_abs_path) do |line|
|
||||||
|
next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
|
||||||
|
plugin = line.split(pattern=separator)
|
||||||
|
if plugin.length == 2
|
||||||
|
podname = plugin[0].strip()
|
||||||
|
path = plugin[1].strip()
|
||||||
|
podpath = File.expand_path("#{path}", file_abs_path)
|
||||||
|
generated_key_values[podname] = podpath
|
||||||
|
else
|
||||||
|
puts "Invalid plugin specification: #{line}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
generated_key_values
|
||||||
|
end
|
||||||
|
|
||||||
|
target 'Runner' do
|
||||||
|
use_frameworks!
|
||||||
|
use_modular_headers!
|
||||||
|
|
||||||
|
# Flutter Pod
|
||||||
|
|
||||||
|
copied_flutter_dir = File.join(__dir__, 'Flutter')
|
||||||
|
copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
|
||||||
|
copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
|
||||||
|
unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
|
||||||
|
# Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
|
||||||
|
# That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
|
||||||
|
# CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
|
||||||
|
|
||||||
|
generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
|
||||||
|
unless File.exist?(generated_xcode_build_settings_path)
|
||||||
|
raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
|
||||||
|
end
|
||||||
|
generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
|
||||||
|
cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
|
||||||
|
|
||||||
|
unless File.exist?(copied_framework_path)
|
||||||
|
FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
|
||||||
|
end
|
||||||
|
unless File.exist?(copied_podspec_path)
|
||||||
|
FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Keep pod path relative so it can be checked into Podfile.lock.
|
||||||
|
pod 'Flutter', :path => 'Flutter'
|
||||||
|
|
||||||
|
# Plugin Pods
|
||||||
|
|
||||||
|
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
|
||||||
|
# referring to absolute paths on developers' machines.
|
||||||
|
system('rm -rf .symlinks')
|
||||||
|
system('mkdir -p .symlinks/plugins')
|
||||||
|
plugin_pods = parse_KV_file('../.flutter-plugins')
|
||||||
|
plugin_pods.each do |name, path|
|
||||||
|
symlink = File.join('.symlinks', 'plugins', name)
|
||||||
|
File.symlink(path, symlink)
|
||||||
|
pod name, :path => File.join(symlink, 'ios')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post_install do |installer|
|
||||||
|
installer.pods_project.targets.each do |target|
|
||||||
|
target.build_configurations.each do |config|
|
||||||
|
config.build_settings['ENABLE_BITCODE'] = 'NO'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,30 @@
|
|||||||
|
/// Flutter icons DriverApp
|
||||||
|
/// Copyright (C) 2020 by original authors @ fluttericon.com, fontello.com
|
||||||
|
/// This font was generated by FlutterIcon.com, which is derived from Fontello.
|
||||||
|
///
|
||||||
|
/// To use this font, place it in your fonts/ directory and include the
|
||||||
|
/// following in your pubspec.yaml
|
||||||
|
///
|
||||||
|
/// flutter:
|
||||||
|
/// fonts:
|
||||||
|
/// - family: DriverApp
|
||||||
|
/// fonts:
|
||||||
|
/// - asset: fonts/DriverApp.ttf
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
class DriverApp {
|
||||||
|
DriverApp._();
|
||||||
|
|
||||||
|
static const _kFontFam = 'DriverApp';
|
||||||
|
static const _kFontPkg = null;
|
||||||
|
|
||||||
|
static const IconData logo = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);
|
||||||
|
static const IconData closed_box = IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);
|
||||||
|
static const IconData location = IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg);
|
||||||
|
static const IconData open_box = IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg);
|
||||||
|
static const IconData phone_call = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg);
|
||||||
|
static const IconData qr = IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg);
|
||||||
|
}
|
Binary file not shown.
@ -1,3 +1,5 @@
|
|||||||
const TOKEN = 'token';
|
const TOKEN = 'token';
|
||||||
const APP_LANGUAGE = 'language';
|
const APP_LANGUAGE = 'language';
|
||||||
|
const USER_PROFILE = 'user-profile';
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,64 @@
|
|||||||
|
class AuthenticatedUser {
|
||||||
|
int iD;
|
||||||
|
int userID;
|
||||||
|
String password;
|
||||||
|
String userName;
|
||||||
|
int roleID;
|
||||||
|
String name;
|
||||||
|
bool active;
|
||||||
|
String createdOn;
|
||||||
|
int createdBy;
|
||||||
|
Null editedOn;
|
||||||
|
Null editedBy;
|
||||||
|
String mobileNumber;
|
||||||
|
int realRoleID;
|
||||||
|
|
||||||
|
AuthenticatedUser(
|
||||||
|
{this.iD,
|
||||||
|
this.userID,
|
||||||
|
this.password,
|
||||||
|
this.userName,
|
||||||
|
this.roleID,
|
||||||
|
this.name,
|
||||||
|
this.active,
|
||||||
|
this.createdOn,
|
||||||
|
this.createdBy,
|
||||||
|
this.editedOn,
|
||||||
|
this.editedBy,
|
||||||
|
this.mobileNumber,
|
||||||
|
this.realRoleID});
|
||||||
|
|
||||||
|
AuthenticatedUser.fromJson(Map<String, dynamic> json) {
|
||||||
|
iD = json['ID'];
|
||||||
|
userID = json['UserID'];
|
||||||
|
password = json['password'];
|
||||||
|
userName = json['UserName'];
|
||||||
|
roleID = json['RoleID'];
|
||||||
|
name = json['Name'];
|
||||||
|
active = json['Active'];
|
||||||
|
createdOn = json['CreatedOn'];
|
||||||
|
createdBy = json['CreatedBy'];
|
||||||
|
editedOn = json['EditedOn'];
|
||||||
|
editedBy = json['EditedBy'];
|
||||||
|
mobileNumber = json['MobileNumber'];
|
||||||
|
realRoleID = json['RealRoleID'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['ID'] = this.iD;
|
||||||
|
data['UserID'] = this.userID;
|
||||||
|
data['password'] = this.password;
|
||||||
|
data['UserName'] = this.userName;
|
||||||
|
data['RoleID'] = this.roleID;
|
||||||
|
data['Name'] = this.name;
|
||||||
|
data['Active'] = this.active;
|
||||||
|
data['CreatedOn'] = this.createdOn;
|
||||||
|
data['CreatedBy'] = this.createdBy;
|
||||||
|
data['EditedOn'] = this.editedOn;
|
||||||
|
data['EditedBy'] = this.editedBy;
|
||||||
|
data['MobileNumber'] = this.mobileNumber;
|
||||||
|
data['RealRoleID'] = this.realRoleID;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
class LoginRequest {
|
||||||
|
int userID;
|
||||||
|
String password;
|
||||||
|
|
||||||
|
LoginRequest({this.userID, this.password});
|
||||||
|
|
||||||
|
LoginRequest.fromJson(Map<String, dynamic> json) {
|
||||||
|
userID = json['UserID'];
|
||||||
|
password = json['Password'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['UserID'] = this.userID;
|
||||||
|
data['Password'] = this.password;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
import 'dart:ffi';
|
||||||
|
|
||||||
|
class PendingOrders {
|
||||||
|
int driverID;
|
||||||
|
String searchKey;
|
||||||
|
int pageSize;
|
||||||
|
int pageIndex;
|
||||||
|
String tokenID;
|
||||||
|
String userID;
|
||||||
|
String mobileNo;
|
||||||
|
String firstName;
|
||||||
|
String lastName;
|
||||||
|
String mobileNumber;
|
||||||
|
|
||||||
|
PendingOrders(
|
||||||
|
{this.driverID,
|
||||||
|
this.searchKey,
|
||||||
|
this.pageSize,
|
||||||
|
this.pageIndex,
|
||||||
|
this.tokenID,
|
||||||
|
this.userID,
|
||||||
|
this.mobileNo,
|
||||||
|
this.firstName,
|
||||||
|
this.lastName,
|
||||||
|
this.mobileNumber});
|
||||||
|
|
||||||
|
PendingOrders.fromJson(Map<String, dynamic> json) {
|
||||||
|
driverID = json['DriverID'];
|
||||||
|
searchKey = json['SearchKey'];
|
||||||
|
pageSize = json['PageSize'];
|
||||||
|
pageIndex = json['PageIndex'];
|
||||||
|
tokenID = json['TokenID'];
|
||||||
|
userID = json['UserID'];
|
||||||
|
mobileNo = json['MobileNo'];
|
||||||
|
firstName = json['FirstName'];
|
||||||
|
lastName = json['LastName'];
|
||||||
|
mobileNumber = json['MobileNumber'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['DriverID'] = this.driverID;
|
||||||
|
data['SearchKey'] = this.searchKey;
|
||||||
|
data['PageSize'] = this.pageSize;
|
||||||
|
data['PageIndex'] = this.pageIndex;
|
||||||
|
data['TokenID'] = this.tokenID;
|
||||||
|
data['UserID'] = this.userID;
|
||||||
|
data['MobileNo'] = this.mobileNo;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
import 'package:driverapp/config/config.dart';
|
||||||
|
import 'package:driverapp/core/model/authentication/authenticated_user.dart';
|
||||||
|
import 'package:driverapp/core/model/authentication/login_request.dart';
|
||||||
|
import 'package:driverapp/core/service/base_service.dart';
|
||||||
|
|
||||||
|
class AuthenticationService extends BaseService {
|
||||||
|
String selectedClinicName;
|
||||||
|
bool isLogin = false;
|
||||||
|
bool isLoading = true;
|
||||||
|
AuthenticatedUser authenticatedUser;
|
||||||
|
String token;
|
||||||
|
|
||||||
|
AuthenticationService() {
|
||||||
|
// getUserAuthentication();
|
||||||
|
}
|
||||||
|
|
||||||
|
login(LoginRequest loginRequest) async {
|
||||||
|
hasError = false;
|
||||||
|
try {
|
||||||
|
await baseAppClient.post(LOGIN,
|
||||||
|
onSuccess: (dynamic response, int statusCode) {
|
||||||
|
authenticatedUser =
|
||||||
|
AuthenticatedUser.fromJson(response['PatientER_DriverFile']);
|
||||||
|
token = response['LogInTokenID'];
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
hasError = true;
|
||||||
|
super.error = error;
|
||||||
|
}, body: loginRequest.toJson());
|
||||||
|
} catch (error) {
|
||||||
|
hasError = true;
|
||||||
|
super.error = error;
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,26 @@
|
|||||||
|
import 'package:driverapp/config/shared_pref_kay.dart';
|
||||||
|
import 'package:driverapp/core/model/authentication/authenticated_user.dart';
|
||||||
|
import 'package:driverapp/uitl/app_shared_preferences.dart';
|
||||||
|
|
||||||
import 'client/base_app_client.dart';
|
import 'client/base_app_client.dart';
|
||||||
|
|
||||||
class BaseService{
|
class BaseService {
|
||||||
String error;
|
String error;
|
||||||
bool hasError = false;
|
bool hasError = false;
|
||||||
BaseAppClient baseAppClient = BaseAppClient();
|
BaseAppClient baseAppClient = BaseAppClient();
|
||||||
|
AuthenticatedUser user;
|
||||||
|
|
||||||
|
AppSharedPreferences sharedPref = AppSharedPreferences();
|
||||||
|
|
||||||
|
BaseService() {
|
||||||
|
getUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
getUser() async {
|
||||||
|
var userProfile = await sharedPref.getObject(USER_PROFILE);
|
||||||
|
if (userProfile != null) {
|
||||||
|
user =
|
||||||
|
AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
import 'package:driverapp/config/config.dart';
|
||||||
|
import 'package:driverapp/core/model/pending_orders/pending_orders_model.dart';
|
||||||
|
import 'package:driverapp/core/service/base_service.dart';
|
||||||
|
|
||||||
|
class PendingOrdersService extends BaseService {
|
||||||
|
List<PendingOrders> _orders = List();
|
||||||
|
List<PendingOrders> get orders => _orders;
|
||||||
|
|
||||||
|
PendingOrders _requestGetPendingOrders = PendingOrders(
|
||||||
|
driverID: 1111,
|
||||||
|
searchKey: "",
|
||||||
|
pageSize: 0,
|
||||||
|
pageIndex: 0,
|
||||||
|
tokenID: "@dm!n",
|
||||||
|
userID: "1111",
|
||||||
|
mobileNo: "0541710575",
|
||||||
|
);
|
||||||
|
|
||||||
|
Future getPendingOrders() async {
|
||||||
|
await baseAppClient.post(GET_ALL_ORDERS,
|
||||||
|
onSuccess: (dynamic response, int statusCode) {
|
||||||
|
_orders.clear();
|
||||||
|
response['PatientER_Delivery_GetAllOrderList'].forEach((order) {
|
||||||
|
_orders.add(PendingOrders.fromJson(order));
|
||||||
|
});
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
hasError = true;
|
||||||
|
super.error = error;
|
||||||
|
}, body: _requestGetPendingOrders.toJson());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
import 'package:driverapp/config/shared_pref_kay.dart';
|
||||||
|
import 'package:driverapp/core/enum/viewstate.dart';
|
||||||
|
import 'package:driverapp/core/model/authentication/login_request.dart';
|
||||||
|
import 'package:driverapp/core/service/authentication_service.dart';
|
||||||
|
import 'package:driverapp/core/service/client/base_app_client.dart';
|
||||||
|
import 'package:driverapp/core/viewModels/base_view_model.dart';
|
||||||
|
|
||||||
|
import '../../locator.dart';
|
||||||
|
|
||||||
|
enum APP_STATUS { LOADING, UNAUTHENTICATED, AUTHENTICATED }
|
||||||
|
|
||||||
|
class AuthenticationViewModel extends BaseViewModel {
|
||||||
|
AuthenticationService _authenticationService = locator<AuthenticationService>();
|
||||||
|
|
||||||
|
APP_STATUS get status {
|
||||||
|
if (state == ViewState.Busy || state == ViewState.BusyLocal) {
|
||||||
|
return APP_STATUS.LOADING;
|
||||||
|
} else {
|
||||||
|
if ( user != null) {
|
||||||
|
return APP_STATUS.AUTHENTICATED;
|
||||||
|
} else {
|
||||||
|
return APP_STATUS.UNAUTHENTICATED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
login(LoginRequest loginRequest) async {
|
||||||
|
setState(ViewState.BusyLocal);
|
||||||
|
await _authenticationService.login(loginRequest);
|
||||||
|
if (_authenticationService.hasError) {
|
||||||
|
error = _authenticationService.error;
|
||||||
|
setState(ViewState.ErrorLocal);
|
||||||
|
} else {
|
||||||
|
sharedPref.setObject(
|
||||||
|
USER_PROFILE, _authenticationService.authenticatedUser);
|
||||||
|
sharedPref.setString(TOKEN, _authenticationService.token);
|
||||||
|
setState(ViewState.Idle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import 'package:driverapp/core/enum/viewstate.dart';
|
||||||
|
import 'package:driverapp/core/service/pending_orders_service.dart';
|
||||||
|
import 'package:driverapp/core/model/pending_orders/pending_orders_model.dart';
|
||||||
|
import '../../locator.dart';
|
||||||
|
import 'base_view_model.dart';
|
||||||
|
|
||||||
|
class PendingOrdersViewModel extends BaseViewModel {
|
||||||
|
PendingOrdersService _pendingOrdersService = locator<PendingOrdersService>();
|
||||||
|
|
||||||
|
List<PendingOrders> get orders => _pendingOrdersService.orders;
|
||||||
|
|
||||||
|
Future getPendingOrders() async {
|
||||||
|
setState(ViewState.Busy);
|
||||||
|
await _pendingOrdersService.getPendingOrders();
|
||||||
|
if (_pendingOrdersService.hasError) {
|
||||||
|
error = _pendingOrdersService.error;
|
||||||
|
setState(ViewState.Error);
|
||||||
|
} else
|
||||||
|
setState(ViewState.Idle);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,264 @@
|
|||||||
|
import 'package:driverapp/app-icons/driver_app_icons.dart';
|
||||||
|
import 'package:driverapp/core/enum/viewstate.dart';
|
||||||
|
import 'package:driverapp/core/model/authentication/login_request.dart';
|
||||||
|
import 'package:driverapp/core/viewModels/authentication_view_model.dart';
|
||||||
|
import 'package:driverapp/core/viewModels/project_view_model.dart';
|
||||||
|
import 'package:driverapp/pages/base/base_view.dart';
|
||||||
|
import 'package:driverapp/pages/dashboard/dashboard_screen.dart';
|
||||||
|
import 'package:driverapp/pages/landing/landing_page.dart';
|
||||||
|
import 'package:driverapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:driverapp/uitl/utils.dart';
|
||||||
|
import 'package:driverapp/widgets/buttons/secondary_button.dart';
|
||||||
|
import 'package:driverapp/widgets/data_display/circle-container.dart';
|
||||||
|
import 'package:driverapp/widgets/input/text_field.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/rendering.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class LoginPage extends StatelessWidget {
|
||||||
|
LoginRequest loginRequest = LoginRequest();
|
||||||
|
final loginFormKey = GlobalKey<FormState>();
|
||||||
|
ProjectViewModel projectViewModel;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
projectViewModel = Provider.of(context);
|
||||||
|
return AnimatedSwitcher(
|
||||||
|
duration: Duration(microseconds: 350),
|
||||||
|
child: BaseView<AuthenticationViewModel>(
|
||||||
|
builder: (_, model, widget) => Scaffold(
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: <Widget>[
|
||||||
|
FractionallySizedBox(
|
||||||
|
widthFactor: 0.80,
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
SizedBox(
|
||||||
|
height: 40,
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Container(
|
||||||
|
child: Icon(
|
||||||
|
DriverApp.logo,
|
||||||
|
size: 70,
|
||||||
|
color: Theme.of(context).primaryColor,
|
||||||
|
),
|
||||||
|
margin: EdgeInsets.only(
|
||||||
|
right: projectViewModel.isArabic
|
||||||
|
? 0
|
||||||
|
: MediaQuery.of(context).size.width * 0.15,
|
||||||
|
left: !projectViewModel.isArabic
|
||||||
|
? 0
|
||||||
|
: MediaQuery.of(context).size.width * 0.15),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
"Driver",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 50, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Delivery",
|
||||||
|
style: TextStyle(fontSize: 36, letterSpacing: 1),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"APP",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 33,
|
||||||
|
letterSpacing: 33,
|
||||||
|
fontWeight: FontWeight.w400),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 30,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
CircleContainer(
|
||||||
|
onTap: () => projectViewModel.changeLanguage('en'),
|
||||||
|
child: Text(
|
||||||
|
TranslationBase.of(context).lanEnglish,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
color: projectViewModel.isArabic
|
||||||
|
? Colors.black
|
||||||
|
: Colors.white),
|
||||||
|
),
|
||||||
|
color: projectViewModel.isArabic
|
||||||
|
? Colors.transparent
|
||||||
|
: Theme.of(context).primaryColor,
|
||||||
|
borderWidth: projectViewModel.isArabic ? 3 : 0,
|
||||||
|
borderColor: projectViewModel.isArabic
|
||||||
|
? Theme.of(context).primaryColor
|
||||||
|
: Colors.transparent,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 20,
|
||||||
|
),
|
||||||
|
CircleContainer(
|
||||||
|
onTap: () =>
|
||||||
|
projectViewModel.changeLanguage('ar'),
|
||||||
|
child: Text(
|
||||||
|
TranslationBase.of(context).lanArabic,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
color: !projectViewModel.isArabic
|
||||||
|
? Colors.black
|
||||||
|
: Colors.white),
|
||||||
|
),
|
||||||
|
color: !projectViewModel.isArabic
|
||||||
|
? Colors.transparent
|
||||||
|
: Theme.of(context).primaryColor,
|
||||||
|
borderWidth: !projectViewModel.isArabic ? 3 : 0,
|
||||||
|
borderColor: !projectViewModel.isArabic
|
||||||
|
? Theme.of(context).primaryColor
|
||||||
|
: Colors.transparent),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 10,
|
||||||
|
),
|
||||||
|
Form(
|
||||||
|
key: loginFormKey,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(horizontal: 20),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
TranslationBase.of(context).enterCredentialsMsg,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 13, color: Colors.grey),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 10,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 10,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
child: TextFields(
|
||||||
|
hintText: TranslationBase.of(context).enterId,
|
||||||
|
validator: (value) {
|
||||||
|
if (value.isEmpty) {
|
||||||
|
return TranslationBase.of(context)
|
||||||
|
.pleaseEnterYourID;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
onSaved: (value) {
|
||||||
|
loginRequest.userID = int.parse(value.trim());
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
child: TextFields(
|
||||||
|
borderRadiusValue: 6,
|
||||||
|
hintText:
|
||||||
|
TranslationBase.of(context).enterPassword,
|
||||||
|
validator: (value) {
|
||||||
|
if (value.isEmpty) {
|
||||||
|
return TranslationBase.of(context)
|
||||||
|
.pleaseEnterPassword;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
onSaved: (value) {
|
||||||
|
loginRequest.password = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 25,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
TranslationBase.of(context).forgotPassword,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
color: Theme.of(context).primaryColor),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 10,
|
||||||
|
),Container(
|
||||||
|
margin: EdgeInsets.all(10),
|
||||||
|
height: MediaQuery.of(context).size.height * 0.22,
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
SecondaryButton(
|
||||||
|
label: TranslationBase.of(context).login,
|
||||||
|
onTap: () {
|
||||||
|
login(model, context);
|
||||||
|
},
|
||||||
|
disabled: model.state == ViewState.BusyLocal,
|
||||||
|
loading: model.state == ViewState.BusyLocal,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 30,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
login(AuthenticationViewModel model, BuildContext context) async {
|
||||||
|
if (loginFormKey.currentState.validate()) {
|
||||||
|
loginFormKey.currentState.save();
|
||||||
|
await model.login(loginRequest);
|
||||||
|
if (model.state == ViewState.ErrorLocal) {
|
||||||
|
Utils.showErrorToast(model.error);
|
||||||
|
} else {
|
||||||
|
Navigator.push(
|
||||||
|
context, MaterialPageRoute(builder: (context) => DashboardScreen()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,395 @@
|
|||||||
|
import 'package:driverapp/config/size_config.dart';
|
||||||
|
import 'package:driverapp/core/viewModels/pending_orders_view_model.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import '../base/base_view.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:driverapp/app-icons/driver_app_icons.dart';
|
||||||
|
import 'package:driverapp/widgets/others/rounded_container.dart';
|
||||||
|
import 'package:driverapp/pages/orders/pending_orders_page.dart';
|
||||||
|
|
||||||
|
class DashboardScreen extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_DashboardScreenState createState() => _DashboardScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DashboardScreenState extends State<DashboardScreen> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BaseView<PendingOrdersViewModel>(
|
||||||
|
onModelReady: (model) => model.getPendingOrders(),
|
||||||
|
builder:
|
||||||
|
(BuildContext context, PendingOrdersViewModel model, Widget child) =>
|
||||||
|
Scaffold(
|
||||||
|
backgroundColor: Color(0xffF4F9FA),
|
||||||
|
body: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'Have a great day ,',
|
||||||
|
style: TextStyle(fontSize: 12.5),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(top: 4.5),
|
||||||
|
child: Text(
|
||||||
|
'Driver Name',
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.w400, fontSize: 25.0),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
CircleAvatar(
|
||||||
|
radius: 25.5,
|
||||||
|
backgroundColor: Color(0xff30B7B9),
|
||||||
|
child: CircleAvatar(
|
||||||
|
backgroundColor: Color(0xff30B7B9),
|
||||||
|
maxRadius: 26.0,
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/images/driver.png',
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 12.0),
|
||||||
|
child: Container(
|
||||||
|
height: MediaQuery.of(context).size.height * 0.15,
|
||||||
|
width: MediaQuery.of(context).size.width * 0.43,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(12.0),
|
||||||
|
gradient: LinearGradient(
|
||||||
|
colors: [Color(0xff17AFB8), Color(0xff49C1BC)]),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(12.0),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'You Have',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white, fontSize: 10.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'5',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white, fontSize: 25.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'Undelivered \n Packages',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white, fontSize: 10.0),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(4.0),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(right: 9.5),
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/images/closed_box.png',
|
||||||
|
height:
|
||||||
|
MediaQuery.of(context).size.height *
|
||||||
|
0.09,
|
||||||
|
width:
|
||||||
|
MediaQuery.of(context).size.width *
|
||||||
|
0.20,
|
||||||
|
//fit: BoxFit.cover,
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 12.0),
|
||||||
|
child: Container(
|
||||||
|
height: MediaQuery.of(context).size.height * 0.15,
|
||||||
|
width: MediaQuery.of(context).size.width * 0.43,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(12.0),
|
||||||
|
gradient: LinearGradient(
|
||||||
|
colors: [Color(0xff17AFB8), Color(0xff49C1BC)]),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(12.0),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'You Have',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white, fontSize: 10.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'25',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white, fontSize: 25.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'unWanted\n Packge',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white, fontSize: 10.0),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(right: 9.5),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/open_box.png',
|
||||||
|
height: MediaQuery.of(context).size.height *
|
||||||
|
0.11,
|
||||||
|
width: MediaQuery.of(context).size.width *
|
||||||
|
0.24,
|
||||||
|
scale: 0.9,
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 12.0),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
child: Container(
|
||||||
|
height: 140,
|
||||||
|
width: 350,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(12.0),
|
||||||
|
gradient: LinearGradient(colors: [
|
||||||
|
Color(0xff48C0BC),
|
||||||
|
Color(0xff17AFB8)
|
||||||
|
])),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/qr_code.png',
|
||||||
|
width:
|
||||||
|
MediaQuery.of(context).size.width * 0.25,
|
||||||
|
height:
|
||||||
|
MediaQuery.of(context).size.height * 0.14,
|
||||||
|
fit: BoxFit.fitHeight,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'SCAN',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 35.0, color: Colors.white),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(top: 6.0),
|
||||||
|
child: Text(
|
||||||
|
'To add package to que ',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12.0,
|
||||||
|
color: Colors.white,
|
||||||
|
letterSpacing: 0.5,
|
||||||
|
wordSpacing: 5.5,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 10.0),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: <Widget>[
|
||||||
|
Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'Nearest Drop-Offs',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 21.0,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
InkWell(
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'See All',
|
||||||
|
style: TextStyle(fontSize: 14.5),
|
||||||
|
),
|
||||||
|
Icon(
|
||||||
|
Icons.arrow_forward_ios,
|
||||||
|
size: 15.0,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
onTap: () => Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => OrdersListScreen()),
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: <Widget>[
|
||||||
|
ListView.builder(
|
||||||
|
shrinkWrap: true,
|
||||||
|
scrollDirection: Axis.vertical,
|
||||||
|
itemCount: //model.orders == null ? 0 : model.orders.length,
|
||||||
|
2,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 12.0),
|
||||||
|
child: RoundedContainer(
|
||||||
|
height: SizeConfig.heightMultiplier * 10.5,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: <Widget>[
|
||||||
|
Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(left: 22.0),
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/images/location.png'),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (model.orders.length != 0)
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
model.orders[index].firstName +
|
||||||
|
' ' +
|
||||||
|
model.orders[index].lastName,
|
||||||
|
style: TextStyle(fontSize: 20.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
model.orders[index].mobileNumber,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Color(0xff30B7B9),
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontSize: 15.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'Olaya ST, Behind kfc next to king-\ndom tower 2nd floor n.o 247',
|
||||||
|
style: TextStyle(color: Colors.black45),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(10.0),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
CircleAvatar(
|
||||||
|
backgroundColor: Colors.black45,
|
||||||
|
radius: 30.0,
|
||||||
|
child: CircleAvatar(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
maxRadius: 28.9,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(
|
||||||
|
'3 K.m \n away',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Color(0xff30B7B9),
|
||||||
|
fontSize: 14.0),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
})
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:driverapp/config/size_config.dart';
|
||||||
|
import 'package:driverapp/core/viewModels/pending_orders_view_model.dart';
|
||||||
|
import '../base/base_view.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:driverapp/widgets/others/rounded_container.dart';
|
||||||
|
|
||||||
|
class OrdersListScreen extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_OrdersListScreenState createState() => _OrdersListScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _OrdersListScreenState extends State<OrdersListScreen> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BaseView<PendingOrdersViewModel>(
|
||||||
|
onModelReady: (model) => model.getPendingOrders(),
|
||||||
|
builder:
|
||||||
|
(BuildContext context, PendingOrdersViewModel model, Widget child) =>
|
||||||
|
Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: Color(0xffF4F9FA),
|
||||||
|
title: Text(
|
||||||
|
'Your Delivery Que',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
import 'package:driverapp/pages/authentication/login_page.dart';
|
||||||
|
import 'package:driverapp/pages/base/base_view.dart';
|
||||||
|
import 'package:driverapp/pages/landing/landing_page.dart';
|
||||||
|
import 'package:driverapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:driverapp/pages/dashboard/dashboard_screen.dart';
|
||||||
|
|
||||||
|
import 'core/viewModels/authentication_view_model.dart';
|
||||||
|
|
||||||
|
class RootPage extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
Widget buildRoot(APP_STATUS status) {
|
||||||
|
switch (status) {
|
||||||
|
case APP_STATUS.UNAUTHENTICATED:
|
||||||
|
return LoginPage ();
|
||||||
|
break;
|
||||||
|
case APP_STATUS.AUTHENTICATED:
|
||||||
|
return DashboardScreen();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return AnimatedSwitcher(
|
||||||
|
duration: Duration(microseconds: 350),
|
||||||
|
child: BaseView<AuthenticationViewModel>(
|
||||||
|
builder: (_, model, widget) => AppScaffold(
|
||||||
|
baseViewModel: model,
|
||||||
|
body: buildRoot((model.status)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hexcolor/hexcolor.dart';
|
||||||
|
|
||||||
|
class CircleContainer extends StatelessWidget {
|
||||||
|
const CircleContainer(
|
||||||
|
{this.child,
|
||||||
|
this.color = Colors.white,
|
||||||
|
this.borderColor,
|
||||||
|
this.borderWidth = 2.0,
|
||||||
|
this.onTap});
|
||||||
|
|
||||||
|
final Widget child;
|
||||||
|
final Color color;
|
||||||
|
final Color borderColor;
|
||||||
|
final double borderWidth;
|
||||||
|
final Function onTap;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: onTap,
|
||||||
|
child: Container(
|
||||||
|
child: Center(child: child),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
color: color,
|
||||||
|
border: Border.all(
|
||||||
|
color: borderColor ?? Hexcolor("#707070"), width: borderWidth)),
|
||||||
|
height: 60,
|
||||||
|
width: 60,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class RoundedContainer extends StatefulWidget {
|
||||||
|
final double width;
|
||||||
|
final double height;
|
||||||
|
final double raduis;
|
||||||
|
final Color backgroundColor;
|
||||||
|
final double margin;
|
||||||
|
final double elevation;
|
||||||
|
final bool showBorder;
|
||||||
|
final Color borderColor;
|
||||||
|
final bool customCornerRaduis;
|
||||||
|
final double topLeft;
|
||||||
|
final double bottomRight;
|
||||||
|
final double topRight;
|
||||||
|
final double bottomLeft;
|
||||||
|
final Widget child;
|
||||||
|
final double borderWidth;
|
||||||
|
|
||||||
|
RoundedContainer(
|
||||||
|
{@required this.child,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
this.raduis = 10,
|
||||||
|
this.backgroundColor = Colors.white,
|
||||||
|
this.margin = 10,
|
||||||
|
this.elevation = 1,
|
||||||
|
this.showBorder = false,
|
||||||
|
this.borderColor = Colors.red,
|
||||||
|
this.customCornerRaduis = false,
|
||||||
|
this.topLeft = 0,
|
||||||
|
this.topRight = 0,
|
||||||
|
this.bottomRight = 0,
|
||||||
|
this.bottomLeft = 0,
|
||||||
|
this.borderWidth = 1});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_RoundedContainerState createState() => _RoundedContainerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _RoundedContainerState extends State<RoundedContainer> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: widget.width,
|
||||||
|
height: widget.height,
|
||||||
|
margin: EdgeInsets.all(widget.margin),
|
||||||
|
decoration: widget.showBorder == true
|
||||||
|
? BoxDecoration(
|
||||||
|
color: Theme.of(context).primaryColor,
|
||||||
|
border: Border.all(
|
||||||
|
color: widget.borderColor, width: widget.borderWidth),
|
||||||
|
borderRadius: widget.customCornerRaduis
|
||||||
|
? BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(widget.topLeft),
|
||||||
|
topRight: Radius.circular(widget.topRight),
|
||||||
|
bottomRight: Radius.circular(widget.bottomRight),
|
||||||
|
bottomLeft: Radius.circular(widget.bottomLeft))
|
||||||
|
: BorderRadius.circular(widget.raduis),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.grey.withOpacity(0.1),
|
||||||
|
spreadRadius: 10,
|
||||||
|
blurRadius: 5,
|
||||||
|
offset: Offset(0, 5), // changes position of shadow
|
||||||
|
),
|
||||||
|
])
|
||||||
|
: null,
|
||||||
|
child: Card(
|
||||||
|
margin: EdgeInsets.all(0),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: widget.customCornerRaduis
|
||||||
|
? BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(widget.topLeft),
|
||||||
|
topRight: Radius.circular(widget.topRight),
|
||||||
|
bottomRight: Radius.circular(widget.bottomRight),
|
||||||
|
bottomLeft: Radius.circular(widget.bottomLeft))
|
||||||
|
: BorderRadius.circular(widget.raduis),
|
||||||
|
),
|
||||||
|
color: widget.backgroundColor,
|
||||||
|
child: widget.child,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue