handleError method

Future<void> handleError(
  1. DioError e,
  2. ErrorInterceptorHandler handler
)

Implementation

Future<void> handleError(DioError e, ErrorInterceptorHandler handler) async {
  try {
    var dio2 = Dio();
    final prefs = await SharedPreferences.getInstance();
    var rt = prefs.getString(prefixRefreshToken);
    var ua = prefs.getString("ua");
    final info = await PackageInfo.fromPlatform();

    //check enc
    Map<String, Object?>? keySet;
    var headers = {
      "User-Agent": ua,
      "x-app-id": info.packageName,
      "accept": defaultType,
      Headers.contentTypeHeader: defaultType
    };

    var dataRefresh = {"refreshToken": rt};
    //check enc
    if (commonEncMode) {
      keySet = await payloadEnc.generateKeyPair();
      var encryptData = await payloadEnc.encryptData(dataRefresh, keySet);
      var newPayload = {"cipherText": encryptData};
      dataRefresh = newPayload;
      final base64Str = buildEncKeyHeader(keySet);
      headers = {...headers, encryptionKeyLabel: base64Str};
    }

    var response = await dio2.request(
      appUrl + "/services/auth",
      data: dataRefresh,
      options: Options(method: "PATCH", headers: headers),
    );
    // print(response.requestOptions);
    // print(response);

    //check enc
    if (commonEncMode) {
      var ct = chiperType.fromJson(response.data);
      // print(ct.cipherText);

      var decrypt = await payloadEnc.decryptData(ct.cipherText!, keySet!);
      var jsondecode = json.decode(decrypt);

      response.data = jsondecode;
    }

    var res = RefreshTokenResponse.fromJson(response.data);

    //set new token & expiry
    prefs.setString(prefixRefreshToken, res.data!.attributes!.refreshToken!);
    prefs.setString(prefixAccessToken, res.data!.attributes!.accessToken!);
    prefs.setString(prefixExpiryToken, res.data!.attributes!.expiry!);

    var atNew = res.data!.attributes!.accessToken!;

    //retry new request

    //set bearer
    e.requestOptions.headers["Authorization"] = "Bearer " + atNew;
    //create request with new access token
    final opts = new Options(
        method: e.requestOptions.method, headers: e.requestOptions.headers);
    final cloneReq = await dio.request(e.requestOptions.path,
        options: opts,
        data: e.requestOptions.data,
        queryParameters: e.requestOptions.queryParameters);
    return handler.resolve(cloneReq);
  } on DioError catch (e) {
    // print(e.message);
    // print("ERROR--HANDLE");
    var title = e.response!.data["errors"]![0];
    if (title["code"] == "IVREF") {
      var evtCb = opts!.options?.eventCallback;
      evtCb({"name": "invalid_refresh_token"});
    }
    handler.reject(e);
  }
}