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.dart';
import '../../../models/device/device_transfer_info.dart'; import '../../../models/device/device_transfer_info.dart';
import '../../../models/user.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 // number of items call in each request
final pageItemNumber = 50; final pageItemNumber = 50;
@ -30,105 +33,45 @@ class DeviceTransferProvider extends ChangeNotifier {
// list of user requests // list of user requests
List<DeviceTransfer> items = []; List<DeviceTransfer> items = [];
// when requests in-process _loading = true Future getRequests() async {
// done _loading = true
// failed _loading = false
bool? isLoading;
/// 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; waitApiRequest(() async {
// 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.clear();
items.addAll(itemsPage); items.addAll(await DeviceTransferApiClient().getRequests(items: items, pageItemNumber: pageItemNumber));
if (itemsPage.length == pageItemNumber) { notifyListeners();
if (items.length == pageItemNumber) {
nextPage = true; nextPage = true;
} else { } else {
nextPage = false; nextPage = false;
} }
} });
isLoading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
isLoading = false;
stateCode = -1;
notifyListeners();
return -1;
}
} }
Future<int> createRequest({ Future createRequest({
required String host,
required User? user,
required DeviceTransfer model, required DeviceTransfer model,
required BuildContext context
}) async { }) async {
Map<String, dynamic> body = { final subtitle = AppLocalization.of(context)?.subtitle;
"uid": user?.id.toString(), waitApiRequest(() async {
"token": user?.token ?? "", items.insert(0, await DeviceTransferApiClient().createRequest(model: model));
"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,
);
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(); notifyListeners();
},
onSuccess: (){
Fluttertoast.showToast(
msg: subtitle?.requestCompleteSuccessfully??"",
);
Navigator.of(context).pop();
},
onError: (error){
String errorMessage = HttpStatusManger.getStatusMessage(status: error.error?.errorCode, subtitle: subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
} }
} );
return response.statusCode;
} catch (error) {
return -1;
}
} }
Future<int> updateRequest({ Future updateRequest({
required String host, required String host,
required User user, required User user,
required bool isSender, required bool isSender,
@ -136,32 +79,9 @@ class DeviceTransferProvider extends ChangeNotifier {
required DeviceTransfer? oldModel, required DeviceTransfer? oldModel,
required DeviceTransferInfo newModel, required DeviceTransferInfo newModel,
}) async { }) 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(); reset();
// oldModel.fromDeviceTransfer( oldModel= await DeviceTransferApiClient().updateRequest(isSender: isSender, requestId: requestId, oldModel: oldModel, newModel: newModel);
// DeviceTransfer.fromJson(
// json.decode(utf8.decode(response.bodyBytes))[0]
// )
// );
notifyListeners(); notifyListeners();
} }
return response.statusCode;
} catch (error) {
return -1;
}
}
} }

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

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

@ -27,7 +27,7 @@ class LoadingNotifier with ChangeNotifier {
await onSuccess(); await onSuccess();
} }
} on APIException catch (error) { } 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) { if (onError != null) {
await onError(error); await onError(error);
} }

@ -33,8 +33,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle? _subtitle; Subtitle? _subtitle;
UserProvider? _userProvider;
SettingProvider? _settingProvider;
DeviceTransferProvider? _deviceTransferProvider; DeviceTransferProvider? _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController = TextEditingController();
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo()); final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo());
@ -46,42 +44,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
if (mounted) super.setState(() {}); 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 @override
void dispose() { void dispose() {
_requestedQuantityController.dispose(); _requestedQuantityController.dispose();
@ -91,8 +53,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context)?.subtitle; _subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
@ -192,7 +152,24 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
12.height, 12.height,
AButton( AButton(
text: _subtitle?.submit ?? "", 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( const SizedBox(
height: 100, height: 100,

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

@ -23,25 +23,21 @@ class TrackGasRefillPage extends StatefulWidget {
} }
class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProviderStateMixin { class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProviderStateMixin {
GasRefillProvider? _gasRefillProvider; late GasRefillProvider _gasRefillProvider;
UserProvider? _userProvider;
SettingProvider? _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_gasRefillProvider = Provider.of<GasRefillProvider>(context); _gasRefillProvider = Provider.of<GasRefillProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; Subtitle? _subtitle = AppLocalization.of(context)?.subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
isLoading: _gasRefillProvider?.loading, isLoading: _gasRefillProvider.loading,
isFailedLoading: _gasRefillProvider?.items == null, isFailedLoading: _gasRefillProvider.items == null,
stateCode: _gasRefillProvider?.stateCode, stateCode: _gasRefillProvider.stateCode,
onRefresh: () async { onRefresh: () async {
_gasRefillProvider?.reset(); _gasRefillProvider.reset();
await _gasRefillProvider?.getRequests(); await _gasRefillProvider.getRequests();
}, },
child: Stack( child: Stack(
children: [ children: [
@ -73,11 +69,11 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
), ),
Expanded( Expanded(
child: GasRefillList( child: GasRefillList(
nextPage: _gasRefillProvider?.nextPage ?? false, nextPage: _gasRefillProvider.nextPage,
onLazyLoad: () async { 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:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/api/user_api_client.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/settings/setting_provider.dart';
import '../../../controllers/providers/user_provider.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
import '../../../models/user.dart'; import '../../../models/user.dart';
import '../../app_style/colors.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); const AutoCompleteDeviceField({Key? key, required this.initialValue, this.onPick, this.hospitalId}) : super(key: key);
@override @override
AutoCompleteDeviceFieldState createState() => AutoCompleteDeviceFieldState(); _AutoCompleteDeviceFieldState createState() => _AutoCompleteDeviceFieldState();
} }
class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> { class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
SettingProvider? _settingProvider; SettingProvider? _settingProvider;
DevicesProvider? _devicesProvider; DevicesProvider? _devicesProvider;
UserProvider? _userProvider;
TextEditingController? _controller; TextEditingController? _controller;
@override @override
@ -37,21 +40,29 @@ class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
_controller?.dispose(); _controller?.dispose();
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(
horizontal: 16
),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
border: Border.all(color:AColors.black), border: Border.all(color:AColors.black),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), borderRadius: BorderRadius.circular(
boxShadow: const [AppStyle.boxShadow]), AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
boxShadow: [
AppStyle.boxShadow
]
),
child: TypeAheadField<Device>( child: TypeAheadField<Device>(
textFieldConfiguration: TextFieldConfiguration( textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.headline6,
controller: _controller, controller: _controller,
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: const InputDecoration( decoration: const InputDecoration(
@ -65,7 +76,7 @@ class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
suggestionsCallback: (value) async { suggestionsCallback: (value) async {
return await _devicesProvider!.getDevicesList( return await _devicesProvider!.getDevicesList(
host: _settingProvider?.host??"", host: _settingProvider?.host??"",
user: UserApiClient().user ?? User(), user: UserApiClient().user,
hospitalId: widget.hospitalId??"", hospitalId: widget.hospitalId??"",
serialNumber: value, serialNumber: value,
); );

Loading…
Cancel
Save