blob: 2c449b8502cd563681101d311c5b5765bc3b56a0 [file] [log] [blame] [edit]
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);
}
}
}