import { isBlank } from '@ringcentral-integration/commons/lib/isBlank';
import clsx from 'clsx';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { FileAttachmentRender } from './FileAttachmentRender';
import { ImageAttachmentRender } from './ImageAttachmentRender';
import { SubjectRender as DefaultRender } from './SubjectRender';
import i18n from './i18n';
import styles from './styles.scss';
export const Message = ({
subject,
time,
direction,
sender,
subjectRenderer: SubjectRenderer,
mmsAttachments,
currentLocale,
onAttachmentDownload,
onLinkClick,
handleImageLoad,
}: any) => {
let subjectNode;
if (subject && !isBlank(subject)) {
const SubjectComp = SubjectRenderer || DefaultRender;
subjectNode = ;
}
const imageAttachments = mmsAttachments
.filter((m: any) => m.contentType.indexOf('image') > -1)
.map((attachment: any) => {
return (
);
});
const otherAttachments = mmsAttachments
.filter((m: any) => m.contentType.indexOf('image') === -1)
.map((attachment: any) => {
return (
);
});
return (
{time ? (
{time}
) : null}
{sender && direction === 'Inbound' ? (
{sender}
) : null}
{!isBlank(subject) && (
500 && styles.big,
)}
>
{subjectNode}
)}
{imageAttachments.length > 0 && (
{imageAttachments}
)}
{otherAttachments.length > 0 && <>{otherAttachments}>}
);
};
Message.propTypes = {
direction: PropTypes.string.isRequired,
subject: PropTypes.string,
time: PropTypes.string,
sender: PropTypes.string,
subjectRenderer: PropTypes.func,
mmsAttachments: PropTypes.array,
currentLocale: PropTypes.string.isRequired,
onAttachmentDownload: PropTypes.func,
onLinkClick: PropTypes.func,
handleImageLoad: PropTypes.func,
};
Message.defaultProps = {
subject: '',
sender: undefined,
time: undefined,
subjectRenderer: undefined,
mmsAttachments: [],
onAttachmentDownload: undefined,
handleImageLoad: undefined,
};
class ConversationMessageList extends Component {
_listRef: any;
_scrollHeight: any;
_scrollTop: any;
_scrollUp: any;
// @ts-expect-error TS(4114): This member must have an 'override' modifier becau... Remove this comment to see the full error message
componentDidMount() {
this.scrollToLastMessage();
}
// @ts-expect-error TS(4114): This member must have an 'override' modifier becau... Remove this comment to see the full error message
componentDidUpdate(previousProps: any) {
// @ts-expect-error TS(2339): Property 'messages' does not exist on type 'Readon... Remove this comment to see the full error message
if (previousProps.messages.length === this.props.messages.length) {
return;
}
if (!this._scrollUp) {
this.scrollToLastMessage();
} else if (
this._listRef &&
this._scrollHeight !== this._listRef.scrollHeight
) {
this._listRef.scrollTop +=
this._listRef.scrollHeight - this._scrollHeight;
}
}
onScroll = async () => {
if (!this._listRef) {
return;
}
const currentScrollTop = this._listRef.scrollTop;
this._scrollHeight = this._listRef.scrollHeight;
const clientHeight = this._listRef.clientHeight;
if (currentScrollTop < this._scrollTop) {
// user scroll up
this._scrollUp = true;
} else if (currentScrollTop + clientHeight > this._scrollHeight - 200) {
// user scroll down to bottom
this._scrollUp = false;
}
if (currentScrollTop < 20 && this._scrollTop >= 20) {
// @ts-expect-error TS(2339): Property 'loadPreviousMessages' does not exist on ... Remove this comment to see the full error message
this.props.loadPreviousMessages();
}
this._scrollTop = currentScrollTop;
};
scrollToLastMessage = () => {
if (this._listRef) {
this._listRef.scrollTop = this._listRef.scrollHeight;
}
};
// @ts-expect-error TS(4114): This member must have an 'override' modifier becau... Remove this comment to see the full error message
render() {
const {
// @ts-expect-error TS(2339): Property 'className' does not exist on type 'Reado... Remove this comment to see the full error message
className,
// @ts-expect-error TS(2339): Property 'dateTimeFormatter' does not exist on typ... Remove this comment to see the full error message
dateTimeFormatter,
// @ts-expect-error TS(2339): Property 'messages' does not exist on type 'Readon... Remove this comment to see the full error message
messages,
// @ts-expect-error TS(2339): Property 'showSender' does not exist on type 'Read... Remove this comment to see the full error message
showSender,
// @ts-expect-error TS(2339): Property 'height' does not exist on type 'Readonly... Remove this comment to see the full error message
height,
// @ts-expect-error TS(2339): Property 'messageSubjectRenderer' does not exist o... Remove this comment to see the full error message
messageSubjectRenderer,
// @ts-expect-error TS(2339): Property 'formatPhone' does not exist on type 'Rea... Remove this comment to see the full error message
formatPhone,
// @ts-expect-error TS(2339): Property 'loadingNextPage' does not exist on type ... Remove this comment to see the full error message
loadingNextPage,
// @ts-expect-error TS(2339): Property 'currentLocale' does not exist on type 'R... Remove this comment to see the full error message
currentLocale,
// @ts-expect-error TS(2339): Property 'onAttachmentDownload' does not exist on ... Remove this comment to see the full error message
onAttachmentDownload,
// @ts-expect-error TS(2339): Property 'onLinkClick' does not exist on ... Remove this comment to see the full error message
onLinkClick,
} = this.props;
let lastDate = 0;
const messageList = messages.map((message: any) => {
const sender = showSender
? message.from.name ||
formatPhone(message.from.extensionNumber || message.from.phoneNumber)
: null;
const date = new Date(message.creationTime);
const time =
// @ts-expect-error TS(2362): The left-hand side of an arithmetic operation must... Remove this comment to see the full error message
date - lastDate < 60 * 60 * 1000 &&
// @ts-expect-error TS(2339): Property 'getHours' does not exist on type 'number... Remove this comment to see the full error message
date.getHours() === lastDate.getHours()
? null
: dateTimeFormatter({
utcTimestamp: message.creationTime,
type: 'long',
});
// @ts-expect-error TS(2322): Type 'Date' is not assignable to type 'number'.
lastDate = date;
return (
{
if (!this._scrollUp) {
this.scrollToLastMessage();
}
}}
/>
);
});
const loading = loadingNextPage ? (
{i18n.getString('loading', currentLocale)}
) : null;
return (
{
this._listRef = body;
}}
onScroll={this.onScroll}
>
{loading}
{messageList}
);
}
}
// @ts-expect-error TS(2339): Property 'propTypes' does not exist on type 'typeo... Remove this comment to see the full error message
ConversationMessageList.propTypes = {
currentLocale: PropTypes.string,
messages: PropTypes.arrayOf(
PropTypes.shape({
creationTime: PropTypes.number,
id: PropTypes.number,
direction: PropTypes.string,
subject: PropTypes.string,
mmsAttachments: PropTypes.array,
}),
).isRequired,
className: PropTypes.string,
showSender: PropTypes.bool,
dateTimeFormatter: PropTypes.func.isRequired,
messageSubjectRenderer: PropTypes.func,
formatPhone: PropTypes.func.isRequired,
loadPreviousMessages: PropTypes.func,
loadingNextPage: PropTypes.bool,
height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
onAttachmentDownload: PropTypes.func,
};
// @ts-expect-error TS(2339): Property 'defaultProps' does not exist on type 'ty... Remove this comment to see the full error message
ConversationMessageList.defaultProps = {
currentLocale: 'en-US',
className: null,
showSender: false,
messageSubjectRenderer: undefined,
height: '100%',
loadingNextPage: false,
loadPreviousMessages: () => null,
onAttachmentDownload: undefined,
};
export default ConversationMessageList;