/// Someone in a group, with the numbers the leaderboard ranks on. class GroupMember { String id; String name; /// "Owner" or "Member". String role; /// Share of their own commitments kept over the last seven days, 0..1. double keptRate; /// Kept days in a row. int streak; /// Their standing name — Good, Warned, Grounded, Lockdown. String standing; DateTime? lastCheckIn; /// True for the signed-in user. bool me; GroupMember({ this.id = "", this.name = "", this.role = "Member", this.keptRate = 0, this.streak = 0, this.standing = "Good", this.lastCheckIn, this.me = false, }); bool get owner => role == "Owner"; factory GroupMember.fromJson(Map json) { return GroupMember( id: json['id'] ?? "", name: json['name'] ?? "", role: json['role'] ?? "Member", keptRate: (json['keptRate'] ?? 0).toDouble(), streak: json['streak'] ?? 0, standing: json['standing'] ?? "Good", lastCheckIn: json['lastCheckIn'] == null ? null : DateTime.tryParse(json['lastCheckIn']), me: json['me'] ?? false, ); } Map toJson() { final Map data = {}; data['id'] = id; data['name'] = name; data['role'] = role; data['keptRate'] = keptRate; data['streak'] = streak; data['standing'] = standing; data['lastCheckIn'] = lastCheckIn?.toIso8601String(); data['me'] = me; return data; } }