From 198dc958149cb10139b04b3a8a9b40abccdd53f1 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Sun, 12 Mar 2023 10:29:11 +0300 Subject: [PATCH] change the structure of Track Gas Refill and Transfer Device (point 2 & 3) --- lib/api/device_transfer_api_client.dart | 81 +++++++++ .../api/device_transfer_provider.dart | 160 +++++------------- .../providers/api/devices_provider.dart | 2 +- .../providers/api/gas_refill_provider.dart | 9 +- .../providers/loading_notifier.dart | 2 +- .../request_device_transfer.dart | 59 ++----- .../track_device_transfer.dart | 12 +- .../user/gas_refill/track_gas_refill.dart | 22 +-- .../auto_complete_devices_field.dart | 63 ++++--- 9 files changed, 198 insertions(+), 212 deletions(-) create mode 100644 lib/api/device_transfer_api_client.dart diff --git a/lib/api/device_transfer_api_client.dart b/lib/api/device_transfer_api_client.dart new file mode 100644 index 00000000..4a258c79 --- /dev/null +++ b/lib/api/device_transfer_api_client.dart @@ -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> 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 createRequest({ + required DeviceTransfer model, + })async{ + Map 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 updateRequest({ + required bool isSender, + required String requestId, + required DeviceTransfer? oldModel, + required DeviceTransferInfo newModel, + })async{ + + Map 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] + ); + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index 9b592c79..a11fce07 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -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 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 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 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 createRequest({ - required String host, - required User? user, + Future createRequest({ required DeviceTransfer model, + required BuildContext context }) async { - Map 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 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 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(); } } diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 7b834763..5779ee64 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -78,7 +78,7 @@ class DevicesProvider extends ChangeNotifier { /// lib\controllers\http_status_manger\http_status_manger.dart Future> getDevicesList({ required String host, - required User user, + required User? user, required String hospitalId, String? serialNumber, String? number, diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 0fb73f98..ca2e3fff 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -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({ diff --git a/lib/controllers/providers/loading_notifier.dart b/lib/controllers/providers/loading_notifier.dart index 5d800b2d..a17b51d7 100644 --- a/lib/controllers/providers/loading_notifier.dart +++ b/lib/controllers/providers/loading_notifier.dart @@ -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); } diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index dcb1143b..f0d9e638 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -33,8 +33,6 @@ class _RequestDeviceTransferState extends State { 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 { 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 { @override Widget build(BuildContext context) { _subtitle = AppLocalization.of(context)?.subtitle; - _userProvider = Provider.of(context); - _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context, listen: false); return Scaffold( key: _scaffoldKey, @@ -192,7 +152,24 @@ class _RequestDeviceTransferState extends State { 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, diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 3b2da5cd..c24345d6 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -37,15 +37,12 @@ class _TrackDeviceTransferPageState extends State 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 with child: DeviceTransferList( nextPage: _deviceTransferProvider.nextPage, onLazyLoad: () async { - await _deviceTransferProvider.getRequests( - user: UserApiClient().user ?? User(), - host: _settingProvider.host ?? "", - ); + await _deviceTransferProvider.getRequests(); }, items: _deviceTransferProvider.items, ), diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index 2e9968cd..c116a57f 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -23,25 +23,21 @@ class TrackGasRefillPage extends StatefulWidget { } class _TrackGasRefillPageState extends State with TickerProviderStateMixin { - GasRefillProvider? _gasRefillProvider; - UserProvider? _userProvider; - SettingProvider? _settingProvider; + late GasRefillProvider _gasRefillProvider; @override Widget build(BuildContext context) { _gasRefillProvider = Provider.of(context); - _userProvider = Provider.of(context); - _settingProvider = Provider.of(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 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, ), ), ], diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index b52aefcd..eb408168 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -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 { +class _AutoCompleteDeviceFieldState extends State { + SettingProvider? _settingProvider; DevicesProvider? _devicesProvider; + UserProvider? _userProvider; TextEditingController? _controller; @override @@ -37,48 +40,56 @@ class AutoCompleteDeviceFieldState extends State { _controller?.dispose(); super.dispose(); } - @override Widget build(BuildContext context) { _settingProvider = Provider.of(context); + _userProvider = Provider.of(context); _devicesProvider = Provider.of(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( 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??""); }, ), );