get device list & get device list by serial number

merge-requests/12/head
zaid_daoud 3 years ago
parent b65158322c
commit 5f78d7e164

@ -14,15 +14,39 @@ class DevicesApiClient {
factory DevicesApiClient() => _instance; factory DevicesApiClient() => _instance;
/// Fetch devices and insert the result into [devices] list /// Fetch devices by [hospitalId] and insert the result into [devices] list
Future getEquipment(String hospitalId) async { Future getEquipment(String hospitalId) async {
final response = await ApiClient().getJsonForResponse(URLs.host1 + URLs.getEquipment, queryParameters: {'client': hospitalId}); final response = await ApiClient().getJsonForResponse(URLs.host1 + URLs.getEquipment, queryParameters: {'client': hospitalId});
if (response.statusCode >= 200 && response.statusCode < 300) { List equipmentListJson = json.decode(utf8.decode(response.bodyBytes));
// client's request was successfully received devices.clear();
List equipmentListJson = json.decode(utf8.decode(response.bodyBytes)); devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList());
devices.clear(); debugPrint("devices : ${devices.length}");
devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); }
debugPrint("devices : ${devices.length}");
} /// Returns a list of devices by [hospitalId] and [serialNumber] (or | and) [number]
Future<List<Device>> getDevicesList({required String hospitalId, String? serialNumber, String? number}) async {
final response = await ApiClient().getJsonForResponse(
URLs.host1 + URLs.getEquipment,
queryParameters: {
'client': hospitalId,
if (serialNumber?.isEmpty == false) 'name': serialNumber,
if (number?.isEmpty == false) 'number': number,
},
);
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
return categoriesListJson.map((device) => Device.fromJson(device)).toList();
}
/// Returns a list of devices by [hospitalId] (and optionally) [serialNumber]
Future<List<Device>> getDevicesListBySN({required String hospitalId, required String serialNumber}) async {
final response = await ApiClient().getJsonForResponse(
URLs.host1 + URLs.getEquipment,
queryParameters: {
'client': hospitalId,
if (serialNumber.isNotEmpty) 'serial_qr': serialNumber,
},
);
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
return categoriesListJson.map((device) => Device.fromJson(device)).toList();
} }
} }

@ -1,12 +1,7 @@
import 'dart:convert';
import 'package:http/http.dart';
import 'package:test_sa/api/devices_api_client.dart'; import 'package:test_sa/api/devices_api_client.dart';
import 'package:test_sa/controllers/providers/loading_notifier.dart'; import 'package:test_sa/controllers/providers/loading_notifier.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
import '../../../models/user.dart';
import '../../api_routes/urls.dart';
class DevicesProvider extends LoadingNotifier { class DevicesProvider extends LoadingNotifier {
final List<Device> _searchableList = []; final List<Device> _searchableList = [];
@ -50,67 +45,19 @@ class DevicesProvider extends LoadingNotifier {
} }
} }
/// return -2 if request in progress /// Returns a list of devices by [hospitalId] and [serialNumber] (or | and) [number]
/// return -1 if error happen when sending request ///
/// return state code if request complete may be 200, 404 or 403 /// ### NOTE : if [hospitalId] is [NULL] empty list will be returned
/// for more details check http state manager Future<List<Device>> getDevicesList({required String? hospitalId, String? serialNumber, String? number}) {
/// lib\controllers\http_status_manger\http_status_manger.dart if (hospitalId == null) return Future.value(const []);
Future<List<Device>> getDevicesList({ return DevicesApiClient().getDevicesList(hospitalId: hospitalId, serialNumber: serialNumber, number: number);
required String host,
required User user,
required String hospitalId,
String? serialNumber,
String? number,
}) async {
Response response;
try {
response = await get(
Uri.parse("$host${URLs.getEquipment}?client=$hospitalId"
"${serialNumber?.isEmpty == false ? "&name=$serialNumber" : ""}"
"${number?.isEmpty == false ? "&number=$number" : ""}"),
);
List<Device> page = [];
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();
}
return page;
} catch (error) {
return [];
}
} }
/// return -2 if request in progress /// Returns a list of devices by [hospitalId] (and optionally) [serialNumber]
/// return -1 if error happen when sending request ///
/// return state code if request complete may be 200, 404 or 403 /// ### NOTE : if [hospitalId] is [NULL] empty list will be returned
/// for more details check http state manager Future<List<Device>> getDevicesListBySN({required String? hospitalId, required String serialNumber}) {
/// lib\controllers\http_status_manger\http_status_manger.dart if (hospitalId == null) return Future.value(const []);
Future<List<Device>> getDevicesListBySN({ return DevicesApiClient().getDevicesListBySN(hospitalId: hospitalId, serialNumber: serialNumber);
required String host,
required User user,
required String hospitalId,
required String sn,
}) async {
Response response;
try {
response = await get(
Uri.parse("$host${URLs.getEquipment}?client=$hospitalId${sn.isEmpty ? "" : "&serial_qr=$sn"}"),
);
_stateCode = response.statusCode;
List<Device> page = [];
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();
}
return page;
} catch (error) {
stopLoading();
_stateCode = -1;
notifyListeners();
return [];
}
} }
} }

