UNPKG

@hsaadawy/ngx-chat

Version:
54 lines 9.05 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhenpuZXR3b3JrL25neC1jaGF0L3NyYy9saWIvY29yZS9tZXNzYWdlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLFNBQVMsRUFBVyxNQUFNLFdBQVcsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRekQsTUFBTSxPQUFPLFlBQVk7SUFPckIsWUFBNkIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUpuQyxhQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ25CLHNCQUFpQixHQUEyQixFQUFFLENBQUM7UUFDL0MsdUJBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUd0RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFLLENBQUM7SUFDdEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFVO1FBQ2pCLElBQUksT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN2RCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixPQUFPLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3hFO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDekIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUNyQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQVU7UUFDckMsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkgsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0Y7YUFBTTtZQUNILE1BQU0sYUFBYSxHQUFHO2dCQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQ3RCLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQzthQUN0QixDQUFDO1lBQ0YsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFDL0UsS0FBSyxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDaEU7SUFDTCxDQUFDO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IERpcmVjdGlvbiwgTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZSc7XHJcbmltcG9ydCB7IGZpbmRMYXN0LCBmaW5kU29ydGVkSW5kZXgsIGZpbmRTb3J0ZWRJbnNlcnRpb25JbmRleExhc3QsIGluc2VydFNvcnRlZExhc3QgfSBmcm9tICcuL3V0aWxzLWFycmF5JztcclxuaW1wb3J0IHsgZXh0cmFjdERhdGVTdHJpbmdGcm9tRGF0ZSB9IGZyb20gJy4vdXRpbHMtZGF0ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGVNZXNzYWdlc0dyb3VwPFQgZXh0ZW5kcyBNZXNzYWdlPiB7XHJcbiAgICAvKiogaXMgZXF1YWwgdG8gdGhlIGRhdGUgd2hlcmUgb25lIG1lc3NhZ2Ugb24gdGhhdCBkYXRlIHdhcyByZWNlaXZlZCAqL1xyXG4gICAgZGF0ZTogRGF0ZTtcclxuICAgIG1lc3NhZ2VzOiBUW107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNZXNzYWdlU3RvcmU8VCBleHRlbmRzIE1lc3NhZ2U+IHtcclxuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZXMkOiBTdWJqZWN0PFQ+O1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VzOiBUW10gPSBbXTtcclxuICAgIHB1YmxpYyByZWFkb25seSBkYXRlTWVzc2FnZUdyb3VwczogRGF0ZU1lc3NhZ2VzR3JvdXA8VD5bXSA9IFtdO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VJZFRvTWVzc2FnZSA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMkID0gbmV3IFN1YmplY3Q8VD4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRNZXNzYWdlKG1lc3NhZ2U6IFQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAobWVzc2FnZS5pZCAmJiB0aGlzLm1lc3NhZ2VJZFRvTWVzc2FnZS5oYXMobWVzc2FnZS5pZCkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubG9nU2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLndhcm4oYG1lc3NhZ2Ugd2l0aCBpZCAke21lc3NhZ2UuaWR9IGFscmVhZHkgZXhpc3RzYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbnNlcnRTb3J0ZWRMYXN0KG1lc3NhZ2UsIHRoaXMubWVzc2FnZXMsIG0gPT4gbS5kYXRldGltZSk7XHJcbiAgICAgICAgdGhpcy5hZGRUb0RhdGVNZXNzYWdlR3JvdXBzKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZUlkVG9NZXNzYWdlLnNldChtZXNzYWdlLmlkLCBtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvbGRlc3RNZXNzYWdlKCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb3N0UmVjZW50TWVzc2FnZSgpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlc1t0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb3N0UmVjZW50TWVzc2FnZVJlY2VpdmVkKCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLm1lc3NhZ2VzLCBtc2cgPT4gbXNnLmRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLmluKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9zdFJlY2VudE1lc3NhZ2VTZW50KCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLm1lc3NhZ2VzLCBtc2cgPT4gbXNnLmRpcmVjdGlvbiA9PT0gRGlyZWN0aW9uLm91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRUb0RhdGVNZXNzYWdlR3JvdXBzKG1lc3NhZ2U6IFQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZXh0cmFjdERhdGVTdHJpbmdGcm9tRGF0ZShtZXNzYWdlLmRhdGV0aW1lKTtcclxuICAgICAgICBjb25zdCBncm91cEluZGV4ID0gZmluZFNvcnRlZEluZGV4KGRhdGVTdHJpbmcsIHRoaXMuZGF0ZU1lc3NhZ2VHcm91cHMsIGdyb3VwID0+IGV4dHJhY3REYXRlU3RyaW5nRnJvbURhdGUoZ3JvdXAuZGF0ZSkpO1xyXG4gICAgICAgIGlmIChncm91cEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICBpbnNlcnRTb3J0ZWRMYXN0KG1lc3NhZ2UsIHRoaXMuZGF0ZU1lc3NhZ2VHcm91cHNbZ3JvdXBJbmRleF0ubWVzc2FnZXMsIG0gPT4gbS5kYXRldGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBUb0luc2VydCA9IHtcclxuICAgICAgICAgICAgICAgIGRhdGU6IG1lc3NhZ2UuZGF0ZXRpbWUsXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlczogW21lc3NhZ2VdXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gZmluZFNvcnRlZEluc2VydGlvbkluZGV4TGFzdChkYXRlU3RyaW5nLCB0aGlzLmRhdGVNZXNzYWdlR3JvdXBzLFxyXG4gICAgICAgICAgICAgICAgZ3JvdXAgPT4gZXh0cmFjdERhdGVTdHJpbmdGcm9tRGF0ZShncm91cC5kYXRlKSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZU1lc3NhZ2VHcm91cHMuc3BsaWNlKGluc2VydEluZGV4LCAwLCBncm91cFRvSW5zZXJ0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==