callWithDeviceToken static method

Future<AppticsResponse?> callWithDeviceToken({
  1. String? userId,
  2. required Function httpCall,
})

Implementation

static Future<AppticsResponse?> callWithDeviceToken({
  String? userId,
  required Function httpCall
}) async {

  try {
    final validConfigs = await AppticsConfigs.getValidConfigs();
    if (validConfigs == null) {
      return AppticsResponse.failureResponse();
    }

    AppticsDeviceInfo? deviceInfo = await AppticsDeviceRegistrar().syncDevice();
    if (deviceInfo == null) {
      return AppticsResponse.failureResponse();
    }

    AppticsUser? userInfo;
    String? token;
    if (userId != null) {
      userInfo = await AppticsUserManager().syncUser(userId);
      if (userInfo == null) {
        return null;
      }
      token = await AppticsBearerManager().getBearerToken(deviceInfo.deviceId, false);
    } else {
      token = await AppticsBearerManager().getBearerToken(deviceInfo.anonymousId, false);
    }

    if (token == null) {
      return AppticsResponse.failureResponse();
    }

    var request = httpCall(validConfigs, token , deviceInfo, userInfo?.appticsUserId);
    var url = Uri.https(
      request.baseDomain,
      request.urlPath,
      request.queryParams
    );
    AppticsDebugLog.info(url.toString());

    var response = await http.post(url, headers: request.headers, body: request.body);
    AppticsDebugLog.info(response.body);
    try {
      final appticsResponse = AppticsResponse.fromJson(jsonDecode(response.body));
      if (appticsResponse.statusCode == AppticsStatusCodes.SessionTokenExpired) {
        String? refreshedToken;
        if (userId != null) {
          refreshedToken = await AppticsBearerManager().getBearerToken(deviceInfo.deviceId, true);
        } else {
          refreshedToken = await AppticsBearerManager().getBearerToken(deviceInfo.anonymousId, true);
        }

        if (refreshedToken != null) {
          var retryRequest = httpCall(validConfigs, token , deviceInfo, userInfo?.appticsUserId);
          var retryResponse = await http.post(url, headers: retryRequest.headers, body: retryRequest.body);
          AppticsDebugLog.info(retryResponse.body);
          return Future.value(AppticsResponse.fromJson(jsonDecode(retryResponse.body)));
        }

        return Future.value(AppticsResponse.failureResponse());
      }
    } catch(e) {
      AppticsDebugLog.error(e.toString());
    }

    return Future.value(AppticsResponse.fromJson(jsonDecode(response.body)));
  } catch (exeception) {
    AppticsDebugLog.error('Exception while syncing $exeception');
  }

  return Future.value(AppticsResponse.failureResponse());
}