@pazznetwork/ngx-chat
Version:
[](https://travis-ci.com/pazznetwork/ngx-chat) [](https://coveralls.io/github/pazzn
54 lines • 8.77 kB
JavaScript
import { Subject } from 'rxjs';
import { Direction } from './message';
import { findLast, findSortedIndex, findSortedInsertionIndexLast, insertSortedLast } from './utils-array';
import { extractDateStringFromDate } from './utils-date';
export class MessageStore {
constructor(logService) {
this.logService = logService;
this.messages = [];
this.dateMessageGroups = [];
this.messageIdToMessage = new Map();
this.messages$ = new Subject();
}
addMessage(message) {
if (message.id && this.messageIdToMessage.has(message.id)) {
if (this.logService) {
this.logService.warn(`message with id ${message.id} already exists`);
}
return false;
}
insertSortedLast(message, this.messages, m => m.datetime);
this.addToDateMessageGroups(message);
this.messageIdToMessage.set(message.id, message);
this.messages$.next(message);
return true;
}
get oldestMessage() {
return this.messages[0];
}
get mostRecentMessage() {
return this.messages[this.messages.length - 1];
}
get mostRecentMessageReceived() {
return findLast(this.messages, msg => msg.direction === Direction.in);
}
get mostRecentMessageSent() {
return findLast(this.messages, msg => msg.direction === Direction.out);
}
addToDateMessageGroups(message) {
const dateString = extractDateStringFromDate(message.datetime);
const groupIndex = findSortedIndex(dateString, this.dateMessageGroups, group => extractDateStringFromDate(group.date));
if (groupIndex !== -1) {
insertSortedLast(message, this.dateMessageGroups[groupIndex].messages, m => m.datetime);
}
else {
const groupToInsert = {
date: message.datetime,
messages: [message],
};
const insertIndex = findSortedInsertionIndexLast(dateString, this.dateMessageGroups, group => extractDateStringFromDate(group.date));
this.dateMessageGroups.splice(insertIndex, 0, groupToInsert);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29yZS9tZXNzYWdlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLFNBQVMsRUFBVyxNQUFNLFdBQVcsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRekQsTUFBTSxPQUFPLFlBQVk7SUFPckIsWUFBNkIsVUFBdUI7UUFBdkIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQUpwQyxhQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ25CLHNCQUFpQixHQUEyQixFQUFFLENBQUM7UUFDL0MsdUJBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUd0RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFLLENBQUM7SUFDdEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFVO1FBQ2pCLElBQUksT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN2RCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixPQUFPLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3hFO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDekIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUNyQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQVU7UUFDckMsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkgsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0Y7YUFBTTtZQUNILE1BQU0sYUFBYSxHQUFHO2dCQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQ3RCLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQzthQUN0QixDQUFDO1lBQ0YsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFDL0UsS0FBSyxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDaEU7SUFDTCxDQUFDO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlyZWN0aW9uLCBNZXNzYWdlIH0gZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IGZpbmRMYXN0LCBmaW5kU29ydGVkSW5kZXgsIGZpbmRTb3J0ZWRJbnNlcnRpb25JbmRleExhc3QsIGluc2VydFNvcnRlZExhc3QgfSBmcm9tICcuL3V0aWxzLWFycmF5JztcbmltcG9ydCB7IGV4dHJhY3REYXRlU3RyaW5nRnJvbURhdGUgfSBmcm9tICcuL3V0aWxzLWRhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVNZXNzYWdlc0dyb3VwPFQgZXh0ZW5kcyBNZXNzYWdlPiB7XG4gICAgLyoqIGlzIGVxdWFsIHRvIHRoZSBkYXRlIHdoZXJlIG9uZSBtZXNzYWdlIG9uIHRoYXQgZGF0ZSB3YXMgcmVjZWl2ZWQgKi9cbiAgICBkYXRlOiBEYXRlO1xuICAgIG1lc3NhZ2VzOiBUW107XG59XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlU3RvcmU8VCBleHRlbmRzIE1lc3NhZ2U+IHtcblxuICAgIHB1YmxpYyByZWFkb25seSBtZXNzYWdlcyQ6IFN1YmplY3Q8VD47XG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VzOiBUW10gPSBbXTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGF0ZU1lc3NhZ2VHcm91cHM6IERhdGVNZXNzYWdlc0dyb3VwPFQ+W10gPSBbXTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZUlkVG9NZXNzYWdlID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvZ1NlcnZpY2U/OiBMb2dTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZXMkID0gbmV3IFN1YmplY3Q8VD4oKTtcbiAgICB9XG5cbiAgICBhZGRNZXNzYWdlKG1lc3NhZ2U6IFQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgJiYgdGhpcy5tZXNzYWdlSWRUb01lc3NhZ2UuaGFzKG1lc3NhZ2UuaWQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLndhcm4oYG1lc3NhZ2Ugd2l0aCBpZCAke21lc3NhZ2UuaWR9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0U29ydGVkTGFzdChtZXNzYWdlLCB0aGlzLm1lc3NhZ2VzLCBtID0+IG0uZGF0ZXRpbWUpO1xuICAgICAgICB0aGlzLmFkZFRvRGF0ZU1lc3NhZ2VHcm91cHMobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZUlkVG9NZXNzYWdlLnNldChtZXNzYWdlLmlkLCBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlcyQubmV4dChtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0IG9sZGVzdE1lc3NhZ2UoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VzWzBdO1xuICAgIH1cblxuICAgIGdldCBtb3N0UmVjZW50TWVzc2FnZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXNbdGhpcy5tZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICBnZXQgbW9zdFJlY2VudE1lc3NhZ2VSZWNlaXZlZCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGZpbmRMYXN0KHRoaXMubWVzc2FnZXMsIG1zZyA9PiBtc2cuZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uaW4pO1xuICAgIH1cblxuICAgIGdldCBtb3N0UmVjZW50TWVzc2FnZVNlbnQoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLm1lc3NhZ2VzLCBtc2cgPT4gbXNnLmRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLm91dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUb0RhdGVNZXNzYWdlR3JvdXBzKG1lc3NhZ2U6IFQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGV4dHJhY3REYXRlU3RyaW5nRnJvbURhdGUobWVzc2FnZS5kYXRldGltZSk7XG4gICAgICAgIGNvbnN0IGdyb3VwSW5kZXggPSBmaW5kU29ydGVkSW5kZXgoZGF0ZVN0cmluZywgdGhpcy5kYXRlTWVzc2FnZUdyb3VwcywgZ3JvdXAgPT4gZXh0cmFjdERhdGVTdHJpbmdGcm9tRGF0ZShncm91cC5kYXRlKSk7XG4gICAgICAgIGlmIChncm91cEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgaW5zZXJ0U29ydGVkTGFzdChtZXNzYWdlLCB0aGlzLmRhdGVNZXNzYWdlR3JvdXBzW2dyb3VwSW5kZXhdLm1lc3NhZ2VzLCBtID0+IG0uZGF0ZXRpbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBUb0luc2VydCA9IHtcbiAgICAgICAgICAgICAgICBkYXRlOiBtZXNzYWdlLmRhdGV0aW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBmaW5kU29ydGVkSW5zZXJ0aW9uSW5kZXhMYXN0KGRhdGVTdHJpbmcsIHRoaXMuZGF0ZU1lc3NhZ2VHcm91cHMsXG4gICAgICAgICAgICAgICAgZ3JvdXAgPT4gZXh0cmFjdERhdGVTdHJpbmdGcm9tRGF0ZShncm91cC5kYXRlKSk7XG4gICAgICAgICAgICB0aGlzLmRhdGVNZXNzYWdlR3JvdXBzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgZ3JvdXBUb0luc2VydCk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==