/************************************************************************ Copyright (C) Ayushya Amitabh - All Rights Reserved Unauthorized copying of this file, via any medium is strictly prohibited Proprietary and confidential Written by Ayushya Amitabh , 2020 https://www.chromewatchparty.com/copyright ========================================================================= ALL CONTENT ON WATCH PARTY'S WEBSITE OR IN WATCH PARTY'S CHROME EXTENSION APP, UNLESS OTHERWISE CITED ARE THE SOLE INTELLECTUAL PROPERTY OF AYUSHYA AMITABH, AND MAY NOT BE COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. ************************************************************************/ import React, { Component, createRef } from 'react'; import { Typography, IconButton, Paper, TextField, InputAdornment, Button, } from '@material-ui/core'; import { Reply, Send } from '@material-ui/icons'; import './Thread.css'; import { LocalData, webhookFetcher } from './Api'; import { CellMeasurer, CellMeasurerCache, AutoSizer, List } from 'react-virtualized'; var cache = new CellMeasurerCache({ fixedWidth: true, }); export default class Thread extends Component { constructor(props) { super(props); this.state = { autoSizeWidth: 0, }; this.listRef = createRef(); this.getMessage = this.getMessage.bind(this); this.getTimeString = this.getTimeString.bind(this); this.getReplyMessage = this.getReplyMessage.bind(this); this.getMessageTextOrImage = this.getMessageTextOrImage.bind(this); } scrollToMessage(msgIdx, messages) { this.listRef.current.scrollToRow(msgIdx); setTimeout(() => { const id = messages[msgIdx].id || `sending-${msgIdx}`; const msg = document.getElementById(id); msg.classList.add('highlight'); setTimeout(() => msg.classList.remove('highlight'), 2000); }, 500); } handleInteractiveMessageCall(msg) { const thanksElement = document.createElement('div'); thanksElement.innerText = 'THANK YOU FOR THE FEEDBACK'; thanksElement.className = 'thread-interactive-thankyou'; if (msg.uid === '') { if (msg.endpoint) { var bodyData = { question: msg.text, ...LocalData(), }; if (msg.type === 'interactive/text') { const answerElement = document.getElementById(`reply-${msg.id}`); bodyData.answer = answerElement ? answerElement.value : 'ANSWER_ELEM_NOT_FOUND'; answerElement.disabled = true; answerElement.parentElement.parentElement.parentElement.firstElementChild.remove(); answerElement.parentElement.replaceWith(thanksElement); } webhookFetcher({ endpoint: msg.endpoint, body: JSON.stringify(bodyData), }); } } } getItemClassNames(uid, userUid, msgIdx, messages, isSending = false) { const lastUid = msgIdx >= 1 ? messages[msgIdx - 1].uid : ''; return `thread-item ${uid === userUid ? 'my-message ' : ''}${ isSending ? 'sending-message ' : '' }${uid === '' ? 'system-message ' : ''}${lastUid === uid ? 'continued-message' : ''}`; } getMessageTextOrImage(msg, measure) { if (msg.type === 'giphy') { return gif; } if (msg.type === 'interactive/text') { return ( {msg.text} this.handleInteractiveMessageCall(msg)}> ), }} rowsMax={2} /> ); } if (msg.type === 'interactive/link') { return ( {msg.text} ); } return

{msg.text}

; } getTimeString(time) { return new Date(time.seconds * 1000).toLocaleTimeString(); } getReplyMessage(replyTo, messages) { if (replyTo !== undefined && replyTo !== null) { const replyMessage = messages.filter((v) => v.id === replyTo)[0]; if (replyMessage) { const msgIdx = messages.indexOf(replyMessage); return (
this.scrollToMessage(msgIdx, messages)}>

Reply to {replyMessage.name}:

{this.getMessageTextOrImage(replyMessage)}
); } } return null; } getMessage(params) { const { autoSizeWidth } = this.state; const { sentMessages, setReplyTo } = this.props; const { userUid } = LocalData(); const messages = sentMessages; const msg = messages[params.index]; const msgIdx = params.index; return ( {({ measure, registerChild }) => (
{msg.name}
{this.getReplyMessage(msg.replyTo, messages)}
{this.getTimeString(msg.time)}
setReplyTo(msg)}>
{this.getMessageTextOrImage(msg, measure)}
)}
); } render() { const { userUid } = LocalData(); const { autoSizeWidth } = this.state; const { sentMessages, isSending, sendingMessages, setReplyTo } = this.props; return !isSending ? ( {({ height, width }) => { if (autoSizeWidth !== width) { cache.clearAll(); this.listRef.current.recomputeRowHeights(); this.setState({ autoSizeWidth: width }); } return ( cache.rowHeight({ index }) + 10} rowRenderer={this.getMessage} /> ); }} ) : (
{sendingMessages.map((msg, msgIdx) => (
{msg.name}
{this.getReplyMessage(msg.replyTo, sentMessages)}
{this.getTimeString(msg.time)}
setReplyTo(msg)}>
{this.getMessageTextOrImage(msg, null)}
))}
); } } Thread.defaultProps = { setReplyTo: () => {}, };