Merge branch 'main_latest_merged' into majd_development_new
# Conflicts: # assets/subtitles/ar_subtitle.json # assets/subtitles/en_subtitle.json # lib/main.dart # lib/models/service_request/service_request.dart # lib/views/pages/splash_screen.dart # lib/views/pages/user/notifications/notifications_page.dart # lib/views/pages/user/profile_page.dart # lib/views/pages/user/requests/create_request.dart # lib/views/pages/user/requests/request_details.dart # lib/views/pages/user/requests/requests_page.dart # lib/views/widgets/equipment/auto_complete_devices_field.dart # lib/views/widgets/equipment/single_device_picker.dartmerge-requests/29/head
commit
8b7b40b0af
@ -0,0 +1,69 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:test_sa/controllers/api_routes/api_manager.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/models/user.dart';
|
||||
|
||||
class ServiceFirstActionProvider extends ChangeNotifier {
|
||||
//reset provider data
|
||||
void reset() {
|
||||
_statuses = null;
|
||||
_stateCode = null;
|
||||
}
|
||||
|
||||
// state code of current request to defied error message
|
||||
// like 400 customer request failed
|
||||
// 500 service not available
|
||||
int _stateCode;
|
||||
int get stateCode => _stateCode;
|
||||
|
||||
// contain user data
|
||||
// when user not login or register _user = null
|
||||
List<Lookup> _statuses;
|
||||
List<Lookup> get items => _statuses;
|
||||
|
||||
// when categories in-process _loading = true
|
||||
// done _loading = true
|
||||
// failed _loading = false
|
||||
bool _loading;
|
||||
bool get isLoading => _loading;
|
||||
set isLoading(bool isLoading) {
|
||||
_loading = isLoading;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// return -2 if request in progress
|
||||
/// return -1 if error happen when sending request
|
||||
/// return state code if request complete may be 200, 404 or 403
|
||||
/// for more details check http state manager
|
||||
/// lib\controllers\http_status_manger\http_status_manger.dart
|
||||
Future<int> getData({String host, User user}) async {
|
||||
if (_loading == true) return -2;
|
||||
_loading = true;
|
||||
notifyListeners();
|
||||
Response response;
|
||||
try {
|
||||
response = await ApiManager.instance.get(
|
||||
URLs.getServiceFirstAction,
|
||||
);
|
||||
_stateCode = response.statusCode;
|
||||
if (response.statusCode >= 200 && response.statusCode < 300) {
|
||||
// client's request was successfully received
|
||||
List categoriesListJson = json.decode(response.body)["data"];
|
||||
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
|
||||
}
|
||||
_loading = false;
|
||||
notifyListeners();
|
||||
return response.statusCode;
|
||||
} catch (error) {
|
||||
_loading = false;
|
||||
_stateCode = -1;
|
||||
notifyListeners();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,69 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:test_sa/controllers/api_routes/api_manager.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/models/user.dart';
|
||||
|
||||
class ServiceLoanAvailabilityProvider extends ChangeNotifier {
|
||||
//reset provider data
|
||||
void reset() {
|
||||
_statuses = null;
|
||||
_stateCode = null;
|
||||
}
|
||||
|
||||
// state code of current request to defied error message
|
||||
// like 400 customer request failed
|
||||
// 500 service not available
|
||||
int _stateCode;
|
||||
int get stateCode => _stateCode;
|
||||
|
||||
// contain user data
|
||||
// when user not login or register _user = null
|
||||
List<Lookup> _statuses;
|
||||
List<Lookup> get items => _statuses;
|
||||
|
||||
// when categories in-process _loading = true
|
||||
// done _loading = true
|
||||
// failed _loading = false
|
||||
bool _loading;
|
||||
bool get isLoading => _loading;
|
||||
set isLoading(bool isLoading) {
|
||||
_loading = isLoading;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// return -2 if request in progress
|
||||
/// return -1 if error happen when sending request
|
||||
/// return state code if request complete may be 200, 404 or 403
|
||||
/// for more details check http state manager
|
||||
/// lib\controllers\http_status_manger\http_status_manger.dart
|
||||
Future<int> getData({String host, User user}) async {
|
||||
if (_loading == true) return -2;
|
||||
_loading = true;
|
||||
notifyListeners();
|
||||
Response response;
|
||||
try {
|
||||
response = await ApiManager.instance.get(
|
||||
URLs.getServiceLoanAvailability,
|
||||
);
|
||||
_stateCode = response.statusCode;
|
||||
if (response.statusCode >= 200 && response.statusCode < 300) {
|
||||
// client's request was successfully received
|
||||
List categoriesListJson = json.decode(response.body)["data"];
|
||||
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
|
||||
}
|
||||
_loading = false;
|
||||
notifyListeners();
|
||||
return response.statusCode;
|
||||
} catch (error) {
|
||||
_loading = false;
|
||||
_stateCode = -1;
|
||||
notifyListeners();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,108 +1,219 @@
|
||||
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
|
||||
import 'package:test_sa/models/department.dart';
|
||||
import 'package:test_sa/models/enums/user_types.dart';
|
||||
import 'package:test_sa/models/hospital.dart';
|
||||
|
||||
class User {
|
||||
int clientId;
|
||||
String clientName;
|
||||
int departmentId;
|
||||
String departmentName;
|
||||
String message;
|
||||
String username;
|
||||
String userID;
|
||||
String email;
|
||||
String password;
|
||||
String token;
|
||||
dynamic roles;
|
||||
List<UserRoles> userRoles;
|
||||
String tokenlife;
|
||||
bool isAuthenticated;
|
||||
bool hasError;
|
||||
String profilePhotoName;
|
||||
String id;
|
||||
String userName;
|
||||
String password;
|
||||
String email;
|
||||
Hospital hospital;
|
||||
Department department;
|
||||
UsersTypes type;
|
||||
String normalizedUserName;
|
||||
String normalizedEmail;
|
||||
bool emailConfirmed;
|
||||
dynamic passwordHash;
|
||||
String securityStamp;
|
||||
String concurrencyStamp;
|
||||
String phoneNumber;
|
||||
String whatsApp;
|
||||
String token;
|
||||
bool isActive;
|
||||
DateTime tokenLife;
|
||||
bool phoneNumberConfirmed;
|
||||
bool twoFactorEnabled;
|
||||
dynamic lockoutEnd;
|
||||
bool lockoutEnabled;
|
||||
int accessFailedCount;
|
||||
|
||||
User(
|
||||
{this.id,
|
||||
this.userName = "",
|
||||
this.email = "",
|
||||
this.password = "",
|
||||
this.phoneNumber = "",
|
||||
this.hospital,
|
||||
this.department,
|
||||
this.type,
|
||||
this.whatsApp,
|
||||
this.token,
|
||||
this.tokenLife,
|
||||
this.isActive = false});
|
||||
User({
|
||||
this.clientId,
|
||||
this.clientName,
|
||||
this.departmentId,
|
||||
this.departmentName,
|
||||
this.message,
|
||||
this.username,
|
||||
this.userID,
|
||||
this.email,
|
||||
this.password,
|
||||
this.token,
|
||||
this.roles,
|
||||
this.userRoles,
|
||||
this.tokenlife,
|
||||
this.isAuthenticated,
|
||||
this.hasError,
|
||||
this.profilePhotoName,
|
||||
this.id,
|
||||
this.userName,
|
||||
this.normalizedUserName,
|
||||
this.normalizedEmail,
|
||||
this.emailConfirmed,
|
||||
this.passwordHash,
|
||||
this.securityStamp,
|
||||
this.concurrencyStamp,
|
||||
this.phoneNumber,
|
||||
this.phoneNumberConfirmed,
|
||||
this.twoFactorEnabled,
|
||||
this.lockoutEnd,
|
||||
this.lockoutEnabled,
|
||||
this.accessFailedCount,
|
||||
});
|
||||
|
||||
Future<Map<String, dynamic>> toLoginJson() async {
|
||||
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
|
||||
return {
|
||||
"username": userName,
|
||||
"password": password,
|
||||
"firebase_token": FirebaseNotificationManger?.token ?? "",
|
||||
"fireBaseToken": FirebaseNotificationManger?.token ?? "",
|
||||
};
|
||||
}
|
||||
|
||||
UsersTypes get type {
|
||||
switch (userRoles.first.name) {
|
||||
case "Engineer":
|
||||
return UsersTypes.engineer;
|
||||
case "Hospital":
|
||||
return UsersTypes.normal_user;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toUpdateProfileJson() {
|
||||
Map<String, dynamic> jsonObject = {};
|
||||
if (department?.id != null) jsonObject["department"] = department.id;
|
||||
if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
|
||||
if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
|
||||
// if (departmentId != null) jsonObject["department"] = departmentId;
|
||||
// if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
|
||||
// if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
|
||||
return jsonObject;
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> toRegisterJson() async {
|
||||
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
|
||||
// if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
|
||||
return {
|
||||
"username": userName,
|
||||
"email": email,
|
||||
"whatsapp": whatsApp,
|
||||
"client": hospital.id,
|
||||
"department": department?.id,
|
||||
"phone": phoneNumber,
|
||||
"pass": password,
|
||||
"firebase_token": FirebaseNotificationManger?.token ?? "",
|
||||
// "username": userName,
|
||||
// "email": email,
|
||||
// "whatsapp": whatsApp,
|
||||
// "client": hospital.id,
|
||||
// "department": department?.id,
|
||||
// "phone": phoneNumber,
|
||||
// "pass": password,
|
||||
// "firebase_token": FirebaseNotificationManger?.token ?? "",
|
||||
};
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
"userID": id,
|
||||
"username": userName,
|
||||
"email": email,
|
||||
"token": token,
|
||||
"phoneNumber": phoneNumber,
|
||||
"whatsapp": whatsApp,
|
||||
"client_id": hospital?.id,
|
||||
"client_name": hospital?.name,
|
||||
"department_id": department?.id,
|
||||
"department_name": department?.name,
|
||||
//"password":password,
|
||||
"tokenlife": tokenLife.toIso8601String(),
|
||||
"active": isActive,
|
||||
"userRoles": type == UsersTypes.engineer ? "value: R-6" : "value: R-5",
|
||||
// "token":token, pass is token
|
||||
};
|
||||
final map = <String, dynamic>{};
|
||||
map['client_id'] = clientId;
|
||||
map['client_name'] = clientName;
|
||||
map['department_id'] = departmentId;
|
||||
map['department_name'] = departmentName;
|
||||
map['message'] = message;
|
||||
map['username'] = username;
|
||||
map['userID'] = userID;
|
||||
map['email'] = email;
|
||||
map['password'] = password;
|
||||
map['token'] = token;
|
||||
map['roles'] = roles;
|
||||
if (userRoles != null) {
|
||||
map['userRoles'] = userRoles.map((v) => v.toJson()).toList();
|
||||
}
|
||||
map['tokenlife'] = tokenlife;
|
||||
map['isAuthenticated'] = isAuthenticated;
|
||||
map['hasError'] = hasError;
|
||||
map['profilePhotoName'] = profilePhotoName;
|
||||
map['id'] = id;
|
||||
map['userName'] = userName;
|
||||
map['normalizedUserName'] = normalizedUserName;
|
||||
map['normalizedEmail'] = normalizedEmail;
|
||||
map['emailConfirmed'] = emailConfirmed;
|
||||
map['passwordHash'] = passwordHash;
|
||||
map['securityStamp'] = securityStamp;
|
||||
map['concurrencyStamp'] = concurrencyStamp;
|
||||
map['phoneNumber'] = phoneNumber;
|
||||
map['phoneNumberConfirmed'] = phoneNumberConfirmed;
|
||||
map['twoFactorEnabled'] = twoFactorEnabled;
|
||||
map['lockoutEnd'] = lockoutEnd;
|
||||
map['lockoutEnabled'] = lockoutEnabled;
|
||||
map['accessFailedCount'] = accessFailedCount;
|
||||
return map;
|
||||
}
|
||||
|
||||
factory User.fromJson(Map<String, dynamic> parsedJson) {
|
||||
UsersTypes type;
|
||||
if (parsedJson["userRoles"].toString().contains("value: R-4") || parsedJson["userRoles"].toString().contains("value: R-5") || parsedJson["userRoles"].toString().contains("value: R-7")) {
|
||||
type = UsersTypes.normal_user;
|
||||
} else {
|
||||
type = UsersTypes.engineer;
|
||||
User.fromJson(dynamic json) {
|
||||
clientId = json['client_id'];
|
||||
clientName = json['client_name'];
|
||||
departmentId = json['department_id'];
|
||||
departmentName = json['department_name'];
|
||||
message = json['message'];
|
||||
username = json['username'];
|
||||
userID = json['userID'];
|
||||
email = json['email'];
|
||||
password = json['password'];
|
||||
token = json['token'];
|
||||
roles = json['roles'];
|
||||
if (json['userRoles'] != null) {
|
||||
userRoles = [];
|
||||
json['userRoles'].forEach((v) {
|
||||
userRoles.add(UserRoles.fromJson(v));
|
||||
});
|
||||
}
|
||||
return User(
|
||||
id: parsedJson["userID"],
|
||||
userName: parsedJson["username"],
|
||||
email: parsedJson["email"],
|
||||
hospital: Hospital(id: parsedJson["client_id"], name: parsedJson["client_name"]),
|
||||
department: Department(
|
||||
id: parsedJson["department_id"],
|
||||
name: parsedJson["department_name"],
|
||||
),
|
||||
phoneNumber: parsedJson["phoneNumber"],
|
||||
whatsApp: parsedJson["phoneNumber"],
|
||||
token: parsedJson["token"],
|
||||
isActive: parsedJson["isAuthenticated"],
|
||||
tokenLife: DateTime.tryParse(parsedJson["tokenlife"] ?? ""),
|
||||
type: type);
|
||||
tokenlife = json['tokenlife'];
|
||||
isAuthenticated = json['isAuthenticated'];
|
||||
hasError = json['hasError'];
|
||||
profilePhotoName = json['profilePhotoName'];
|
||||
id = json['id'];
|
||||
userName = json['userName'];
|
||||
normalizedUserName = json['normalizedUserName'];
|
||||
normalizedEmail = json['normalizedEmail'];
|
||||
emailConfirmed = json['emailConfirmed'];
|
||||
passwordHash = json['passwordHash'];
|
||||
securityStamp = json['securityStamp'];
|
||||
concurrencyStamp = json['concurrencyStamp'];
|
||||
phoneNumber = json['phoneNumber'];
|
||||
phoneNumberConfirmed = json['phoneNumberConfirmed'];
|
||||
twoFactorEnabled = json['twoFactorEnabled'];
|
||||
lockoutEnd = json['lockoutEnd'];
|
||||
lockoutEnabled = json['lockoutEnabled'];
|
||||
accessFailedCount = json['accessFailedCount'];
|
||||
}
|
||||
}
|
||||
|
||||
class UserRoles {
|
||||
UserRoles({
|
||||
this.id,
|
||||
this.name,
|
||||
this.value,
|
||||
});
|
||||
|
||||
UserRoles.fromJson(dynamic json) {
|
||||
id = json['id'];
|
||||
name = json['name'];
|
||||
value = json['value'];
|
||||
}
|
||||
String id;
|
||||
String name;
|
||||
String value;
|
||||
UserRoles copyWith({
|
||||
String id,
|
||||
String name,
|
||||
String value,
|
||||
}) =>
|
||||
UserRoles(
|
||||
id: id ?? this.id,
|
||||
name: name ?? this.name,
|
||||
value: value ?? this.value,
|
||||
);
|
||||
Map<String, dynamic> toJson() {
|
||||
final map = <String, dynamic>{};
|
||||
map['id'] = id;
|
||||
map['name'] = name;
|
||||
map['value'] = value;
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,36 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/user_provider.dart';
|
||||
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||
import 'package:test_sa/views/widgets/status/single_status_menu.dart';
|
||||
|
||||
import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart';
|
||||
|
||||
class ServiceRequestedFirstAction extends StatelessWidget {
|
||||
final Function(Lookup) onSelect;
|
||||
final Lookup initialValue;
|
||||
|
||||
const ServiceRequestedFirstAction({Key key, this.onSelect, this.initialValue}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final settingProvider = Provider.of<SettingProvider>(context);
|
||||
final userProvider = Provider.of<UserProvider>(context);
|
||||
final menuProvider = Provider.of<ServiceFirstActionProvider>(context);
|
||||
return LoadingManager(
|
||||
isLoading: menuProvider.isLoading,
|
||||
isFailedLoading: menuProvider.items == null,
|
||||
stateCode: menuProvider.stateCode,
|
||||
onRefresh: () async {
|
||||
menuProvider.reset();
|
||||
await menuProvider.getData(user: userProvider.user, host: settingProvider.host);
|
||||
},
|
||||
child: SingleStatusMenu(
|
||||
initialStatus: initialValue,
|
||||
statuses: menuProvider.items,
|
||||
onSelect: onSelect,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/user_provider.dart';
|
||||
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||
import 'package:test_sa/views/widgets/status/single_status_menu.dart';
|
||||
|
||||
import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart';
|
||||
|
||||
class ServiceRequestedLoanAvailability extends StatelessWidget {
|
||||
final Function(Lookup) onSelect;
|
||||
final Lookup initialValue;
|
||||
|
||||
const ServiceRequestedLoanAvailability({Key key, this.onSelect, this.initialValue}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final settingProvider = Provider.of<SettingProvider>(context);
|
||||
final userProvider = Provider.of<UserProvider>(context);
|
||||
final menuProvider = Provider.of<ServiceLoanAvailabilityProvider>(context);
|
||||
return LoadingManager(
|
||||
isLoading: menuProvider.isLoading,
|
||||
isFailedLoading: menuProvider.items == null,
|
||||
stateCode: menuProvider.stateCode,
|
||||
onRefresh: () async {
|
||||
menuProvider.reset();
|
||||
await menuProvider.getData(user: userProvider.user, host: settingProvider.host);
|
||||
},
|
||||
child: SingleStatusMenu(
|
||||
initialStatus: initialValue,
|
||||
statuses: menuProvider.items,
|
||||
onSelect: onSelect,
|
||||
));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue