| import { makeObservable, observable, computed, action } from 'mobx'; |
| |
| const MAX_ROOM_UPDATES = 10; |
| |
| export class Room { |
| name; |
| people = new Map(); |
| messages = []; |
| roomUpdates = []; |
| |
| constructor(name) { |
| makeObservable(this, { |
| name: observable, |
| people: observable, |
| messages: observable, |
| roomUpdates: observable, |
| messageCount: computed, |
| peopleCount: computed, |
| lastMessage: computed, |
| members: computed, |
| addPerson: action, |
| removePerson: action, |
| addMessage: action, |
| addStatusUpdate: action, |
| dispose: action, |
| }); |
| this.name = name; |
| } |
| |
| get messageCount() { |
| return this.messages.length; |
| } |
| |
| get peopleCount() { |
| return this.people.size; |
| } |
| |
| get lastMessage() { |
| if (this.messages.length === 0) { |
| return null; |
| } |
| return this.messages[this.messages.length - 1]; |
| } |
| |
| get members() { |
| return Array.from(this.people.values()); |
| } |
| |
| addPerson(person) { |
| if (!this.people.has(person.id)) { |
| this.people.set(person.id, person); |
| person.addRoom(this); |
| } |
| } |
| |
| removePerson(personId) { |
| const person = this.people.get(personId); |
| if (person) { |
| person.removeRoom(this); |
| this.people.delete(personId); |
| } |
| } |
| |
| addMessage(message) { |
| this.messages.push(message); |
| message.author.setLastMessage(message); |
| } |
| |
| addStatusUpdate(person, status) { |
| this.roomUpdates.push(`${person.name} is now ${status}`); |
| if (this.roomUpdates.length > MAX_ROOM_UPDATES * 2) |
| this.roomUpdates = this.roomUpdates.slice(MAX_ROOM_UPDATES); |
| } |
| |
| dispose(notifications) { |
| this.people.forEach(person => person.removeRoom(this)); |
| if (notifications) { |
| notifications.removeRoom(this.name); |
| } |
| } |
| } |