Group.fromMap constructor

Group.fromMap(
  1. dynamic map
)

Creates a new Group instance from a map.

Implementation

factory Group.fromMap(dynamic map) {
  if (map == null) {
    throw ArgumentError('The type of group map is null');
  }

  // Parse metadata - can be String (JSON) or Map
  Map<String, dynamic>? metadata;
  if (map['metadata'] != null) {
    final rawMetadata = map['metadata'];
    if (rawMetadata is String) {
      try {
        metadata = Map<String, dynamic>.from(json.decode(rawMetadata));
      } catch (e) {
        metadata = null;
      }
    } else if (rawMetadata is Map) {
      metadata = Map<String, dynamic>.from(rawMetadata);
    }
  }

  // Parse membersCount - can be int or String
  int membersCount = 0;
  final rawMembersCount = map['membersCount'];
  if (rawMembersCount is int) {
    membersCount = rawMembersCount;
  } else if (rawMembersCount is String) {
    membersCount = int.tryParse(rawMembersCount) ?? 0;
  }

  // Parse timestamps - can be int, double, or String
  int? parseTimestamp(dynamic value) {
    if (value == null || value == 0) return null;
    if (value is int) return value;
    if (value is double) return value.toInt();
    if (value is String) return int.tryParse(value);
    return null;
  }

  final createdAtTs = parseTimestamp(map['createdAt']);
  final joinedAtTs = parseTimestamp(map['joinedAt']);
  final updatedAtTs = parseTimestamp(map['updatedAt']);

  // Parse tags - can be List<String> or List<dynamic>
  List<String>? tags;
  if (map['tags'] != null) {
    final rawTags = map['tags'];
    if (rawTags is List) {
      tags = rawTags.map((e) => e.toString()).toList();
    }
  }

  // Parse isBannedFromGroup - default to false to match Android SDK
  bool isBannedFromGroup = false;
  if (map['isBannedFromGroup'] != null) {
    isBannedFromGroup = map['isBannedFromGroup'] == true || map['isBannedFromGroup'] == 'true';
  }

  return Group(
      guid: map['guid']?.toString() ?? '',
      owner: map['owner']?.toString() ?? '',
      name: map['name']?.toString() ?? '',
      icon: map['icon']?.toString(),
      description: map['description']?.toString(),
      metadata: metadata,
      hasJoined: map['hasJoined'] == true || map['hasJoined'] == 'true',
      membersCount: membersCount,
      createdAt: createdAtTs != null
          ? DateTime.fromMillisecondsSinceEpoch(createdAtTs * 1000)
          : null,
      joinedAt: joinedAtTs != null
          ? DateTime.fromMillisecondsSinceEpoch(joinedAtTs * 1000)
          : null,
      updatedAt: updatedAtTs != null
          ? DateTime.fromMillisecondsSinceEpoch(updatedAtTs * 1000)
          : null,
      tags: tags,
      type: map['type']?.toString() ?? '',
      scope: map['scope']?.toString(),
      password: map['password']?.toString(),
      isBannedFromGroup: isBannedFromGroup);
}