connect static method

Future<DropboxProvider?> connect({
  1. required String appKey,
  2. required String appSecret,
  3. required String redirectUri,
  4. bool forceInteractive = false,
})

Creates and authenticates a DropboxProvider instance. Handles both silent sign-in and interactive user login.

Implementation

static Future<DropboxProvider?> connect({
  required String appKey,
  required String appSecret,
  required String redirectUri,
  bool forceInteractive = false,
}) async {
  debugPrint('connect Dropbox, forceInteractive: $forceInteractive');
  if (appKey.isEmpty || appSecret.isEmpty || redirectUri.isEmpty) {
    debugPrint(
        'Dropbox connection failed: App Key, Secret, or Redirect URI is missing.');
    return null;
  }
  try {
    final provider = DropboxProvider._create(
        appKey: appKey, appSecret: appSecret, redirectUri: redirectUri);
    // If interactive login is forced, clear any existing credentials.
    if (forceInteractive) {
      debugPrint('Forcing interactive login, clearing existing token.');
      await provider._clearToken();
    }
    // Attempt to sign in silently with a stored token.
    DropboxToken? storedToken = await provider._getToken();
    if (storedToken != null) {
      provider._token = storedToken;
      if (provider._token!.isExpired) {
        debugPrint('Stored Dropbox token is expired, attempting refresh.');
        await provider._refreshToken();
        await provider._saveToken(provider._token);
      }
      await provider._fetchCurrentUserAccount();
      provider._isAuthenticated = true;
      debugPrint(
          'Dropbox silent sign-in successful for ${provider._account?.email}');
      return provider;
    }
    // If no token exists, start the interactive login flow.
    debugPrint('No valid token found. Starting interactive Dropbox login.');
    final authCode = await provider._getAuthCodeViaInteractiveFlow();
    if (authCode == null) {
      debugPrint('Interactive Dropbox login cancelled by user.');
      return null;
    }
    await provider._completeConnection(authCode);
    await provider._saveToken(provider._token);
    debugPrint(
        'Interactive Dropbox login successful for ${provider._account?.email}');
    return provider;
  } on SocketException catch (e) {
    debugPrint('No connection detected.');
    throw NoConnectionException(e.message);
  } catch (error) {
    debugPrint(
        'Error occurred during the Dropbox connect process. Clearing credentials.');
    rethrow;
  }
}