Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 20 additions & 19 deletions app/definitions/IRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { MarkdownAST } from '@rocket.chat/message-parser';
import { IAttachment } from './IAttachment';
import { IMessage } from './IMessage';
import { IServedBy } from './IServedBy';
import { SubscriptionType } from './ISubscription';
import { IVisitor, SubscriptionType } from './ISubscription';
import { IUser } from './IUser';

interface IRequestTranscript {
Expand All @@ -28,11 +28,8 @@ export interface IRoom {
broadcast: boolean;
encrypted: boolean;
ro: boolean;
v?: {
_id?: string;
token?: string;
status: 'online' | 'busy' | 'away' | 'offline';
};
v?: IVisitor;
status?: string;
servedBy?: IServedBy;
departmentId?: string;
livechatData?: any;
Expand All @@ -55,13 +52,11 @@ export enum OmnichannelSourceType {
API = 'api',
OTHER = 'other' // catch-all source type
}
export interface IOmnichannelRoom extends Omit<IRoom, 'default' | 'featured' | 'broadcast' | ''> {
export interface IOmnichannelRoom extends Partial<Omit<IRoom, 'default' | 'featured' | 'broadcast'>> {
_id: string;
rid: string;
t: SubscriptionType.OMNICHANNEL;
v: {
_id?: string;
token?: string;
status: 'online' | 'busy' | 'away' | 'offline';
};
v: IVisitor;
email?: {
// Data used when the room is created from an email, via email Integration.
inbox: string;
Expand All @@ -83,6 +78,8 @@ export interface IOmnichannelRoom extends Omit<IRoom, 'default' | 'featured' | '
sidebarIcon?: string;
// The default sidebar icon
defaultIcon?: string;
_updatedAt?: Date;
queuedAt?: Date;
};
transcriptRequest?: IRequestTranscript;
servedBy?: IServedBy;
Expand All @@ -91,18 +88,22 @@ export interface IOmnichannelRoom extends Omit<IRoom, 'default' | 'featured' | '

lastMessage?: IMessage & { token?: string };

tags: any;
closedAt: any;
metrics: any;
waitingResponse: any;
responseBy: any;
priorityId: any;
livechatData: any;
tags?: string[];
closedAt?: Date;
metrics?: any;
waitingResponse?: any;
responseBy?: any;
priorityId?: any;
livechatData?: any;
queuedAt?: Date;

ts: Date;
label?: string;
crmData?: unknown;
message?: string;
queueOrder?: string;
estimatedWaitingTimeQueue?: string;
estimatedServiceTimeAt?: Date;
}

export type TRoomModel = IRoom & Model;
Expand Down
10 changes: 5 additions & 5 deletions app/definitions/ISubscription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ export enum SubscriptionType {
}

export interface IVisitor {
_id: string;
username: string;
token: string;
status: string;
lastMessageTs: Date;
_id?: string;
token?: string;
status: 'online' | 'busy' | 'away' | 'offline';
username?: string;
lastMessageTs?: Date;
}

export enum ERoomTypes {
Expand Down
5 changes: 4 additions & 1 deletion app/definitions/redux/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// ACTIONS
import { TActionInquiry } from '../../ee/omnichannel/actions/inquiry';
import { TActionActiveUsers } from '../../actions/activeUsers';
import { TActionApp } from '../../actions/app';
import { TActionCreateChannel } from '../../actions/createChannel';
Expand Down Expand Up @@ -30,6 +31,7 @@ import { ISelectedUsers } from '../../reducers/selectedUsers';
import { IServer } from '../../reducers/server';
import { TSettingsState } from '../../reducers/settings';
import { IShare } from '../../reducers/share';
import { IInquiry } from '../../ee/omnichannel/reducers/inquiry';
import { IPermissionsState } from '../../reducers/permissions';
import { IEnterpriseModules } from '../../reducers/enterpriseModules';

Expand All @@ -50,7 +52,7 @@ export interface IApplicationState {
usersTyping: any;
inviteLinks: IInviteLinks;
createDiscussion: ICreateDiscussion;
inquiry: any;
inquiry: IInquiry;
enterpriseModules: IEnterpriseModules;
encryption: IEncryption;
permissions: IPermissionsState;
Expand All @@ -71,5 +73,6 @@ export type TApplicationActions = TActionActiveUsers &
TActionsShare &
TActionServer &
TActionApp &
TActionInquiry &
TActionPermissions &
TActionEnterpriseModules;
55 changes: 0 additions & 55 deletions app/ee/omnichannel/actions/inquiry.js

This file was deleted.

84 changes: 84 additions & 0 deletions app/ee/omnichannel/actions/inquiry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { Action } from 'redux';

import { IOmnichannelRoom } from '../../../definitions';
import { INQUIRY } from '../../../actions/actionsTypes';

interface IInquirySetEnabled extends Action {
enabled: boolean;
}

interface IInquiryQueueAddAndUpdate extends Action {
inquiry: IOmnichannelRoom;
}

interface IInquirySuccess extends Action {
inquiries: IOmnichannelRoom[];
}

interface IInquiryQueueRemove extends Action {
inquiryId: string;
}

interface IInquiryFailure extends Action {
error: unknown;
}

export type TActionInquiry = IInquirySetEnabled &
IInquiryQueueAddAndUpdate &
IInquirySuccess &
IInquiryQueueRemove &
IInquiryFailure;

export function inquirySetEnabled(enabled: boolean): IInquirySetEnabled {
return {
type: INQUIRY.SET_ENABLED,
enabled
};
}

export function inquiryReset(): Action {
return {
type: INQUIRY.RESET
};
}

export function inquiryQueueAdd(inquiry: IOmnichannelRoom): IInquiryQueueAddAndUpdate {
return {
type: INQUIRY.QUEUE_ADD,
inquiry
};
}

export function inquiryQueueUpdate(inquiry: IOmnichannelRoom): IInquiryQueueAddAndUpdate {
return {
type: INQUIRY.QUEUE_UPDATE,
inquiry
};
}

export function inquiryQueueRemove(inquiryId: string): IInquiryQueueRemove {
return {
type: INQUIRY.QUEUE_REMOVE,
inquiryId
};
}

export function inquiryRequest(): Action {
return {
type: INQUIRY.REQUEST
};
}

export function inquirySuccess(inquiries: IOmnichannelRoom[]): IInquirySuccess {
return {
type: INQUIRY.SUCCESS,
inquiries
};
}

export function inquiryFailure(error: unknown): IInquiryFailure {
return {
type: INQUIRY.FAILURE,
error
};
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
import React, { memo, useEffect, useState } from 'react';
import { Switch, View } from 'react-native';
import PropTypes from 'prop-types';

import * as List from '../../../containers/List';
import styles from '../../../views/RoomsListView/styles';
import { SWITCH_TRACK_COLOR, themes } from '../../../constants/colors';
import { withTheme } from '../../../theme';
import { useTheme } from '../../../theme';
import UnreadBadge from '../../../presentation/UnreadBadge';
import RocketChat from '../../../lib/rocketchat';
import { changeLivechatStatus, isOmnichannelStatusAvailable } from '../lib';
import { IUser } from '../../../definitions/IUser';

const OmnichannelStatus = memo(({ searching, goQueue, theme, queueSize, inquiryEnabled, user }) => {
if (searching > 0 || !(RocketChat.isOmnichannelModuleAvailable() && user?.roles?.includes('livechat-agent'))) {
interface IOmnichannelStatus {
searching: boolean;
goQueue: () => void;
queueSize: number;
inquiryEnabled: boolean;
user: IUser;
}

const OmnichannelStatus = memo(({ searching, goQueue, queueSize, inquiryEnabled, user }: IOmnichannelStatus) => {
if (searching || !(RocketChat.isOmnichannelModuleAvailable() && user?.roles?.includes('livechat-agent'))) {
return null;
}
const { theme } = useTheme();
const [status, setStatus] = useState(isOmnichannelStatusAvailable(user));

useEffect(() => {
Expand Down Expand Up @@ -48,16 +57,4 @@ const OmnichannelStatus = memo(({ searching, goQueue, theme, queueSize, inquiryE
);
});

OmnichannelStatus.propTypes = {
searching: PropTypes.bool,
goQueue: PropTypes.func,
queueSize: PropTypes.number,
inquiryEnabled: PropTypes.bool,
theme: PropTypes.string,
user: PropTypes.shape({
roles: PropTypes.array,
statusLivechat: PropTypes.string
})
};

export default withTheme(OmnichannelStatus);
export default OmnichannelStatus;
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
import RocketChat from '../../../lib/rocketchat';
import sdk from '../../../lib/rocketchat/services/sdk';
import { IUser } from '../../../definitions';
import EventEmitter from '../../../utils/events';
import subscribeInquiry from './subscriptions/inquiry';

export const isOmnichannelStatusAvailable = user => user?.statusLivechat === 'available';
export const isOmnichannelStatusAvailable = (user: IUser): boolean => user?.statusLivechat === 'available';

// RC 0.26.0
export const changeLivechatStatus = () => RocketChat.methodCallWrapper('livechat:changeLivechatStatus');
export const changeLivechatStatus = () => sdk.methodCallWrapper('livechat:changeLivechatStatus');

// RC 2.4.0
export const getInquiriesQueued = () => RocketChat.sdk.get('livechat/inquiries.queued');
// @ts-ignore
export const getInquiriesQueued = () => sdk.get('livechat/inquiries.queued');

// this inquiry is added to the db by the subscriptions stream
// and will be removed by the queue stream
// RC 2.4.0
export const takeInquiry = inquiryId => RocketChat.methodCallWrapper('livechat:takeInquiry', inquiryId);
export const takeInquiry = (inquiryId: string) => sdk.methodCallWrapper('livechat:takeInquiry', inquiryId);

class Omnichannel {
private inquirySub: { stop: () => void } | null;
constructor() {
this.inquirySub = null;
EventEmitter.addEventListener('INQUIRY_SUBSCRIBE', this.subscribeInquiry);
Expand All @@ -36,5 +39,5 @@ class Omnichannel {
};
}

// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const omnichannel = new Omnichannel();
Loading