checkAttendance method

  1. @override
Future<AttendanceResult> checkAttendance(
  1. AttendanceConfig config
)
override

Performs attendance check using the provided configuration.

Returns an AttendanceResult indicating the outcome of the check. The method will first scan for BLE devices, and if none are found, it will fall back to location-based verification.

Implementation

@override
Future<AttendanceResult> checkAttendance(AttendanceConfig config) async {
  try {
    final result = await methodChannel.invokeMethod(
      'checkAttendance',
      config.toJson(),
    );

    if (result == null) {
      return AttendanceResult.failedNoMatch(
        message: 'No response from platform',
      );
    }

    // Safely convert the result to Map<String, dynamic>
    final Map<String, dynamic> convertedResult = {};
    if (result is Map) {
      result.forEach((key, value) {
        if (key is String) {
          convertedResult[key] = value;
        }
      });
    }

    final statusString = convertedResult['status'] as String?;
    final message = convertedResult['message'] as String?;

    // Handle nested data map
    Map<String, dynamic>? data;
    final rawData = convertedResult['data'];
    if (rawData is Map) {
      data = {};
      rawData.forEach((key, value) {
        if (key is String) {
          data![key] = value;
        }
      });
    }

    final status = _parseAttendanceStatus(statusString);

    return AttendanceResult(status, message: message, data: data);
  } on PlatformException catch (e) {
    if (e.code == 'PERMISSION_DENIED') {
      return AttendanceResult.failedPermissions(message: e.message);
    }
    return AttendanceResult.failedNoMatch(
      message: 'Platform error: ${e.message}',
    );
  } catch (e) {
    return AttendanceResult.failedNoMatch(message: 'Unexpected error: $e');
  }
}