checkPermission function

Future<int> checkPermission(
  1. CheckPermissionOptions options
)

Checks the permission based on the provided settings.

If permissionConfig and participantLevel are provided, uses the per-level configuration to determine permissions. Otherwise falls back to room-wide eventSettings (audioSetting, videoSetting, etc.).

Parameters:

  • options (CheckPermissionOptions): The options containing permission settings.

Returns:

  • A Future<int> representing the permission status:
    • 0: Permission is allowed.
    • 1: Permission requires approval.
    • 2: Permission is disallowed or the permissionType is invalid.

Example:

final options = CheckPermissionOptions(
  permissionType: 'audioSetting',
  audioSetting: 'allow',
  videoSetting: 'approval',
  screenshareSetting: 'approval',
  chatSetting: 'allow',
  // Optional: per-level config override
  permissionConfig: PermissionConfig(...),
  participantLevel: "0",
);

checkPermission(options).then((result) {
  print('Permission result: $result');
}).catchError((error) {
  print('Error checking permission: $error');
});

Implementation

Future<int> checkPermission(CheckPermissionOptions options) async {
  try {
    // Map permission types to permissionConfig capability names
    const permissionTypeToCapability = {
      'audioSetting': 'useMic',
      'videoSetting': 'useCamera',
      'screenshareSetting': 'useScreen',
      'chatSetting': 'useChat',
    };

    // If permissionConfig is provided and participant has a valid level (not host)
    if (options.permissionConfig != null &&
        options.participantLevel != null &&
        options.participantLevel != '2') {
      final levelConfig = options.participantLevel == '0'
          ? options.permissionConfig!.level0
          : options.permissionConfig!.level1;

      final capability = permissionTypeToCapability[options.permissionType];
      if (capability != null) {
        String? configValue;
        switch (capability) {
          case 'useMic':
            configValue = levelConfig.useMic;
            break;
          case 'useCamera':
            configValue = levelConfig.useCamera;
            break;
          case 'useScreen':
            configValue = levelConfig.useScreen;
            break;
          case 'useChat':
            configValue = levelConfig.useChat;
            break;
        }

        if (configValue != null) {
          return configValue == 'allow'
              ? 0
              : (configValue == 'approval' ? 1 : 2);
        }
      }
    }

    // Fallback to room-wide eventSettings
    switch (options.permissionType) {
      case 'audioSetting':
        if (options.audioSetting == 'allow') return 0;
        if (options.audioSetting == 'approval') return 1;
        return 2;

      case 'videoSetting':
        if (options.videoSetting == 'allow') return 0;
        if (options.videoSetting == 'approval') return 1;
        return 2;

      case 'screenshareSetting':
        if (options.screenshareSetting == 'allow') return 0;
        if (options.screenshareSetting == 'approval') return 1;
        return 2;

      case 'chatSetting':
        if (options.chatSetting == 'allow') return 0;
        if (options.chatSetting == 'approval') return 1;
        return 2;

      default:
        // Return 2 for invalid permission type
        return 2;
    }
  } catch (_) {
    return 2;
  }
}