You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			213 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			213 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Dart
		
	
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<String, String> get _headers => {
 | 
						|
        'Content-Type': 'application/json',
 | 
						|
        if (user != null) 'Authorization': 'Bearer ${user.token}',
 | 
						|
      };
 | 
						|
 | 
						|
  static ApiManager instance = ApiManager._();
 | 
						|
 | 
						|
  User user;
 | 
						|
 | 
						|
  Future<http.Response> get(
 | 
						|
    String url, {
 | 
						|
    Map<String, String> 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<String, dynamic>) {
 | 
						|
          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<http.Response> post(
 | 
						|
    String url, {
 | 
						|
    Map<String, String> headers,
 | 
						|
    @required Map<String, dynamic> 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<String, dynamic>) {
 | 
						|
          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<http.Response> put(
 | 
						|
    String url, {
 | 
						|
    Map<String, String> headers,
 | 
						|
    @required Map<String, dynamic> 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<String, dynamic>) {
 | 
						|
          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<http.Response> multiPart(
 | 
						|
    String url, {
 | 
						|
    Map<String, String> headers,
 | 
						|
    @required Map<String, String> body,
 | 
						|
    @required List<Future<MultipartFile>> files,
 | 
						|
  }) async {
 | 
						|
    Map<String, String> _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<String, dynamic>) {
 | 
						|
          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<SettingProvider>(context, listen: false).resetSettings();
 | 
						|
    Provider.of<UserProvider>(context, listen: false).reset();
 | 
						|
    Navigator.pop(context);
 | 
						|
    Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true);
 | 
						|
  }
 | 
						|
}
 |