login method

Future<AuthResult> login (
  1. {bool forceLogin = false}
)

Logs the user Forces the user to enter their credentials to ensure the correct users account is authorized.

Implementation

Future<AuthResult> login({bool forceLogin = false}) async {
  try {
    final requestToken = await RequestToken.getRequestToken(
      apiKey,
      apiSecretKey,
      redirectURI,
      forceLogin,
    );
    String resultURI = '';
    if (Platform.isIOS) {
      resultURI = await _channel.invokeMethod('authentication', {
        'url': requestToken.authorizeURI,
        'redirectURL': redirectURI,
      });
    } else if (Platform.isAndroid) {
      final uri = Uri.parse(redirectURI);
      await _channel.invokeMethod('setScheme', uri.scheme);
      final completer = Completer<String>();
      final subscribe = _eventStream.listen((data) async {
        if (data['type'] == 'url') {
          completer.complete(data['url']?.toString());
        }
      });
      final browser = ChromeCustomTab(onClose: () {
        if (!completer.isCompleted) {
          completer.complete(null);
        }
      });
      await browser.open(url: requestToken.authorizeURI);
      resultURI = await completer.future;
      subscribe.cancel();
    } else {
      throw UnsupportedError('Not supported by this os.');
    }
    final queries = Uri.splitQueryString(Uri.parse(resultURI).query);
    if (queries['error'] != null) {
      throw Exception('Error Response: ${queries['error']}');
    }

    // The user cancelled the login flow.
    if (queries['denied'] != null) {
      throw CanceldByUserException();
    }

    final accessToken = await AccessToken.getAccessToken(
      apiKey,
      apiSecretKey,
      queries,
    );

    final userData = await User.getUserData(
      apiKey,
      apiSecretKey,
      accessToken.authToken,
      accessToken.authTokenSecret,
    );

    return AuthResult(
      accessToken: accessToken,
      authToken: accessToken.authToken,
      authTokenSecret: accessToken.authTokenSecret,
      status: TwitterLoginStatus.loggedIn,
      errorMessage: '',
      user: userData,
    );
  } on CanceldByUserException {
    return AuthResult(
      accessToken: null,
      authToken: null,
      authTokenSecret: null,
      status: TwitterLoginStatus.cancelledByUser,
      errorMessage: 'The user cancelled the login flow',
      user: null,
    );
  } catch (error) {
    return AuthResult(
      accessToken: null,
      authToken: null,
      authTokenSecret: null,
      status: TwitterLoginStatus.error,
      errorMessage: error.toString(),
      user: null,
    );
  }
}