[FIX] Message preview not available for queued chats (#25092)

Co-authored-by: Kevin Aleman <kaleman960@gmail.com>
pull/25272/head
Murtaza Patrawala 4 years ago committed by GitHub
parent 774f52671b
commit 65e54c2b52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 26
      apps/meteor/app/apps/server/converters/messages.js
  2. 35
      apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts
  3. 1
      apps/meteor/app/livechat/server/index.js
  4. 8
      apps/meteor/app/models/server/raw/LivechatInquiry.ts
  5. 9
      apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.js
  6. 48
      packages/core-typings/src/IInquiry.ts

@ -120,24 +120,24 @@ export class AppMessagesConverter {
const newMessage = {
_id: message.id || Random.id(),
tmid: message.threadId,
...('threadId' in message && { tmid: message.threadId }),
rid: room._id,
u,
msg: message.text,
ts: message.createdAt || new Date(),
_updatedAt: message.updatedAt || new Date(),
editedBy,
editedAt: message.editedAt,
emoji: message.emoji,
avatar: message.avatarUrl,
alias: message.alias,
customFields: message.customFields,
groupable: message.groupable,
attachments,
reactions: message.reactions,
parseUrls: message.parseUrls,
blocks: message.blocks,
token: message.token,
...(editedBy && { editedBy }),
...('editedAt' in message && { editedAt: message.editedAt }),
...('emoji' in message && { emoji: message.emoji }),
...('avatarUrl' in message && { avatar: message.avatarUrl }),
...('alias' in message && { alias: message.alias }),
...('customFields' in message && { customFields: message.customFields }),
...('groupable' in message && { groupable: message.groupable }),
...(attachments && { attachments }),
...('reactions' in message && { reactions: message.reactions }),
...('parseUrls' in message && { parseUrls: message.parseUrls }),
...('blocks' in message && { blocks: message.blocks }),
...('token' in message && { token: message.token }),
};
return Object.assign(newMessage, message._unmappedProperties_);

@ -0,0 +1,35 @@
import { isOmnichannelRoom, isEditedMessage } from '@rocket.chat/core-typings';
import { callbacks } from '../../../../lib/callbacks';
import { LivechatInquiry } from '../../../models/server/raw';
import { settings } from '../../../settings/server';
import { RoutingManager } from '../lib/RoutingManager';
callbacks.add(
'afterSaveMessage',
async (message, room) => {
if (!isOmnichannelRoom(room)) {
return message;
}
// skip callback if message was edited
if (isEditedMessage(message)) {
return message;
}
if (!RoutingManager.getConfig().showQueue) {
// since last message is only getting used on UI as preview message when queue is enabled
return message;
}
if (!settings.get('Store_Last_Message')) {
return message;
}
await LivechatInquiry.setLastMessageByRoomId(room._id, message);
return message;
},
callbacks.priority.LOW,
'save-last-message-to-inquiry',
);

@ -19,6 +19,7 @@ import './hooks/saveLastVisitorMessageTs';
import './hooks/markRoomNotResponded';
import './hooks/sendTranscriptOnClose';
import './hooks/saveContactLastChat';
import './hooks/saveLastMessageToInquiry';
import './methods/addAgent';
import './methods/addManager';
import './methods/changeLivechatStatus';

@ -1,5 +1,5 @@
import { FindOneOptions, MongoDistinctPreferences } from 'mongodb';
import { ILivechatInquiryRecord, LivechatInquiryStatus } from '@rocket.chat/core-typings';
import { FindOneOptions, MongoDistinctPreferences, UpdateWriteOpResult } from 'mongodb';
import { IMessage, ILivechatInquiryRecord, LivechatInquiryStatus } from '@rocket.chat/core-typings';
import { BaseRaw } from './BaseRaw';
@ -30,4 +30,8 @@ export class LivechatInquiryRaw extends BaseRaw<ILivechatInquiryRecord> {
const updated = await this.findOneAndUpdate({ _id: inquiryId }, { $set: { department } }, { returnDocument: 'after' });
return updated.value;
}
async setLastMessageByRoomId(rid: string, message: IMessage): Promise<UpdateWriteOpResult> {
return this.updateOne({ rid }, { $set: { lastMessage: message } });
}
}

@ -117,6 +117,13 @@ function SideBarItemTemplateWithData({
);
}
function safeDateNotEqualCheck(a, b) {
if (!a || !b) {
return a !== b;
}
return new Date(a).toISOString() !== new Date(b).toISOString();
}
const propsAreEqual = (prevProps, nextProps) => {
if (
['id', 'style', 'extended', 'selected', 'SideBarItemTemplate', 'AvatarTemplate', 't', 'sidebarViewMode'].some(
@ -136,7 +143,7 @@ const propsAreEqual = (prevProps, nextProps) => {
if (prevProps.room._updatedAt?.toISOString() !== nextProps.room._updatedAt?.toISOString()) {
return false;
}
if (prevProps.room.lastMessage?._updatedAt?.toISOString() !== nextProps.room.lastMessage?._updatedAt?.toISOString()) {
if (safeDateNotEqualCheck(prevProps.lastMessage?._updatedAt, nextProps.lastMessage?._updatedAt)) {
return false;
}
if (prevProps.room.alert !== nextProps.room.alert) {

@ -1,35 +1,37 @@
import type { IRocketChatRecord } from "./IRocketChatRecord";
import type { IMessage } from './IMessage';
import type { IRocketChatRecord } from './IRocketChatRecord';
export interface IInquiry {
_id: string;
_updatedAt?: Date;
department?: string;
_id: string;
_updatedAt?: Date;
department?: string;
}
export enum LivechatInquiryStatus {
QUEUED = "queued",
TAKEN = "taken",
READY = "ready",
QUEUED = 'queued',
TAKEN = 'taken',
READY = 'ready',
}
export interface IVisitor {
_id: string;
username: string;
token: string;
status: string;
_id: string;
username: string;
token: string;
status: string;
}
export interface ILivechatInquiryRecord extends IRocketChatRecord {
rid: string;
name: string;
ts: Date;
message: string;
status: LivechatInquiryStatus;
v: IVisitor;
t: "l";
queueOrder: number;
estimatedWaitingTimeQueue: number;
estimatedServiceTimeAt: string;
department: string;
estimatedInactivityCloseTimeAt: Date;
rid: string;
name: string;
ts: Date;
message: string;
status: LivechatInquiryStatus;
v: IVisitor;
t: 'l';
queueOrder: number;
estimatedWaitingTimeQueue: number;
estimatedServiceTimeAt: string;
department: string;
estimatedInactivityCloseTimeAt: Date;
lastMessage?: IMessage & { token?: string };
}

Loading…
Cancel
Save