/// One line in a group chat. Besides plain text, the app posts check-ins /// (progress logged on an objective), nudges and system notes into the same /// thread so the conversation and the work sit together. class GroupMessage { String id; String groupId; String authorId; String authorName; String body; /// "Text", "CheckIn", "Nudge" or "System". String kind; DateTime? sentAt; /// True when the signed-in user wrote it. bool mine; GroupMessage({ this.id = "", this.groupId = "", this.authorId = "", this.authorName = "", this.body = "", this.kind = "Text", this.sentAt, this.mine = false, }); bool get isCheckIn => kind == "CheckIn"; bool get isNudge => kind == "Nudge"; bool get isSystem => kind == "System"; factory GroupMessage.fromJson(Map json) { return GroupMessage( id: json['id'] ?? "", groupId: json['groupId'] ?? "", authorId: json['authorId'] ?? "", authorName: json['authorName'] ?? "", body: json['body'] ?? "", kind: json['kind'] ?? "Text", sentAt: json['sentAt'] == null ? null : DateTime.tryParse(json['sentAt']), mine: json['mine'] ?? false, ); } Map toJson() { final Map data = {}; data['id'] = id; data['groupId'] = groupId; data['authorId'] = authorId; data['authorName'] = authorName; data['body'] = body; data['kind'] = kind; data['sentAt'] = sentAt?.toIso8601String(); data['mine'] = mine; return data; } }