@ -1,12 +1,9 @@
import 'package:flutter/material.dart'; 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 '../../../controllers/providers/api/devices_provider.dart'; import '../../../controllers/providers/api/devices_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
import '../../../models/user.dart';
import '../../app_style/colors.dart'; import '../../app_style/colors.dart';
import '../../app_style/sizing.dart'; import '../../app_style/sizing.dart';
@ -22,7 +19,6 @@ class AutoCompleteDeviceField extends StatefulWidget {
} }
class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> { class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
SettingProvider? _settingProvider;
DevicesProvider? _devicesProvider; DevicesProvider? _devicesProvider;
TextEditingController? _controller; TextEditingController? _controller;
@ -40,7 +36,6 @@ class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
@ -63,12 +58,7 @@ class AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
), ),
suggestionsCallback: (value) async { suggestionsCallback: (value) async {
return await _devicesProvider!.getDevicesList( return await _devicesProvider!.getDevicesList(hospitalId: widget.hospitalId, serialNumber: value);
host: _settingProvider?.host ?? "",
user: UserApiClient().user ?? User(),
hospitalId: widget.hospitalId ?? "",
serialNumber: value,
);
}, },
itemBuilder: (context, device) { itemBuilder: (context, device) {
return ListTile( return ListTile(

@ -6,10 +6,8 @@ import 'package:test_sa/api/user_api_client.dart';
import '../../../controllers/localization/localization.dart'; import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/devices_provider.dart'; import '../../../controllers/providers/api/devices_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
import '../../../models/subtitle.dart'; import '../../../models/subtitle.dart';
import '../../../models/user.dart';
import '../app_text_form_field.dart'; import '../app_text_form_field.dart';
import '../loaders/loading_manager.dart'; import '../loaders/loading_manager.dart';
import '../loaders/no_item_found.dart'; import '../loaders/no_item_found.dart';
@ -28,7 +26,6 @@ class SingleDevicePicker extends StatefulWidget {
class SingleDevicePickerState extends State<SingleDevicePicker> { class SingleDevicePickerState extends State<SingleDevicePicker> {
late DevicesProvider _devicesProvider; late DevicesProvider _devicesProvider;
late SettingProvider _settingProvider;
Subtitle? _subtitle; Subtitle? _subtitle;
_getDevice(String? result) async { _getDevice(String? result) async {
@ -39,8 +36,7 @@ class SingleDevicePickerState extends State<SingleDevicePicker> {
builder: (dialogContext) { builder: (dialogContext) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
}); });
List<Device> devices = List<Device> devices = await _devicesProvider.getDevicesListBySN(hospitalId: UserApiClient().user?.hospital?.id ?? "", serialNumber: result);
await _devicesProvider.getDevicesListBySN(host: _settingProvider.host ?? "", user: UserApiClient().user ?? User(), hospitalId: UserApiClient().user?.hospital?.id ?? "", sn: result);
Navigator.of(context).pop(); Navigator.of(context).pop();
if (devices.isEmpty) { if (devices.isEmpty) {
Fluttertoast.showToast(msg: _subtitle?.noDeviceFound ?? ""); Fluttertoast.showToast(msg: _subtitle?.noDeviceFound ?? "");
@ -63,7 +59,6 @@ class SingleDevicePickerState extends State<SingleDevicePicker> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context)?.subtitle; _subtitle = AppLocalization.of(context)?.subtitle;
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,

@ -2,13 +2,9 @@ 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 '../../../../api/user_api_client.dart';
import '../../../../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/device/device.dart';
import '../../../../models/lookup.dart'; import '../../../../models/lookup.dart';
import '../../../../models/user.dart';
import '../../../app_style/colors.dart'; import '../../../app_style/colors.dart';
import '../../../app_style/sizing.dart'; import '../../../app_style/sizing.dart';
@ -24,9 +20,7 @@ class AutoCompleteDeviceNumberField extends StatefulWidget {
} }
class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumberField> { class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumberField> {
late SettingProvider _settingProvider;
late DevicesProvider _devicesProvider; late DevicesProvider _devicesProvider;
late UserProvider _userProvider;
late TextEditingController _controller; late TextEditingController _controller;
@override @override
@ -43,10 +37,7 @@ class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumber
@override @override
Widget build(BuildContext context) { Widget build(BuildContext 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(
@ -56,7 +47,7 @@ class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumber
boxShadow: const [AppStyle.boxShadow]), boxShadow: const [AppStyle.boxShadow]),
child: TypeAheadField<Device>( child: TypeAheadField<Device>(
textFieldConfiguration: TextFieldConfiguration( textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.titleLarge,
controller: _controller, controller: _controller,
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: const InputDecoration( decoration: const InputDecoration(
@ -68,12 +59,7 @@ class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumber
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
), ),
suggestionsCallback: (vale) async { suggestionsCallback: (vale) async {
return await _devicesProvider.getDevicesList( return await _devicesProvider.getDevicesList(hospitalId: widget.hospitalId, number: vale);
host: _settingProvider.host ?? "",
user: UserApiClient().user ?? User(),
hospitalId: widget.hospitalId ?? "",
number: vale,
);
}, },
itemBuilder: (context, device) { itemBuilder: (context, device) {
return ListTile( return ListTile(

Loading…
Cancel
Save