import 'package:collection/collection.dart'; class KnockedRoomsModel { final List knockedRoomIds; final List acceptedInviteRoomIds; const KnockedRoomsModel({ this.knockedRoomIds = const [], this.acceptedInviteRoomIds = const [], }); static const String _roomIdsField = 'room_ids'; static const String _acceptedInviteRoomIdsField = 'accepted_invite_room_ids'; bool hasEverKnocked(String roomId) { return knockedRoomIds.contains(roomId) || acceptedInviteRoomIds.contains(roomId); } Map toJson() { return { _roomIdsField: knockedRoomIds, _acceptedInviteRoomIdsField: acceptedInviteRoomIds, }; } factory KnockedRoomsModel.fromJson(Map json) { final knockedIds = json[_roomIdsField]; final acceptedInviteIds = json[_acceptedInviteRoomIdsField]; return KnockedRoomsModel( knockedRoomIds: knockedIds is List ? List.from(knockedIds) : [], acceptedInviteRoomIds: acceptedInviteIds is List ? List.from(acceptedInviteIds) : [], ); } KnockedRoomsModel copyWithKnockedRoom(String roomId) { final newKnockedRoomIds = List.from(knockedRoomIds); if (!newKnockedRoomIds.contains(roomId)) { newKnockedRoomIds.add(roomId); } final newAcceptedInviteRoomIds = List.from(acceptedInviteRoomIds) ..remove(roomId); return KnockedRoomsModel( knockedRoomIds: newKnockedRoomIds, acceptedInviteRoomIds: newAcceptedInviteRoomIds, ); } KnockedRoomsModel copyWithAcceptedInviteRoom(String roomId) { final newAcceptedInviteRoomIds = List.from(acceptedInviteRoomIds); if (!newAcceptedInviteRoomIds.contains(roomId)) { newAcceptedInviteRoomIds.add(roomId); } final newKnockedRoomIds = List.from(knockedRoomIds)..remove(roomId); return KnockedRoomsModel( knockedRoomIds: newKnockedRoomIds, acceptedInviteRoomIds: newAcceptedInviteRoomIds, ); } @override bool operator ==(Object other) { if (identical(this, other)) return true; return other is KnockedRoomsModel && ListEquality().equals(other.knockedRoomIds, knockedRoomIds) && ListEquality().equals( other.acceptedInviteRoomIds, acceptedInviteRoomIds, ); } @override int get hashCode => Object.hash( ListEquality().hash(knockedRoomIds), ListEquality().hash(acceptedInviteRoomIds), ); }