change the structure of Track Gas Refill and Transfer Device (point 2 & 3)

merge-requests/15/head
nextwo 3 years ago
parent 1e06449d8d
commit 198dc95814

@ -0,0 +1,81 @@
import 'dart:convert';
import 'package:test_sa/api/api_client.dart';
import 'package:test_sa/api/user_api_client.dart';
import '../controllers/api_routes/urls.dart';
import '../models/device/device_transfer.dart';
import '../models/device/device_transfer_info.dart';
class DeviceTransferApiClient{
static final DeviceTransferApiClient _instance =DeviceTransferApiClient._internal();
DeviceTransferApiClient._internal();
factory DeviceTransferApiClient() =>_instance;
Future<List<DeviceTransfer>> getRequests({
required List items,
required int pageItemNumber
}) async {
final response = await ApiClient().getJsonForResponse(
"${URLs.host1}${URLs.getDeviceTransfer}",
queryParameters: {
"uid":"${UserApiClient().user?.id}",
"token":"${UserApiClient().user?.token}",
"page":"${(items.length) ~/ pageItemNumber}",
},
headers: {"Content-Type": "application/json; charset=utf-8"}
);
List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
return listJson.map((request) => DeviceTransfer.fromJson(request)).toList();
}
Future<DeviceTransfer> createRequest({
required DeviceTransfer model,
})async{
Map<String, dynamic> body = {
"uid": UserApiClient().user?.id.toString()??"",
"token": UserApiClient().user?.token??"",
"serial_id": model.device?.id??"",
"destination_client": model.receiver?.client?.id??"",
"destination_department": model.receiver?.department?.id??"",
};
final response = await ApiClient().postJsonForResponse(
"${URLs.host1}${URLs.requestDeviceTransfer}", body, isFormData: true);
return DeviceTransfer.fromJson(json.decode(utf8.decode(response.bodyBytes))[0]);
}
Future<DeviceTransfer> updateRequest({
required bool isSender,
required String requestId,
required DeviceTransfer? oldModel,
required DeviceTransferInfo newModel,
})async{
Map<String, dynamic> body = {
"uid": UserApiClient().user?.id.toString(),
"token": UserApiClient().user?.token,
"current_user": UserApiClient().user?.id,
};
body.addAll(newModel.toJson(isSender));
final response = await ApiClient().postJsonForResponse(
"${URLs.host1}${URLs.updateDeviceTransfer}/$requestId", body);
return DeviceTransfer.fromJson(
json.decode(utf8.decode(response.bodyBytes))[0]
);
}
}

