import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; import '../../../models/device/device_transfer.dart'; import '../../../models/device/device_transfer_info.dart'; import '../../../models/user.dart'; import '../../api_routes/urls.dart'; class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data void reset() { items = null; nextPage = true; stateCode = null; } // state code of current request to defied error message // like 400 customer request failed // 500 service not available int? stateCode; // true if there is next page in product list and false if not bool? nextPage = true; // list of user requests List? items; // when requests in-process _loading = true // 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 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("\\", "")); List itemsPage = listJson .map((request) => DeviceTransfer.fromJson(request)) .toList(); items ??= []; items?.addAll(itemsPage); if (itemsPage.length == pageItemNumber) { nextPage = true; } else { nextPage = false; } } isLoading = false; notifyListeners(); return response.statusCode; } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } } Future createRequest({ required String host, required User? user, required DeviceTransfer model, }) 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, ); 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; } } Future updateRequest({ required String host, required User user, required bool isSender, required String requestId, 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; } } }