connect static method

Future<OneDriveProvider?> connect({
  1. required String clientId,
  2. required String redirectUri,
  3. required BuildContext context,
  4. String? scopes,
})

Connects to OneDrive, handling both silent and interactive authentication.

Implementation

static Future<OneDriveProvider?> connect({
  required String clientId,
  required String redirectUri,
  required BuildContext context,
  String? scopes,
}) async {
  // Client ID is mandatory for Azure App registration.
  if (clientId.trim().isEmpty) {
    throw ArgumentError(
        'App registration required: https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade');
  }
  // Provides a fallback native client redirect URI if none is supplied.
  if (redirectUri.isEmpty) {
    redirectUri =
        'https://login.microsoftonline.com/common/oauth2/nativeclient';
  }
  try {
    final provider = OneDriveProvider._create(
        clientId: clientId, redirectUri: redirectUri, context: context);
    // Configure the client with appropriate scopes based on the desired access level.
    provider.client = OneDrive(
      clientID: clientId,
      redirectURL: redirectUri,
      scopes: scopes ??
          "${MultiCloudStorage.cloudAccess == CloudAccessType.appStorage ? OneDrive.permissionFilesReadWriteAppFolder : OneDrive.permissionFilesReadWriteAll} offline_access User.Read Sites.ReadWrite.All",
    );
    // 1. First, attempt to connect silently using a stored token.
    if (await provider.client.isConnected()) {
      provider._isAuthenticated = true;
      debugPrint("OneDriveProvider: Silently connected successfully.");
      return provider;
    }
    // 2. If silent connection fails, fall back to interactive login via a WebView.
    debugPrint(
        "OneDriveProvider: Not connected, attempting interactive login...");
    if (await provider.client.connect(context) == false) {
      debugPrint(
          "OneDriveProvider: Interactive login failed or was cancelled.");
      return null; // User cancelled or login failed.
    }
    provider._isAuthenticated = true;
    debugPrint("OneDriveProvider: Interactive login successful.");
    return provider;
  } on SocketException catch (e) {
    debugPrint('No connection detected.');
    throw NoConnectionException(e.message);
  } catch (e) {
    debugPrint('Exception ${e.toString()}');
    rethrow;
  }
}