From ca3c93ad6eb46b9d16c37aad61c7a4c8662db2ce Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 1 Mar 2023 11:43:35 +0300 Subject: [PATCH] New Service Screen --- .../providers/api/devices_provider.dart | 19 +-- .../departments/department_button.dart | 14 +-- .../widgets/equipment/device_button.dart | 19 ++- .../equipment/single_device_picker.dart | 109 ++++++++---------- .../widgets/loaders/loading_manager.dart | 29 +++-- 5 files changed, 83 insertions(+), 107 deletions(-) diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 150acfdc..7b834763 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -42,10 +42,7 @@ class DevicesProvider extends ChangeNotifier { /// 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 getEquipment( - {required String host, - required User user, - required String hospitalId}) async { + Future getEquipment({required String host, required User user, required String hospitalId}) async { if (_loading == true) { return -2; } @@ -67,8 +64,7 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(utf8.decode(response.bodyBytes)); - _devices = - equipmentListJson.map((device) => Device.fromJson(device)).toList(); + _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); } _loading = false; notifyListeners(); @@ -98,9 +94,7 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - page = categoriesListJson - .map((device) => Device.fromJson(device)) - .toList(); + page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); } return page; } catch (error) { @@ -122,8 +116,7 @@ class DevicesProvider extends ChangeNotifier { Response response; try { response = await get( - Uri.parse( - "$host${URLs.getEquipment}?client=$hospitalId${sn.isEmpty ? "" : "&serial_qr=$sn"}"), + Uri.parse("$host${URLs.getEquipment}?client=$hospitalId${sn.isEmpty ? "" : "&serial_qr=$sn"}"), ); _stateCode = response.statusCode; @@ -131,9 +124,7 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - page = categoriesListJson - .map((device) => Device.fromJson(device)) - .toList(); + page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); } return page; } catch (error) { diff --git a/lib/views/widgets/departments/department_button.dart b/lib/views/widgets/departments/department_button.dart index e020f661..77040e7f 100644 --- a/lib/views/widgets/departments/department_button.dart +++ b/lib/views/widgets/departments/department_button.dart @@ -8,18 +8,18 @@ import '../../app_style/sizing.dart'; import 'single_department_picker.dart'; class DepartmentButton extends StatelessWidget { - final Function(Department)? onDepartmentPick; + final Function(Department) onDepartmentPick; final Department? department; - const DepartmentButton({Key? key, this.department, this.onDepartmentPick}) : super(key: key); + const DepartmentButton({Key? key, this.department, required this.onDepartmentPick}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; + Subtitle? subtitle = AppLocalization.of(context)?.subtitle; return ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), @@ -32,7 +32,7 @@ class DepartmentButton extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( - department?.name ?? _subtitle?.pickUnite??"", + department?.name ?? subtitle?.pickUnite ?? "", style: Theme.of(context).textTheme.bodyText1, textScaleFactor: AppStyle.getScaleFactor(context), textDirection: TextDirection.rtl, @@ -44,8 +44,8 @@ class DepartmentButton extends StatelessWidget { ], ), onPressed: () async { - Department _department = await Navigator.of(context).pushNamed(SingleDepartmentPicker.id) as Department; - onDepartmentPick!(_department); + Department department = await Navigator.of(context).pushNamed(SingleDepartmentPicker.id) as Department; + onDepartmentPick(department); }); } } diff --git a/lib/views/widgets/equipment/device_button.dart b/lib/views/widgets/equipment/device_button.dart index 3bf97309..6c5c9f93 100644 --- a/lib/views/widgets/equipment/device_button.dart +++ b/lib/views/widgets/equipment/device_button.dart @@ -8,11 +8,10 @@ import '../../app_style/sizing.dart'; import 'single_device_picker.dart'; class DeviceButton extends StatelessWidget { - final Function(Device)? onDevicePick; + final Function(Device?) onDevicePick; final Device? device; - const DeviceButton({Key? key, required this.device, this.onDevicePick}) - : super(key: key); + const DeviceButton({Key? key, required this.device, required this.onDevicePick}) : super(key: key); @override Widget build(BuildContext context) { @@ -20,11 +19,9 @@ class DeviceButton extends StatelessWidget { return ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, - padding: EdgeInsets.symmetric( - horizontal: 16, vertical: device == null ? 12 : 8), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: device == null ? 12 : 8), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), foregroundColor: AColors.primaryColor, backgroundColor: AColors.inputFieldBackgroundColor, @@ -71,14 +68,12 @@ class DeviceButton extends StatelessWidget { ], ), )), - const Icon(Icons.keyboard_arrow_down, - size: 28, color: AColors.grey3A), + const Icon(Icons.keyboard_arrow_down, size: 28, color: AColors.grey3A), ], ), onPressed: () async { - Device _device = await Navigator.of(context) - .pushNamed(SingleDevicePicker.id) as Device; - onDevicePick!(_device); + Device? device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device?; + onDevicePick(device); }); } } diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 10649db0..a12cc52d 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -14,9 +14,13 @@ import '../loaders/loading_manager.dart'; import '../loaders/no_item_found.dart'; import '../qr/scan_qr.dart'; import 'device_item.dart'; + class SingleDevicePicker extends StatefulWidget { - static final String id = "/single-device-Picker"; + static const String id = "/single-device-Picker"; final bool sandraChoice = true; + + const SingleDevicePicker({super.key}); + @override _SingleDevicePickerState createState() => _SingleDevicePickerState(); } @@ -25,28 +29,23 @@ class _SingleDevicePickerState extends State { DevicesProvider? _devicesProvider; UserProvider? _userProvider; SettingProvider? _settingProvider; - List _searchableList = []; + final List _searchableList = []; bool _firstTime = true; Subtitle? _subtitle; - _getDevice(String result) async { - if(result == null) return; + _getDevice(String? result) async { + if (result == null) return; showDialog( barrierDismissible: false, context: context, - builder: (dialogContext){ + builder: (dialogContext) { return const Center(child: CircularProgressIndicator()); - } - ); - List devices = await _devicesProvider!.getDevicesListBySN( - host: _settingProvider?.host??"", - user: _userProvider?.user??User(), - hospitalId: _userProvider?.user?.hospital?.id??"", - sn: result - ); + }); + List devices = + await _devicesProvider!.getDevicesListBySN(host: _settingProvider?.host ?? "", user: _userProvider?.user ?? User(), hospitalId: _userProvider?.user?.hospital?.id ?? "", sn: result); Navigator.of(context).pop(); - if(devices.isEmpty){ - Fluttertoast.showToast(msg: _subtitle?.noDeviceFound??""); + if (devices.isEmpty) { + Fluttertoast.showToast(msg: _subtitle?.noDeviceFound ?? ""); return; } Navigator.of(context).pop(devices.first); @@ -68,58 +67,48 @@ class _SingleDevicePickerState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - if(_firstTime && _devicesProvider?.devices != null){ - _searchableList.addAll(_devicesProvider?.devices??[]); - _firstTime = false; - } _subtitle = AppLocalization.of(context)?.subtitle; return Scaffold( resizeToAvoidBottomInset: false, body: LoadingManager( - isLoading: _devicesProvider?.isLoading??false, - stateCode: _devicesProvider?.stateCode??0, + isLoading: _devicesProvider?.isLoading, + stateCode: _devicesProvider?.stateCode, isFailedLoading: _devicesProvider?.devices == null, onRefresh: () async { _devicesProvider?.reset(); - await _devicesProvider?.getEquipment( - user: _userProvider?.user??User(), - host: _settingProvider?.host??"", - hospitalId: _userProvider?.user?.hospital?.id??"" - ); + await _devicesProvider?.getEquipment(user: _userProvider?.user ?? User(), host: _settingProvider?.host ?? "", hospitalId: _userProvider?.user?.hospital?.id ?? ""); + if (_firstTime) { + _searchableList.addAll(_devicesProvider?.devices ?? []); + _firstTime = false; + } }, child: Column( children: [ const SizedBox(height: 48), Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Column( children: [ ATextFormField( - hintText: _subtitle?.searchBySn??"", - style: Theme.of(context).textTheme.subtitle1, + hintText: _subtitle?.searchBySn ?? "", + style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ + onChange: (value) { _searchableList.clear(); - _searchableList.addAll(_devicesProvider!.devices!.where( - (element) => element.serialNumber!.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); + _searchableList.addAll(_devicesProvider!.devices!.where((element) => element.serialNumber!.toLowerCase().contains(value.toLowerCase())).toList()); setState(() {}); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ATextFormField( hintText: "Search by Number", - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ + onChange: (value) { _searchableList.clear(); - _searchableList.addAll(_devicesProvider!.devices!.where( - (element) => element.number!.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); + _searchableList.addAll(_devicesProvider!.devices!.where((element) => element.number!.toLowerCase().contains(value.toLowerCase())).toList()); setState(() {}); }, ), @@ -127,21 +116,23 @@ class _SingleDevicePickerState extends State { ), ), Expanded( - child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle?.noDeviceFound??"",): - ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext,itemIndex){ - return DeviceItem( - device: _searchableList[itemIndex], - onPressed: (device){ - Navigator.of(context).pop(device); - }, - ); - }, - ), + child: _searchableList.isEmpty + ? NoItemFound( + message: _subtitle?.noDeviceFound ?? "", + ) + : ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext, itemIndex) { + return DeviceItem( + device: _searchableList[itemIndex], + onPressed: (device) { + Navigator.of(context).pop(device); + }, + ); + }, + ), ), ], ), @@ -151,7 +142,7 @@ class _SingleDevicePickerState extends State { child: const Icon(Icons.qr_code_scanner), onPressed: () async { String result = await Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> ScanQr()), + MaterialPageRoute(builder: (_) => ScanQr()), ) as String; _getDevice(result); }, diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index 83403ee0..83ce2833 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/lib/views/widgets/loaders/loading_manager.dart @@ -5,6 +5,7 @@ import '../../../controllers/localization/localization.dart'; import '../../../models/subtitle.dart'; import 'app_loading.dart'; import 'failed_loading.dart'; + class LoadingManager extends StatefulWidget { final bool? isLoading; final bool? isFailedLoading; @@ -15,13 +16,13 @@ class LoadingManager extends StatefulWidget { final Future Function()? onRefresh; final Widget? child; - LoadingManager({ + const LoadingManager({ Key? key, - this.isLoading, - this.isFailedLoading, - this.stateCode, - this.onRefresh, - this.child, + this.isLoading, + this.isFailedLoading, + this.stateCode, + this.onRefresh, + this.child, this.progress, this.isNotPage = false, this.askOnBack = false, @@ -32,10 +33,9 @@ class LoadingManager extends StatefulWidget { } class _LoadingManagerState extends State { - @override void initState() { - if(widget.onRefresh != null && widget.stateCode == null){ + if (widget.onRefresh != null && widget.stateCode == null) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onRefresh!(); }); @@ -48,7 +48,7 @@ class _LoadingManagerState extends State { Subtitle? subtitle = AppLocalization.of(context)?.subtitle; Widget? placeHolder; // to load data if load not start - if(widget.isLoading == false && widget.stateCode == null){ + if (widget.isLoading == false && widget.stateCode == null) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onRefresh!(); }); @@ -56,20 +56,19 @@ class _LoadingManagerState extends State { // if loading of still not start in loading (true or null) // return loading widget - if(widget.isLoading != false || widget.stateCode == null){ - placeHolder = ALoading(); - }else if((widget.isFailedLoading??false) && !(widget.isNotPage??false)){ + if (widget.isLoading != false || widget.stateCode == null) { + placeHolder = const ALoading(); + } else if ((widget.isFailedLoading ?? false) && !(widget.isNotPage ?? false)) { // if failed return failed widget placeHolder = FailedLoading( - message: HttpStatusManger.getStatusMessage( - status: widget.stateCode, subtitle: subtitle), + message: HttpStatusManger.getStatusMessage(status: widget.stateCode, subtitle: subtitle), onReload: widget.onRefresh, ); } // if load end successfully return loaded widget return RefreshIndicator( - onRefresh: () async{ + onRefresh: () async { await widget.onRefresh!(); }, child: AnimatedSwitcher(