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/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index b39505ee..683755f1 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -30,7 +30,6 @@ import '../../../widgets/status/service_request/service_request_defect_types_mun import '../../../widgets/status/service_request/service_request_priority_mune.dart'; import '../../../widgets/titles/app_sub_title.dart'; - class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @@ -46,7 +45,7 @@ class _CreateRequestPageState extends State { ServiceRequest _serviceRequest = ServiceRequest(); List _deviceImages = []; bool _isLoading = false; - late Device _device; + Device? _device; late Subtitle _subtitle; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @@ -101,7 +100,12 @@ class _CreateRequestPageState extends State { padding: const EdgeInsets.all(8.0), child: Text( _subtitle.newServiceRequest, - style: Theme.of(context).textTheme.headline5?.copyWith(color: AColors.cyan, fontWeight: FontWeight.w600), + style: Theme.of(context) + .textTheme + .headline5 + ?.copyWith( + color: AColors.cyan, + fontWeight: FontWeight.w600), ), ), ), @@ -113,7 +117,9 @@ class _CreateRequestPageState extends State { ? SizedBox.shrink() : ATextFormField( enable: false, - initialValue: _userProvider.user?.hospital?.name ?? _subtitle.noHospitalFound, + initialValue: + _userProvider.user?.hospital?.name ?? + _subtitle.noHospitalFound, hintText: _subtitle.hospital, prefixIconData: FontAwesomeIcons.hospital, style: Theme.of(context).textTheme.subtitle1, @@ -123,7 +129,9 @@ class _CreateRequestPageState extends State { ? SizedBox.shrink() : ATextFormField( enable: false, - initialValue: _userProvider.user?.department?.name ?? _subtitle.noUniteFound, + initialValue: + _userProvider.user?.department?.name ?? + _subtitle.noUniteFound, hintText: _subtitle.unite, prefixIconData: FontAwesomeIcons.hospitalUser, style: Theme.of(context).textTheme.subtitle1, @@ -136,21 +144,29 @@ class _CreateRequestPageState extends State { setState(() {}); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Priority"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestPriorityMenu( initialValue: _serviceRequest.priority, - onSelect: (status){ + onSelect: (status) { _serviceRequest.priority = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Defect Type"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestDefectTypesMenu( initialValue: _serviceRequest.defectType, - onSelect: (status){ + onSelect: (status) { _serviceRequest.defectType = status; }, ), @@ -169,7 +185,9 @@ class _CreateRequestPageState extends State { prefixIconData: FontAwesomeIcons.triangleExclamation, style: Theme.of(context).textTheme.headline6, textInputType: TextInputType.multiline, - validator: (value) => Validator.hasValue(value!) ? '' : _subtitle.maintenanceIssueRequired, + validator: (value) => Validator.hasValue(value!) + ? '' + : _subtitle.maintenanceIssueRequired, onSaved: (value) { _serviceRequest.maintenanceIssue = value; }, @@ -186,19 +204,24 @@ class _CreateRequestPageState extends State { child: AButton( text: _subtitle.submit, onPressed: () async { - if (!(_formKey.currentState?.validate()??false)) return; + if (!(_formKey.currentState?.validate() ?? false)) + return; _formKey.currentState?.save(); _serviceRequest.deviceId = _device?.id ?? ""; _isLoading = true; setState(() {}); - _serviceRequest.devicePhotos = _deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList(); + _serviceRequest.devicePhotos = _deviceImages + .map((e) => base64Encode(e.readAsBytesSync())) + .toList(); if (_serviceRequest.audio != null) { final file = File(_serviceRequest.audio!); - _serviceRequest.audio = base64Encode(file.readAsBytesSync()); + _serviceRequest.audio = + base64Encode(file.readAsBytesSync()); } - int status = await _serviceRequestsProvider.createRequest( + int status = + await _serviceRequestsProvider.createRequest( user: _userProvider.user!, - host: _settingProvider.host??"", + host: _settingProvider.host ?? "", serviceRequest: _serviceRequest, ); _isLoading = false; @@ -209,7 +232,9 @@ class _CreateRequestPageState extends State { ); Navigator.of(context).pop(); } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + String errorMessage = + HttpStatusManger.getStatusMessage( + status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(errorMessage), )); 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 a33850a7..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,10 +67,6 @@ 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, @@ -81,45 +76,39 @@ class _SingleDevicePickerState extends State { 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 972728b9..567304e7 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)){ + 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(