connect static method
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;
}
}