@ -1,14 +1,17 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/api/device_transfer_api_client.dart';
import 'package:test_sa/controllers/providers/loading_notifier.dart';
import '../../../models/device/device_transfer.dart';
import '../../../models/device/device_transfer_info.dart';
import '../../../models/user.dart';
import '../../api_routes/urls.dart';
import '../../http_status_manger/http_status_manger.dart';
import '../../localization/localization.dart';
class DeviceTransferProvider extends ChangeNotifier {
class DeviceTransferProvider extends LoadingNotifier {
// number of items call in each request
final pageItemNumber = 50;
@ -30,105 +33,45 @@ class DeviceTransferProvider extends ChangeNotifier {
// list of user requests
List<DeviceTransfer> items = [];
// when requests in-process _loading = true
// done _loading = true
// failed _loading = false
bool? isLoading;
Future getRequests() async {
/// 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> getRequests({
required String host,
required User user,
}) async {
if (isLoading == true) {
return -2;
}
isLoading = true;
// isLoading = false;
// stateCode = 200;
// items = [];
// items.addAll(List.generate(20, (index) => DeviceTransfer(
// title: "ddddd",
// id: "5",
// device: Device(id: "1",brand: "brand",model: "model"),
// destinationClient: Hospital(name: "hospital name",id: "1"),
// destinationDepartment: Department(id: "5",name: "destination Department"),
// senderDepartment: Department(id: "5",name: "sender Department"),
// userId: "5"
// )));
// notifyListeners();
// return 200;
Response response;
try {
response = await get(
Uri.parse("$host${URLs.getDeviceTransfer}?uid=${user.id}"
"&token=${user.token}&page=${(items?.length ?? 0) ~/ pageItemNumber}"),
headers: {"Content-Type": "application/json; charset=utf-8"});
stateCode = response.statusCode;
if (stateCode != null && stateCode! >= 200 && stateCode! < 300) {
// client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
print(listJson);
List<DeviceTransfer> itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList();
print(itemsPage.length);
items.clear();
items.addAll(itemsPage);
if (itemsPage.length == pageItemNumber) {
nextPage = true;
} else {
nextPage = false;
}
}
isLoading = false;
waitApiRequest(() async {
items.clear();
items.addAll(await DeviceTransferApiClient().getRequests(items: items, pageItemNumber: pageItemNumber));
notifyListeners();
return response.statusCode;
} catch (error) {
isLoading = false;
stateCode = -1;
notifyListeners();
return -1;
}
if (items.length == pageItemNumber) {
nextPage = true;
} else {
nextPage = false;
}
});
}
Future<int> createRequest({
required String host,
required User? user,
Future createRequest({
required DeviceTransfer model,
required BuildContext context
}) async {
Map<String, dynamic> body = {
"uid": user?.id.toString(),
"token": user?.token ?? "",
"serial_id": model.device?.id ?? "",
"destination_client": model.receiver?.client?.id ?? "",
"destination_department": model.receiver?.department?.id ?? "",
};
Response response;
try {
response = await post(
Uri.parse(host + URLs.requestDeviceTransfer),
body: body,
final subtitle = AppLocalization.of(context)?.subtitle;
waitApiRequest(() async {
items.insert(0, await DeviceTransferApiClient().createRequest(model: model));
notifyListeners();
},
onSuccess: (){
Fluttertoast.showToast(
msg: subtitle?.requestCompleteSuccessfully??"",
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
final items = this.items;
if (items != null) {
items.insert(0, DeviceTransfer.fromJson(json.decode(utf8.decode(response.bodyBytes))[0]));
notifyListeners();
}
}
return response.statusCode;
} catch (error) {
return -1;
Navigator.of(context).pop();
},
onError: (error){
String errorMessage = HttpStatusManger.getStatusMessage(status: error.error?.errorCode, subtitle: subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
}
);
}
Future<int> updateRequest({
Future updateRequest({
required String host,
required User user,
required bool isSender,
@ -136,32 +79,9 @@ class DeviceTransferProvider extends ChangeNotifier {
required DeviceTransfer? oldModel,
required DeviceTransferInfo newModel,
}) async {
Map<String, dynamic> body = {
"uid": user.id.toString(),
"token": user.token ?? "",
"current_user": user.id ?? "",
};
body.addAll(newModel.toJson(isSender));
Response response;
try {
response = await post(
Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),
body: body,
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
reset();
// oldModel.fromDeviceTransfer(
// DeviceTransfer.fromJson(
// json.decode(utf8.decode(response.bodyBytes))[0]
// )
// );
notifyListeners();
}
return response.statusCode;
} catch (error) {
return -1;
}
reset();
oldModel= await DeviceTransferApiClient().updateRequest(isSender: isSender, requestId: requestId, oldModel: oldModel, newModel: newModel);
notifyListeners();
}
}

@ -78,7 +78,7 @@ class DevicesProvider extends ChangeNotifier {
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<List<Device>> getDevicesList({
required String host,
required User user,
required User? user,
required String hospitalId,
String? serialNumber,
String? number,

@ -37,13 +37,20 @@ class GasRefillProvider extends LoadingNotifier {
Future getRequests() async {
waitApiRequest(() async {
items.clear();
items.addAll(await GasRefillApiClient().getRequestPages(items: items, pageItemNumber: pageItemNumber));
notifyListeners();
if (items.length == pageItemNumber) {
nextPage = true;
} else {
nextPage = false;
}
});
},
onSuccess: (){
stateCode=200;
notifyListeners();
}
);
}
Future createModel({

@ -27,7 +27,7 @@ class LoadingNotifier with ChangeNotifier {
await onSuccess();
}
} on APIException catch (error) {
debugPrint("loading_notifier.dart : [_waitResult] returns this message ${error.message} : ${error.arguments}");
debugPrint("loading_notifier.dart : [_waitResult] returns this message ${error.message} : ${error.arguments} ${error.error?.errorCode} ");
if (onError != null) {
await onError(error);
}

@ -33,8 +33,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
bool _isLoading = false;
bool _validate = false;
Subtitle? _subtitle;
UserProvider? _userProvider;
SettingProvider? _settingProvider;
DeviceTransferProvider? _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController();
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo());
@ -46,42 +44,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
if (mounted) super.setState(() {});
}
_onSubmit() async {
_validate = true;
if ((_formKey.currentState?.validate() ?? false)) {
setState(() {});
return false;
}
_formKey.currentState?.save();
if (!_formModel.validate()) {
setState(() {});
return false;
}
_isLoading = true;
setState(() {});
int? status = await _deviceTransferProvider?.createRequest(
user: UserApiClient().user,
host: _settingProvider?.host ?? "",
model: _formModel,
);
_isLoading = false;
setState(() {});
if (status != null && status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle?.requestCompleteSuccessfully ?? "",
);
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
}
}
@override
void dispose() {
_requestedQuantityController.dispose();
@ -91,8 +53,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
return Scaffold(
key: _scaffoldKey,
@ -192,7 +152,24 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
12.height,
AButton(
text: _subtitle?.submit ?? "",
onPressed: _onSubmit,
onPressed: () async {
_validate = true;
if (!(_formKey.currentState?.validate() ?? false)) {
setState(() {});
return;
}
_formKey.currentState?.save();
if (!_formModel.validate()) {
setState(() {});
return;
}
await _deviceTransferProvider?.createRequest(
model: _formModel, context: context,
);
},
),
const SizedBox(
height: 100,

@ -37,15 +37,12 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
return Scaffold(
body: SafeArea(
child: LoadingManager(
isLoading: _deviceTransferProvider.isLoading,
isLoading: _deviceTransferProvider.loading,
//isFailedLoading: _deviceTransferProvider.items == null,
stateCode: _deviceTransferProvider.stateCode,
onRefresh: () async {
_deviceTransferProvider.reset();
await _deviceTransferProvider.getRequests(
user: UserApiClient().user ?? User(),
host: _settingProvider.host ?? "",
);
await _deviceTransferProvider.getRequests();
},
child: Stack(
children: [
@ -79,10 +76,7 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
child: DeviceTransferList(
nextPage: _deviceTransferProvider.nextPage,
onLazyLoad: () async {
await _deviceTransferProvider.getRequests(
user: UserApiClient().user ?? User(),
host: _settingProvider.host ?? "",
);
await _deviceTransferProvider.getRequests();
},
items: _deviceTransferProvider.items,
),

@ -23,25 +23,21 @@ class TrackGasRefillPage extends StatefulWidget {
}
class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProviderStateMixin {
GasRefillProvider? _gasRefillProvider;
UserProvider? _userProvider;
SettingProvider? _settingProvider;
late GasRefillProvider _gasRefillProvider;
@override
Widget build(BuildContext context) {
_gasRefillProvider = Provider.of<GasRefillProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
Subtitle? _subtitle = AppLocalization.of(context)?.subtitle;
return Scaffold(
body: SafeArea(
child: LoadingManager(
isLoading: _gasRefillProvider?.loading,
isFailedLoading: _gasRefillProvider?.items == null,
stateCode: _gasRefillProvider?.stateCode,
isLoading: _gasRefillProvider.loading,
isFailedLoading: _gasRefillProvider.items == null,
stateCode: _gasRefillProvider.stateCode,
onRefresh: () async {
_gasRefillProvider?.reset();
await _gasRefillProvider?.getRequests();
_gasRefillProvider.reset();
await _gasRefillProvider.getRequests();
},
child: Stack(
children: [
@ -73,11 +69,11 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
),
Expanded(
child: GasRefillList(
nextPage: _gasRefillProvider?.nextPage ?? false,
nextPage: _gasRefillProvider.nextPage,
onLazyLoad: () async {
await _gasRefillProvider?.getRequests();
await _gasRefillProvider.getRequests();
},
items: _gasRefillProvider?.items ?? [],
items: _gasRefillProvider.items,
),
),
],

@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/api/user_api_client.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import '../../../controllers/providers/api/devices_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../controllers/providers/user_provider.dart';
import '../../../models/device/device.dart';
import '../../../models/user.dart';
import '../../app_style/colors.dart';
@ -18,12 +19,14 @@ class AutoCompleteDeviceField extends StatefulWidget {
const AutoCompleteDeviceField({Key? key, required this.initialValue, this.onPick, this.hospitalId}) : super(key: key);
@override
AutoCompleteDeviceFieldState createState() => AutoCompleteDeviceFieldState();
_AutoCompleteDeviceFieldState createState() => _AutoCompleteDeviceFieldState();
}
class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
SettingProvider? _settingProvider;
DevicesProvider? _devicesProvider;
UserProvider? _userProvider;
TextEditingController? _controller;
@override
@ -37,48 +40,56 @@ class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
padding: const EdgeInsets.symmetric(
horizontal: 16
),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: AColors.black),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
boxShadow: const [AppStyle.boxShadow]),
border: Border.all(color:AColors.black),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
boxShadow: [
AppStyle.boxShadow
]
),
child: TypeAheadField<Device>(
textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.titleLarge,
controller: _controller,
textAlign: TextAlign.center,
decoration: const InputDecoration(
border: InputBorder.none,
disabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
),
textInputAction: TextInputAction.search,
style: Theme.of(context).textTheme.headline6,
controller: _controller,
textAlign: TextAlign.center,
decoration: const InputDecoration(
border: InputBorder.none,
disabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
),
textInputAction: TextInputAction.search,
),
suggestionsCallback: (value) async {
return await _devicesProvider!.getDevicesList(
host: _settingProvider?.host ?? "",
user: UserApiClient().user ?? User(),
hospitalId: widget.hospitalId ?? "",
serialNumber: value,
host: _settingProvider?.host??"",
user: UserApiClient().user,
hospitalId: widget.hospitalId??"",
serialNumber: value,
);
},
itemBuilder: (context, device) {
return ListTile(
title: Text(device.serialNumber ?? ""),
subtitle: Text("${device.model ?? ""}/${device.brand ?? ""}"),
title: Text(device.serialNumber??""),
subtitle: Text("${device.model??""}/${device.brand??""}"),
);
},
onSuggestionSelected: (device) {
_controller?.text = device.serialNumber ?? "";
widget.onPick!(device.id ?? "");
_controller?.text = device.serialNumber??"";
widget.onPick!(device.id??"");
},
),
);

Loading…
Cancel
Save