import 'dart:convert'; import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; import 'package:http/http.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/main.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/new_views/pages/login_page.dart'; class ApiManager { ApiManager._(); Map get _headers => { 'Content-Type': 'application/json', if (user != null) 'Authorization': 'Bearer ${user.token}', if (assetGroup != null) 'AssetGroup': assetGroup.id.toString(), }; static ApiManager instance = ApiManager._(); User user; AssetGroup assetGroup; Future get( String url, { Map headers, enableToastMessage = true, }) async { headers ??= {}; headers.addAll(_headers); Uri _url = Uri.parse(url); http.Response response = await http.get(_url, headers: headers); try { if (response.statusCode == 401) { showLoginDialog(); } else { if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; if (message != null && message.toString().isNotEmpty) { Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } } } catch (ex) {} return response; } Future post( String url, { Map headers, @required Map body, }) async { headers ??= {}; headers.addAll(_headers); Uri _url = Uri.parse(url); if (!kReleaseMode) { print("URL:$_url"); print("Headers:$headers"); print("Body:$body"); } var request = http.Request('POST', _url); request.body = json.encode(body); request.headers.addAll(headers); http.StreamedResponse _streamedResponse = await request.send(); http.Response response = await http.Response.fromStream(_streamedResponse); try { if (response.statusCode == 401) { showLoginDialog(); } else { if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; if (message != null && message.toString().isNotEmpty) { Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } } } catch (ex) {} return response; } Future postWithOutBody( String url, { Map headers, }) async { headers ??= {}; headers.addAll(_headers); Uri _url = Uri.parse(url); if (!kReleaseMode) { print("URL:$_url"); print("Headers:$headers"); } var request = http.Request('POST', _url); request.headers.addAll(headers); http.StreamedResponse _streamedResponse = await request.send(); http.Response response = await http.Response.fromStream(_streamedResponse); try { if (response.statusCode == 401) { showLoginDialog(); } else { if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; if (message != null && message.toString().isNotEmpty) { Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } } } catch (ex) {} return response; } Future put( String url, { Map headers, @required Map body, }) async { headers ??= {}; headers.addAll(_headers); Uri _url = Uri.parse(url); print(_url); // print(headers); // log(json.encode(body)); var request = http.Request('PUT', _url); request.body = json.encode(body); request.headers.addAll(headers); http.StreamedResponse streamedResponse = await request.send(); http.Response response = await http.Response.fromStream(streamedResponse); try { if (response.statusCode == 401) { showLoginDialog(); } else { if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; if (message != null && message.toString().isNotEmpty) { Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } } } catch (ex) {} return response; } Future multiPart( String url, { Map headers, @required Map body, @required List> files, }) async { Map _headers = const { 'Content-Type': 'multipart/form-data', }; headers ??= {}; headers.addAll(_headers); Uri _url = Uri.parse(url); // print(_url); // print(_headers); // print(json.encode(body)); var request = http.MultipartRequest('POST', _url); request.fields.addAll(body); request.headers.addAll(_headers); for (var element in files) { request.files.add(await element); } //request.files.addAll(_files); // print(request.files); http.StreamedResponse streamedResponse = await request.send(); http.Response response = await http.Response.fromStream(streamedResponse); try { if (response.statusCode == 401) { showLoginDialog(); } else { if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; if (message != null && message.toString().isNotEmpty) { Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } } } catch (ex) {} return response; } void showLoginDialog() { showDialog( context: navigatorKey.currentContext, barrierDismissible: false, builder: (_) => Platform.isIOS ? CupertinoAlertDialog( title: Text('Session Expired'), content: Text('Login session is expired,\nPlease login.'), //actionsAlignment: MainAxisAlignment.center, actions: [ CupertinoButton( child: Text("Login"), onPressed: () { logout(navigatorKey.currentContext); }, ) ], ) : AlertDialog( title: Text('Session Expired'), content: Text('Login session is expired,\nPlease login.'), actionsAlignment: MainAxisAlignment.center, contentPadding: EdgeInsets.only(left: 24.0, top: 20.0, right: 24.0, bottom: 16.0), actions: [ FilledButton( child: Text("Login"), onPressed: () { logout(navigatorKey.currentContext); }, ) ], )); } void logout(context) async { await Provider.of(context, listen: false).resetSettings(); Provider.of(context, listen: false).reset(); Navigator.pop(context); Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); } }