connect static method

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

The primary method to get a connected DropboxProvider instance. It now handles token storage internally.

Implementation

static Future<DropboxProvider?> connect({
  required String appKey,
  required String appSecret,
  required String redirectUri,
}) async {
  if (appKey.isEmpty || appSecret.isEmpty) {
    throw ArgumentError(
        'App registration required: https://www.dropbox.com/developers/apps');
  }
  if (redirectUri.isEmpty) {
    throw ArgumentError(
        "redirectUri is empty. Please ensure your redirect URI is correctly configured as per the package documentation.");
  }
  final provider = DropboxProvider._create(
    appKey: appKey,
    appSecret: appSecret,
    redirectUri: redirectUri,
  );

  // Attempt to load token from secure storage
  DropboxToken? storedToken = await provider._getToken();
  if (storedToken != null) {
    provider._token = storedToken;
    try {
      if (provider._token!.isExpired) {
        debugPrint(
            "DropboxProvider: Stored token is expired, attempting refresh...");
        await provider._refreshToken();
        await provider
            ._saveToken(provider._token); // Save the refreshed token
      }
      await provider._fetchCurrentUserAccount();
      provider._isAuthenticated = true;
      debugPrint(
          "DropboxProvider: Silent sign-in successful for ${provider._account?.email}");
      return provider;
    } catch (e) {
      debugPrint(
          "DropboxProvider: Silent sign-in failed ($e). Clearing token and proceeding to interactive login.");
      await provider._clearToken();
      provider._token = null;
      // CHANGE 2: Explicitly reset auth flag on failure to ensure clean state.
      provider._isAuthenticated = false;
    }
  }

  debugPrint(
      "DropboxProvider: No valid token found. Starting interactive login.");
  try {
    final authCode = await provider._getAuthCodeViaInteractiveFlow();

    if (authCode == null) {
      debugPrint("DropboxProvider: Interactive login cancelled by user.");
      return null; // User cancelled the flow
    }

    await provider._completeConnection(authCode);
    await provider._saveToken(provider._token); // Save the new token

    debugPrint(
        "DropboxProvider: Interactive login successful for ${provider._account?.email}");
    return provider;
  } catch (e) {
    debugPrint("DropboxProvider: Interactive login failed. Error: $e");
    await provider._clearToken();
    return null;
  }
}