index.tsx 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. import { makeStyles } from "@material-ui/core/styles";
  2. import { useState, useEffect, useCallback, useMemo } from "react";
  3. import { useSelector,useDispatch } from "react-redux";
  4. import ArrowBack from "./ArrowBack";
  5. import SendMessage from "./SendMessage";
  6. import UnpinBar from "./UnpinBar";
  7. import MessageLeftText from './Messages/MessageLeftText'
  8. import MessageLeftReply from "./Messages/MessageLeftReply";
  9. import MessageLeftForward from "./Messages/MessageLeftForward";
  10. import MessageLeftImage from './Messages/MessageLeftImage'
  11. import MessageLeftAudio from './Messages/MessageLeftAudio'
  12. import MessageLeftVideo from './Messages/MessageLeftVideo'
  13. import MessageLeftFile from "./Messages/MessageLeftFile";
  14. import MessageRightText from './Messages/MessageRightText'
  15. import MessageRightReply from "./Messages/MessageRightReply";
  16. import MessageRightForward from "./Messages/MessageRightForward";
  17. import MessageRightImage from './Messages/MessageRightImage'
  18. import MessageRightAudio from './Messages/MessageRightAudio'
  19. import MessageRightVideo from './Messages/MessageRightVideo'
  20. import MessageRightFile from "./Messages/MessageRightFile";
  21. import MessageDivider from "./Messages/MessageDivider";
  22. import AlertInfo from "../../../reusableComponents/AlertInfo";
  23. import ForwardSearchList from "./ForwardSearchList";
  24. import { getMessagesMemo } from '../../../../redux/messages/selector'
  25. import { getAuthorizationState } from '../../../../redux/authorization/selector'
  26. import { getChat } from '../../../../redux/chat/selector'
  27. import { getScrollChat } from '../../../../redux/control/selector'
  28. import { actionScrollChat,actionOpenPinned,actionRightIsOpen } from '../../../../redux/control/action'
  29. import { asyncGetMessagesById } from '../../../../redux/messages/operations'
  30. import { asyncGetChatById,asyncStartChatById } from "../../../../redux/chat/operations";
  31. import { seenChat } from "../../../../api-data";
  32. import { TPinnedMessages } from "../../../../typescript/redux/pinnedMessages/types";
  33. import { TMessage } from "../../../../typescript/redux/allMessages/types";
  34. import { timeStampFilter,prodAwsS3,refreshAppTime } from "../../../../helpers";
  35. const debounce = require('lodash.debounce');
  36. const useStyles = makeStyles({
  37. container: {
  38. height: '93vh',
  39. width: "100%",
  40. display: "flex",
  41. alignItems: "center",
  42. alignContent:"center",
  43. flexDirection: "column",
  44. position: "relative",
  45. },
  46. messagesScroll: {
  47. paddingTop: 30,
  48. overflowY: "scroll",
  49. maxHeight: '83vh',
  50. width: "100%",
  51. display: "flex",
  52. justifyContent: 'center',
  53. '&::-webkit-scrollbar': {
  54. width: '0.4em'
  55. },
  56. '&::-webkit-scrollbar-track': {
  57. boxShadow: 'inset 0 0 6px rgba(0,0,0,0.00)',
  58. webkitBoxShadow: 'inset 0 0 6px rgba(0,0,0,0.00)',
  59. backgroundColor: '#eceeec',
  60. },
  61. '&::-webkit-scrollbar-thumb': {
  62. backgroundColor: '#ccc8c8',
  63. },
  64. "&::-webkit-scrollbar-thumb:focus": {
  65. backgroundColor: "#959595",
  66. },
  67. "&::-webkit-scrollbar-thumb:active": {
  68. backgroundColor: "#959595",
  69. },
  70. },
  71. messagesEmpty: {
  72. overflowY: "hidden",
  73. width: "100%",
  74. display: "flex",
  75. justifyContent: 'center',
  76. paddingTop: 30,
  77. },
  78. messagesBody: {
  79. width: "60%",
  80. },
  81. });
  82. interface IChatBar {
  83. chatDivRef: any | null,
  84. selectedArr: string[] | [],
  85. setSelectedArr: React.Dispatch<React.SetStateAction<string[] | []>>,
  86. isSomeSelected: boolean,
  87. setIsSomeSelected: React.Dispatch<React.SetStateAction<boolean>>,
  88. openPinned: boolean,
  89. pinnedMessagesMemo: TPinnedMessages,
  90. handleUnpinAll: () => void,
  91. }
  92. const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSomeSelected,openPinned,pinnedMessagesMemo,handleUnpinAll}:IChatBar) => {
  93. const classes = useStyles();
  94. const dispatch = useDispatch()
  95. const messagesMemo = useSelector(getMessagesMemo)
  96. const { number:userNumber,nightMode,silentMode} = useSelector(getAuthorizationState)
  97. const { companionId,total,seen,mute,seenCompanion,number:chatNumber } = useSelector(getChat)
  98. const scrollChat = useSelector(getScrollChat)
  99. const [isArrow, setIsArrow] = useState<boolean>(false)
  100. const [isNew, setIsNew] = useState<{ new: number, mute: boolean }>({ new: 0, mute: false })
  101. const [isReply, setIsReply] = useState<TMessage | undefined>(undefined)
  102. const [isForward, setIsForward] = useState<TMessage | undefined>(undefined)
  103. const [isEdit, setIsEdit] = useState<TMessage | undefined>(undefined)
  104. const [modalForward, setModalForward] = useState<boolean>(false)
  105. let time: any
  106. let tongue: any
  107. let unread: any
  108. const getSeconds = (createdAt:string) => Math.round(new Date(createdAt).getTime()/ 1000)
  109. const isSelected = (_id: string) => selectedArr.some((el: string) => el === _id)
  110. const handleSelected = (_id: string) => {
  111. !isSomeSelected&&setIsSomeSelected(true)
  112. if (selectedArr.some((el: string) => el === _id))
  113. setSelectedArr(selectedArr.filter((el:string) => el !== _id))
  114. else setSelectedArr([...selectedArr,_id])
  115. }
  116. const handleReply = (_id: string) => {
  117. openPinned && dispatch(actionOpenPinned(false))
  118. isEdit&&setIsEdit(undefined)
  119. setIsReply(renderArr.find((el) => el._id ===_id))
  120. }
  121. const handleForward = (_id: string) => {
  122. openPinned && dispatch(actionOpenPinned(false))
  123. isReply && setIsReply(undefined)
  124. isEdit&&setIsEdit(undefined)
  125. setIsForward(renderArr.find((el) => el._id === _id))
  126. setModalForward(true)
  127. }
  128. const handleEdit = (_id: string) => {
  129. openPinned && dispatch(actionOpenPinned(false))
  130. isReply && setIsReply(undefined)
  131. setIsEdit(renderArr.find((el) => el._id ===_id))
  132. }
  133. const handleScrollTo = useCallback(() => {
  134. chatDivRef.current&&chatDivRef.current.scrollTo({
  135. top: chatDivRef.current.scrollHeight,
  136. behavior: 'smooth'
  137. })
  138. },[chatDivRef])
  139. const handleScroll = useCallback(({ target:{scrollHeight,scrollTop,clientHeight}}: any) => {
  140. const different = scrollHeight - Math.floor(scrollTop)
  141. const reached = different - clientHeight
  142. if (total !== seen&&reached < 10 && !openPinned) seenChat(companionId)
  143. setIsArrow(different === clientHeight ? false : true)
  144. }, [total,seen, companionId,openPinned])
  145. const debouncedHandleScroll = debounce(handleScroll, 300)
  146. const renderArr = useMemo(() => {
  147. return !openPinned ? messagesMemo : pinnedMessagesMemo
  148. }, [messagesMemo, pinnedMessagesMemo, openPinned])
  149. const handleScrollToTheMessage = (_id:string) => {
  150. const childNodes = chatDivRef.current.childNodes[0].childNodes
  151. let toScrollNode = [...childNodes].find((el: any) => el.id === _id)
  152. if (toScrollNode) {
  153. toScrollNode = [...toScrollNode.childNodes].slice(-1)[0]
  154. toScrollNode.style.backgroundColor = 'rgba(70, 70, 70, 0.4)'
  155. toScrollNode.style.boxShadow = '0px 0px 6px 0px #ffffff'
  156. toScrollNode.scrollIntoView({ behavior: 'smooth' })
  157. setTimeout(() => {
  158. toScrollNode.style.backgroundColor = 'unset'
  159. toScrollNode.style.boxShadow = 'unset'
  160. }, 2000)
  161. }
  162. }
  163. const handleScrollToTheChat = (companionIdForwardToAndFrom:string,oldId:string) => {
  164. if (companionId === companionIdForwardToAndFrom) return handleScrollToTheMessage(oldId)
  165. dispatch(actionRightIsOpen(''))
  166. dispatch(actionOpenPinned(false))
  167. dispatch(asyncStartChatById(companionIdForwardToAndFrom))
  168. setTimeout(() => handleScrollToTheMessage(oldId), 2000)
  169. }
  170. useEffect(() => {
  171. if (scrollChat) {
  172. dispatch(asyncGetMessagesById(companionId, handleScrollTo))
  173. dispatch(actionScrollChat(false))
  174. }
  175. }, [dispatch,handleScrollTo, scrollChat, companionId])
  176. useEffect(() => {
  177. const handleReset = () => {
  178. dispatch(asyncGetChatById(companionId))
  179. dispatch(asyncGetMessagesById(companionId, null))
  180. }
  181. handleReset()
  182. const idInterval = setInterval(handleReset, refreshAppTime);
  183. return () => clearInterval(idInterval);
  184. }, [dispatch, companionId]);
  185. useEffect(() => {
  186. setIsNew({ new:total-seen,mute})
  187. }, [total, seen, mute]);
  188. useEffect(() => {
  189. if (chatDivRef.current&&openPinned) {
  190. const { scrollHeight, clientHeight } = chatDivRef.current
  191. if (scrollHeight === clientHeight && isArrow) setIsArrow(false)
  192. }
  193. }, [chatDivRef,openPinned,pinnedMessagesMemo.length, isArrow]);
  194. useEffect(() => {
  195. const handleReset = () => {
  196. if (chatDivRef.current&&!openPinned) {
  197. const { scrollHeight, clientHeight } = chatDivRef.current
  198. if (total !== seen && scrollHeight === clientHeight) seenChat(companionId)
  199. }
  200. }
  201. const idInterval = setInterval(handleReset, refreshAppTime);
  202. return () => clearInterval(idInterval);
  203. }, [total, seen, chatDivRef, companionId, openPinned]);
  204. return (
  205. <div className={classes.container} >
  206. <ArrowBack isArrow={isArrow} isNew={isNew} handleScrollTo={handleScrollTo} openPinned={openPinned}/>
  207. {isForward && modalForward && <ForwardSearchList setModalForward={setModalForward}
  208. setIsForward={setIsForward} companionId={companionId}/>}
  209. <div id={companionId} ref={chatDivRef} onScroll={debouncedHandleScroll}
  210. className={messagesMemo.length > 0 ? classes.messagesScroll : classes.messagesEmpty}>
  211. <div className={classes.messagesBody}>
  212. {messagesMemo.length > 0 ? renderArr.map(({ replyMessage,message, name, lastName,avatarUrl,color,pinned,
  213. createdAt, number, type, fullType, replyName, replyLastName, replyCaption, caption, emoji, emojiCompanion,
  214. _id, oldId, forwardName, forwardLastName, companionIdForwardToAndFrom,forwardMessage,forwardCaption,edited},i) => {
  215. const watched = seenCompanion - (i + 1) < 0 ? false : true
  216. let isUnread
  217. let isTime
  218. let isTongue = false
  219. const nextTongue = renderArr[i + 1]
  220. if (!unread && chatNumber === number&& seen - (i + 1) < 0) {
  221. isUnread = true
  222. unread = true
  223. }
  224. if (!time) {
  225. isTime = true
  226. time = createdAt
  227. } else if (timeStampFilter(time) !== timeStampFilter(createdAt)) {
  228. time = createdAt
  229. isTime = true
  230. }
  231. if (!tongue&&nextTongue&&nextTongue.number === number) {
  232. if (getSeconds(nextTongue.createdAt) - getSeconds(createdAt) < 600) {
  233. isTongue = false
  234. } else {
  235. isTongue = true
  236. }
  237. tongue = number
  238. } else if (!tongue&&nextTongue&&nextTongue.number !== number) {
  239. isTongue = true
  240. tongue = null
  241. } else if (tongue&&nextTongue&&tongue === number&&nextTongue.number === number) {
  242. if (getSeconds(nextTongue.createdAt) - getSeconds(createdAt) < 600) {
  243. isTongue = false
  244. } else {
  245. isTongue = true
  246. }
  247. tongue = number
  248. } else if (tongue&&nextTongue&&tongue === number&&nextTongue.number !== number) {
  249. isTongue = true
  250. tongue = null
  251. } else if (tongue&&!nextTongue&&tongue === number) {
  252. isTongue = true
  253. tongue = null
  254. } else if (tongue&&!nextTongue&&tongue !== number) {
  255. isTongue = false
  256. tongue = number
  257. }
  258. if(renderArr.length-1 === i) isTongue = true
  259. if (nextTongue && timeStampFilter(nextTongue.createdAt) !== timeStampFilter(createdAt)) {
  260. isTongue = true
  261. }
  262. const url = `${prodAwsS3}/${message}`
  263. const urlForward = `${prodAwsS3}/${forwardMessage}`
  264. const urlReply = `${prodAwsS3}/${replyMessage}`
  265. if (number !== userNumber) {
  266. if (type === 'text' && !oldId && !companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  267. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  268. {isUnread&&<MessageDivider message='Unread Messages'/>}
  269. <MessageLeftText
  270. message={message}
  271. tongue={isTongue}
  272. watched={!unread}
  273. edited={edited}
  274. avatarUrl={avatarUrl}
  275. color={color}
  276. createdAt={createdAt}
  277. name={name}
  278. lastName={lastName}
  279. caption={caption}
  280. emoji={emoji}
  281. emojiCompanion={emojiCompanion}
  282. pinned={pinned}
  283. isSomeSelected={isSomeSelected}
  284. isSelected={isSelected}
  285. handleSelected={handleSelected}
  286. _id={_id}
  287. nightMode={nightMode}
  288. handleReply={handleReply}
  289. handleForward={handleForward}
  290. /></div>)
  291. if (type === 'text' && companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  292. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  293. {isUnread&&<MessageDivider message='Unread Messages'/>}
  294. <MessageLeftForward
  295. url={urlForward}
  296. companionIdForwardToAndFrom={companionIdForwardToAndFrom}
  297. oldId={oldId}
  298. tongue={isTongue}
  299. watched={!unread}
  300. edited={edited}
  301. avatarUrl={avatarUrl}
  302. color={color}
  303. name={name}
  304. lastName={lastName}
  305. forwardName={forwardName}
  306. forwardLastName={forwardLastName}
  307. forwardMessage={forwardMessage}
  308. forwardCaption={forwardCaption}
  309. message={message}
  310. createdAt={createdAt}
  311. caption={caption}
  312. emoji={emoji}
  313. emojiCompanion={emojiCompanion}
  314. pinned={pinned}
  315. isSomeSelected={isSomeSelected}
  316. isSelected={isSelected}
  317. handleSelected={handleSelected}
  318. _id={_id}
  319. nightMode={nightMode}
  320. handleReply={handleReply}
  321. handleForward={handleForward}
  322. fullType={fullType}
  323. handleScrollToTheChat={handleScrollToTheChat}
  324. /></div>)
  325. if (type === 'text' && oldId) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  326. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  327. {isUnread&&<MessageDivider message='Unread Messages'/>}
  328. <MessageLeftReply
  329. url={urlReply}
  330. tongue={isTongue}
  331. watched={!unread}
  332. edited={edited}
  333. avatarUrl={avatarUrl}
  334. color={color}
  335. replyMessage={replyMessage}
  336. message={message}
  337. createdAt={createdAt}
  338. name={name}
  339. lastName={lastName}
  340. replyName={replyName}
  341. replyLastName={replyLastName}
  342. replyCaption={replyCaption}
  343. caption={caption}
  344. emoji={emoji}
  345. emojiCompanion={emojiCompanion}
  346. pinned={pinned}
  347. isSomeSelected={isSomeSelected}
  348. isSelected={isSelected}
  349. handleSelected={handleSelected}
  350. _id={_id}
  351. nightMode={nightMode}
  352. handleReply={handleReply}
  353. handleForward={handleForward}
  354. fullType={fullType}
  355. handleScrollToTheMessage={handleScrollToTheMessage}
  356. oldId={oldId}
  357. /></div>)
  358. if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  359. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  360. {isUnread&&<MessageDivider message='Unread Messages'/>}
  361. <MessageLeftImage
  362. url={url}
  363. tongue={isTongue}
  364. watched={!unread}
  365. edited={edited}
  366. avatarUrl={avatarUrl}
  367. color={color}
  368. createdAt={createdAt}
  369. fullType={fullType}
  370. caption={caption}
  371. emoji={emoji}
  372. emojiCompanion={emojiCompanion}
  373. pinned={pinned}
  374. isSomeSelected={isSomeSelected}
  375. isSelected={isSelected}
  376. handleSelected={handleSelected}
  377. _id={_id}
  378. name={name}
  379. lastName={lastName}
  380. nightMode={nightMode}
  381. handleReply={handleReply}
  382. handleForward={handleForward}
  383. /></div>)
  384. if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  385. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  386. {isUnread&&<MessageDivider message='Unread Messages'/>}
  387. <MessageLeftAudio
  388. url={url}
  389. tongue={isTongue}
  390. watched={!unread}
  391. edited={edited}
  392. avatarUrl={avatarUrl}
  393. color={color}
  394. name={name}
  395. lastName={lastName}
  396. createdAt={createdAt}
  397. fullType={fullType}
  398. caption={caption}
  399. emoji={emoji}
  400. emojiCompanion={emojiCompanion}
  401. pinned={pinned}
  402. isSomeSelected={isSomeSelected}
  403. isSelected={isSelected}
  404. handleSelected={handleSelected}
  405. _id={_id}
  406. nightMode={nightMode}
  407. handleReply={handleReply}
  408. handleForward={handleForward}
  409. /></div>)
  410. if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  411. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  412. {isUnread&&<MessageDivider message='Unread Messages'/>}
  413. <MessageLeftVideo
  414. url={url}
  415. tongue={isTongue}
  416. watched={!unread}
  417. edited={edited}
  418. avatarUrl={avatarUrl}
  419. color={color}
  420. name={name}
  421. lastName={lastName}
  422. createdAt={createdAt}
  423. fullType={fullType}
  424. caption={caption}
  425. emoji={emoji}
  426. emojiCompanion={emojiCompanion}
  427. pinned={pinned}
  428. isSomeSelected={isSomeSelected}
  429. isSelected={isSelected}
  430. handleSelected={handleSelected}
  431. _id={_id}
  432. nightMode={nightMode}
  433. handleReply={handleReply}
  434. handleForward={handleForward}
  435. /></div>)
  436. if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  437. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  438. {isUnread&&<MessageDivider message='Unread Messages'/>}
  439. <MessageLeftFile
  440. url={url}
  441. tongue={isTongue}
  442. watched={!unread}
  443. edited={edited}
  444. avatarUrl={avatarUrl}
  445. color={color}
  446. name={name}
  447. lastName={lastName}
  448. createdAt={createdAt}
  449. type={type}
  450. caption={caption}
  451. emoji={emoji}
  452. emojiCompanion={emojiCompanion}
  453. pinned={pinned}
  454. isSomeSelected={isSomeSelected}
  455. isSelected={isSelected}
  456. handleSelected={handleSelected}
  457. _id={_id}
  458. nightMode={nightMode}
  459. handleReply={handleReply}
  460. handleForward={handleForward}
  461. /></div>)
  462. } else {
  463. if (type === 'text' && !oldId && !companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  464. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  465. {isUnread&&<MessageDivider message='Unread Messages'/>}
  466. <MessageRightText
  467. message={message}
  468. tongue={isTongue}
  469. watched={watched}
  470. edited={edited}
  471. avatarUrl={avatarUrl}
  472. color={color}
  473. createdAt={createdAt}
  474. name={name}
  475. lastName={lastName}
  476. caption={caption}
  477. emoji={emoji}
  478. emojiCompanion={emojiCompanion}
  479. pinned={pinned}
  480. isSomeSelected={isSomeSelected}
  481. isSelected={isSelected}
  482. handleSelected={handleSelected}
  483. _id={_id}
  484. nightMode={nightMode}
  485. handleReply={handleReply}
  486. handleForward={handleForward}
  487. handleEdit={handleEdit}
  488. /></div>)
  489. if (type === 'text' && companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  490. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  491. {isUnread&&<MessageDivider message='Unread Messages'/>}
  492. <MessageRightForward
  493. url={urlForward}
  494. oldId={oldId}
  495. companionIdForwardToAndFrom={companionIdForwardToAndFrom}
  496. tongue={isTongue}
  497. watched={watched}
  498. edited={edited}
  499. avatarUrl={avatarUrl}
  500. color={color}
  501. name={name}
  502. lastName={lastName}
  503. forwardName={forwardName}
  504. forwardLastName={forwardLastName}
  505. forwardMessage={forwardMessage}
  506. forwardCaption={forwardCaption}
  507. message={message}
  508. createdAt={createdAt}
  509. caption={caption}
  510. emoji={emoji}
  511. emojiCompanion={emojiCompanion}
  512. pinned={pinned}
  513. isSomeSelected={isSomeSelected}
  514. isSelected={isSelected}
  515. handleSelected={handleSelected}
  516. _id={_id}
  517. nightMode={nightMode}
  518. handleReply={handleReply}
  519. handleForward={handleForward}
  520. handleEdit={handleEdit}
  521. fullType={fullType}
  522. handleScrollToTheChat={handleScrollToTheChat}
  523. /></div>)
  524. if (type === 'text' && oldId) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  525. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  526. {isUnread&&<MessageDivider message='Unread Messages'/>}
  527. <MessageRightReply
  528. url={urlReply}
  529. tongue={isTongue}
  530. watched={watched}
  531. edited={edited}
  532. avatarUrl={avatarUrl}
  533. color={color}
  534. replyMessage={replyMessage}
  535. message={message}
  536. createdAt={createdAt}
  537. name={name}
  538. lastName={lastName}
  539. replyName={replyName}
  540. replyLastName={replyLastName}
  541. replyCaption={replyCaption}
  542. caption={caption}
  543. emoji={emoji}
  544. emojiCompanion={emojiCompanion}
  545. pinned={pinned}
  546. isSomeSelected={isSomeSelected}
  547. isSelected={isSelected}
  548. handleSelected={handleSelected}
  549. _id={_id}
  550. nightMode={nightMode}
  551. handleReply={handleReply}
  552. handleForward={handleForward}
  553. handleEdit={handleEdit}
  554. fullType={fullType}
  555. handleScrollToTheMessage={handleScrollToTheMessage}
  556. oldId={oldId}
  557. /></div>)
  558. if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  559. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  560. {isUnread&&<MessageDivider message='Unread Messages'/>}
  561. <MessageRightImage
  562. url={url}
  563. tongue={isTongue}
  564. watched={watched}
  565. edited={edited}
  566. avatarUrl={avatarUrl}
  567. color={color}
  568. createdAt={createdAt}
  569. fullType={fullType}
  570. caption={caption}
  571. emoji={emoji}
  572. emojiCompanion={emojiCompanion}
  573. pinned={pinned}
  574. isSomeSelected={isSomeSelected}
  575. isSelected={isSelected}
  576. handleSelected={handleSelected}
  577. _id={_id}
  578. name={name}
  579. lastName={lastName}
  580. nightMode={nightMode}
  581. handleReply={handleReply}
  582. handleForward={handleForward}
  583. handleEdit={handleEdit}
  584. /></div>)
  585. if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  586. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  587. {isUnread&&<MessageDivider message='Unread Messages'/>}
  588. <MessageRightAudio
  589. url={url}
  590. tongue={isTongue}
  591. watched={watched}
  592. edited={edited}
  593. avatarUrl={avatarUrl}
  594. color={color}
  595. name={name}
  596. lastName={lastName}
  597. createdAt={createdAt}
  598. fullType={fullType}
  599. caption={caption}
  600. emoji={emoji}
  601. emojiCompanion={emojiCompanion}
  602. pinned={pinned}
  603. isSomeSelected={isSomeSelected}
  604. isSelected={isSelected}
  605. handleSelected={handleSelected}
  606. _id={_id}
  607. nightMode={nightMode}
  608. handleReply={handleReply}
  609. handleForward={handleForward}
  610. handleEdit={handleEdit}
  611. /></div>)
  612. if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  613. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  614. {isUnread&&<MessageDivider message='Unread Messages'/>}
  615. <MessageRightVideo
  616. url={url}
  617. tongue={isTongue}
  618. watched={watched}
  619. edited={edited}
  620. avatarUrl={avatarUrl}
  621. color={color}
  622. name={name}
  623. lastName={lastName}
  624. createdAt={createdAt}
  625. fullType={fullType}
  626. caption={caption}
  627. emoji={emoji}
  628. emojiCompanion={emojiCompanion}
  629. pinned={pinned}
  630. isSomeSelected={isSomeSelected}
  631. isSelected={isSelected}
  632. handleSelected={handleSelected}
  633. _id={_id}
  634. nightMode={nightMode}
  635. handleReply={handleReply}
  636. handleForward={handleForward}
  637. handleEdit={handleEdit}
  638. /></div>)
  639. if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  640. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  641. {isUnread&&<MessageDivider message='Unread Messages'/>}
  642. <MessageRightFile
  643. url={url}
  644. tongue={isTongue}
  645. watched={watched}
  646. edited={edited}
  647. avatarUrl={avatarUrl}
  648. color={color}
  649. name={name}
  650. lastName={lastName}
  651. createdAt={createdAt}
  652. type={type}
  653. caption={caption}
  654. emoji={emoji}
  655. emojiCompanion={emojiCompanion}
  656. pinned={pinned}
  657. isSomeSelected={isSomeSelected}
  658. isSelected={isSelected}
  659. handleSelected={handleSelected}
  660. _id={_id}
  661. nightMode={nightMode}
  662. handleReply={handleReply}
  663. handleForward={handleForward}
  664. handleEdit={handleEdit}
  665. /></div>)
  666. }
  667. }) : <AlertInfo name='You do not have messages yet!' />}
  668. </div>
  669. </div>
  670. {!openPinned && !isSomeSelected && <SendMessage isArrow={isArrow} silentMode={silentMode} isReply={isReply} setIsReply={setIsReply}
  671. isForward={isForward} setIsForward={setIsForward}
  672. isEdit={isEdit} setIsEdit={setIsEdit}
  673. modalForward={modalForward} handleScrollToTheMessage={handleScrollToTheMessage}/>}
  674. {openPinned&&!isSomeSelected&&<UnpinBar pinnedMessagesMemo={pinnedMessagesMemo} handleUnpinAll={handleUnpinAll} />}
  675. </div>
  676. );
  677. }
  678. export default ChatBar