index.tsx 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  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:editedr},i) => {
  215. const watched = seenCompanion - (i + 1) < 0 ? false : true
  216. const edited = !editedr
  217. let isUnread
  218. let isTime
  219. let isTongue = false
  220. const nextTongue = renderArr[i + 1]
  221. const prevTongue = renderArr[i - 1]
  222. if (!unread && chatNumber === number&& seen - (i + 1) < 0) {
  223. isUnread = true
  224. unread = true
  225. }
  226. if (!time) {
  227. isTime = true
  228. time = createdAt
  229. } else if (timeStampFilter(time) !== timeStampFilter(createdAt)) {
  230. time = createdAt
  231. isTime = true
  232. }
  233. if (!tongue&&nextTongue&&nextTongue.number === number) {
  234. if (getSeconds(nextTongue.createdAt) - getSeconds(createdAt) < 600) {
  235. isTongue = false
  236. } else {
  237. isTongue = true
  238. }
  239. tongue = number
  240. } else if (!tongue&&nextTongue&&nextTongue.number !== number) {
  241. isTongue = true
  242. tongue = null
  243. } else if (tongue&&nextTongue&&tongue === number&&nextTongue.number === number) {
  244. if (getSeconds(nextTongue.createdAt) - getSeconds(createdAt) < 600) {
  245. isTongue = false
  246. } else {
  247. isTongue = true
  248. }
  249. tongue = number
  250. } else if (tongue&&nextTongue&&tongue === number&&nextTongue.number !== number) {
  251. isTongue = true
  252. tongue = null
  253. } else if (tongue&&!nextTongue&&tongue === number) {
  254. isTongue = true
  255. tongue = null
  256. } else if (tongue&&!nextTongue&&tongue !== number) {
  257. isTongue = false
  258. tongue = number
  259. }
  260. if(renderArr.length-1 === i) isTongue = true
  261. if (nextTongue && timeStampFilter(nextTongue.createdAt) !== timeStampFilter(createdAt)) {
  262. isTongue = true
  263. }
  264. const url = `${prodAwsS3}/${message}`
  265. const urlForward = `${prodAwsS3}/${forwardMessage}`
  266. const urlReply = `${prodAwsS3}/${replyMessage}`
  267. if (number !== userNumber) {
  268. if (type === 'text' && !oldId && !companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  269. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  270. {isUnread&&<MessageDivider message='Unread Messages'/>}
  271. <MessageLeftText
  272. message={message}
  273. tongue={isTongue}
  274. watched={!unread}
  275. edited={edited}
  276. avatarUrl={avatarUrl}
  277. color={color}
  278. createdAt={createdAt}
  279. name={name}
  280. lastName={lastName}
  281. caption={caption}
  282. emoji={emoji}
  283. emojiCompanion={emojiCompanion}
  284. pinned={pinned}
  285. isSomeSelected={isSomeSelected}
  286. isSelected={isSelected}
  287. handleSelected={handleSelected}
  288. _id={_id}
  289. nightMode={nightMode}
  290. handleReply={handleReply}
  291. handleForward={handleForward}
  292. /></div>)
  293. if (type === 'text' && companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  294. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  295. {isUnread&&<MessageDivider message='Unread Messages'/>}
  296. <MessageLeftForward
  297. url={urlForward}
  298. companionIdForwardToAndFrom={companionIdForwardToAndFrom}
  299. oldId={oldId}
  300. tongue={isTongue}
  301. watched={!unread}
  302. edited={edited}
  303. avatarUrl={avatarUrl}
  304. color={color}
  305. name={name}
  306. lastName={lastName}
  307. forwardName={forwardName}
  308. forwardLastName={forwardLastName}
  309. forwardMessage={forwardMessage}
  310. forwardCaption={forwardCaption}
  311. message={message}
  312. createdAt={createdAt}
  313. caption={caption}
  314. emoji={emoji}
  315. emojiCompanion={emojiCompanion}
  316. pinned={pinned}
  317. isSomeSelected={isSomeSelected}
  318. isSelected={isSelected}
  319. handleSelected={handleSelected}
  320. _id={_id}
  321. nightMode={nightMode}
  322. handleReply={handleReply}
  323. handleForward={handleForward}
  324. fullType={fullType}
  325. handleScrollToTheChat={handleScrollToTheChat}
  326. /></div>)
  327. if (type === 'text' && oldId) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  328. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  329. {isUnread&&<MessageDivider message='Unread Messages'/>}
  330. <MessageLeftReply
  331. url={urlReply}
  332. tongue={isTongue}
  333. watched={!unread}
  334. edited={edited}
  335. avatarUrl={avatarUrl}
  336. color={color}
  337. replyMessage={replyMessage}
  338. message={message}
  339. createdAt={createdAt}
  340. name={name}
  341. lastName={lastName}
  342. replyName={replyName}
  343. replyLastName={replyLastName}
  344. replyCaption={replyCaption}
  345. caption={caption}
  346. emoji={emoji}
  347. emojiCompanion={emojiCompanion}
  348. pinned={pinned}
  349. isSomeSelected={isSomeSelected}
  350. isSelected={isSelected}
  351. handleSelected={handleSelected}
  352. _id={_id}
  353. nightMode={nightMode}
  354. handleReply={handleReply}
  355. handleForward={handleForward}
  356. fullType={fullType}
  357. handleScrollToTheMessage={handleScrollToTheMessage}
  358. oldId={oldId}
  359. /></div>)
  360. if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  361. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  362. {isUnread&&<MessageDivider message='Unread Messages'/>}
  363. <MessageLeftImage
  364. url={url}
  365. tongue={isTongue}
  366. watched={!unread}
  367. edited={edited}
  368. avatarUrl={avatarUrl}
  369. color={color}
  370. createdAt={createdAt}
  371. fullType={fullType}
  372. caption={caption}
  373. emoji={emoji}
  374. emojiCompanion={emojiCompanion}
  375. pinned={pinned}
  376. isSomeSelected={isSomeSelected}
  377. isSelected={isSelected}
  378. handleSelected={handleSelected}
  379. _id={_id}
  380. name={name}
  381. lastName={lastName}
  382. nightMode={nightMode}
  383. handleReply={handleReply}
  384. handleForward={handleForward}
  385. /></div>)
  386. if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  387. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  388. {isUnread&&<MessageDivider message='Unread Messages'/>}
  389. <MessageLeftAudio
  390. url={url}
  391. tongue={isTongue}
  392. watched={!unread}
  393. edited={edited}
  394. avatarUrl={avatarUrl}
  395. color={color}
  396. name={name}
  397. lastName={lastName}
  398. createdAt={createdAt}
  399. fullType={fullType}
  400. caption={caption}
  401. emoji={emoji}
  402. emojiCompanion={emojiCompanion}
  403. pinned={pinned}
  404. isSomeSelected={isSomeSelected}
  405. isSelected={isSelected}
  406. handleSelected={handleSelected}
  407. _id={_id}
  408. nightMode={nightMode}
  409. handleReply={handleReply}
  410. handleForward={handleForward}
  411. /></div>)
  412. if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  413. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  414. {isUnread&&<MessageDivider message='Unread Messages'/>}
  415. <MessageLeftVideo
  416. url={url}
  417. tongue={isTongue}
  418. watched={!unread}
  419. edited={edited}
  420. avatarUrl={avatarUrl}
  421. color={color}
  422. name={name}
  423. lastName={lastName}
  424. createdAt={createdAt}
  425. fullType={fullType}
  426. caption={caption}
  427. emoji={emoji}
  428. emojiCompanion={emojiCompanion}
  429. pinned={pinned}
  430. isSomeSelected={isSomeSelected}
  431. isSelected={isSelected}
  432. handleSelected={handleSelected}
  433. _id={_id}
  434. nightMode={nightMode}
  435. handleReply={handleReply}
  436. handleForward={handleForward}
  437. /></div>)
  438. if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  439. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  440. {isUnread&&<MessageDivider message='Unread Messages'/>}
  441. <MessageLeftFile
  442. url={url}
  443. tongue={isTongue}
  444. watched={!unread}
  445. edited={edited}
  446. avatarUrl={avatarUrl}
  447. color={color}
  448. name={name}
  449. lastName={lastName}
  450. createdAt={createdAt}
  451. type={type}
  452. caption={caption}
  453. emoji={emoji}
  454. emojiCompanion={emojiCompanion}
  455. pinned={pinned}
  456. isSomeSelected={isSomeSelected}
  457. isSelected={isSelected}
  458. handleSelected={handleSelected}
  459. _id={_id}
  460. nightMode={nightMode}
  461. handleReply={handleReply}
  462. handleForward={handleForward}
  463. /></div>)
  464. } else {
  465. if (type === 'text' && !oldId && !companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  466. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  467. {isUnread&&<MessageDivider message='Unread Messages'/>}
  468. <MessageRightText
  469. message={message}
  470. tongue={isTongue}
  471. watched={watched}
  472. edited={edited}
  473. avatarUrl={avatarUrl}
  474. color={color}
  475. createdAt={createdAt}
  476. name={name}
  477. lastName={lastName}
  478. caption={caption}
  479. emoji={emoji}
  480. emojiCompanion={emojiCompanion}
  481. pinned={pinned}
  482. isSomeSelected={isSomeSelected}
  483. isSelected={isSelected}
  484. handleSelected={handleSelected}
  485. _id={_id}
  486. nightMode={nightMode}
  487. handleReply={handleReply}
  488. handleForward={handleForward}
  489. handleEdit={handleEdit}
  490. /></div>)
  491. if (type === 'text' && companionIdForwardToAndFrom) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  492. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  493. {isUnread&&<MessageDivider message='Unread Messages'/>}
  494. <MessageRightForward
  495. url={urlForward}
  496. oldId={oldId}
  497. companionIdForwardToAndFrom={companionIdForwardToAndFrom}
  498. tongue={isTongue}
  499. watched={watched}
  500. edited={edited}
  501. avatarUrl={avatarUrl}
  502. color={color}
  503. name={name}
  504. lastName={lastName}
  505. forwardName={forwardName}
  506. forwardLastName={forwardLastName}
  507. forwardMessage={forwardMessage}
  508. forwardCaption={forwardCaption}
  509. message={message}
  510. createdAt={createdAt}
  511. caption={caption}
  512. emoji={emoji}
  513. emojiCompanion={emojiCompanion}
  514. pinned={pinned}
  515. isSomeSelected={isSomeSelected}
  516. isSelected={isSelected}
  517. handleSelected={handleSelected}
  518. _id={_id}
  519. nightMode={nightMode}
  520. handleReply={handleReply}
  521. handleForward={handleForward}
  522. handleEdit={handleEdit}
  523. fullType={fullType}
  524. handleScrollToTheChat={handleScrollToTheChat}
  525. /></div>)
  526. if (type === 'text' && oldId) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  527. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  528. {isUnread&&<MessageDivider message='Unread Messages'/>}
  529. <MessageRightReply
  530. url={urlReply}
  531. tongue={isTongue}
  532. watched={watched}
  533. edited={edited}
  534. avatarUrl={avatarUrl}
  535. color={color}
  536. replyMessage={replyMessage}
  537. message={message}
  538. createdAt={createdAt}
  539. name={name}
  540. lastName={lastName}
  541. replyName={replyName}
  542. replyLastName={replyLastName}
  543. replyCaption={replyCaption}
  544. caption={caption}
  545. emoji={emoji}
  546. emojiCompanion={emojiCompanion}
  547. pinned={pinned}
  548. isSomeSelected={isSomeSelected}
  549. isSelected={isSelected}
  550. handleSelected={handleSelected}
  551. _id={_id}
  552. nightMode={nightMode}
  553. handleReply={handleReply}
  554. handleForward={handleForward}
  555. handleEdit={handleEdit}
  556. fullType={fullType}
  557. handleScrollToTheMessage={handleScrollToTheMessage}
  558. oldId={oldId}
  559. /></div>)
  560. if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  561. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  562. {isUnread&&<MessageDivider message='Unread Messages'/>}
  563. <MessageRightImage
  564. url={url}
  565. tongue={isTongue}
  566. watched={watched}
  567. edited={edited}
  568. avatarUrl={avatarUrl}
  569. color={color}
  570. createdAt={createdAt}
  571. fullType={fullType}
  572. caption={caption}
  573. emoji={emoji}
  574. emojiCompanion={emojiCompanion}
  575. pinned={pinned}
  576. isSomeSelected={isSomeSelected}
  577. isSelected={isSelected}
  578. handleSelected={handleSelected}
  579. _id={_id}
  580. name={name}
  581. lastName={lastName}
  582. nightMode={nightMode}
  583. handleReply={handleReply}
  584. handleForward={handleForward}
  585. handleEdit={handleEdit}
  586. /></div>)
  587. if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  588. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  589. {isUnread&&<MessageDivider message='Unread Messages'/>}
  590. <MessageRightAudio
  591. url={url}
  592. tongue={isTongue}
  593. watched={watched}
  594. edited={edited}
  595. avatarUrl={avatarUrl}
  596. color={color}
  597. name={name}
  598. lastName={lastName}
  599. createdAt={createdAt}
  600. fullType={fullType}
  601. caption={caption}
  602. emoji={emoji}
  603. emojiCompanion={emojiCompanion}
  604. pinned={pinned}
  605. isSomeSelected={isSomeSelected}
  606. isSelected={isSelected}
  607. handleSelected={handleSelected}
  608. _id={_id}
  609. nightMode={nightMode}
  610. handleReply={handleReply}
  611. handleForward={handleForward}
  612. handleEdit={handleEdit}
  613. /></div>)
  614. if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  615. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  616. {isUnread&&<MessageDivider message='Unread Messages'/>}
  617. <MessageRightVideo
  618. url={url}
  619. tongue={isTongue}
  620. watched={watched}
  621. edited={edited}
  622. avatarUrl={avatarUrl}
  623. color={color}
  624. name={name}
  625. lastName={lastName}
  626. createdAt={createdAt}
  627. fullType={fullType}
  628. caption={caption}
  629. emoji={emoji}
  630. emojiCompanion={emojiCompanion}
  631. pinned={pinned}
  632. isSomeSelected={isSomeSelected}
  633. isSelected={isSelected}
  634. handleSelected={handleSelected}
  635. _id={_id}
  636. nightMode={nightMode}
  637. handleReply={handleReply}
  638. handleForward={handleForward}
  639. handleEdit={handleEdit}
  640. /></div>)
  641. if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
  642. {isTime&&<MessageDivider message={timeStampFilter(createdAt)}/>}
  643. {isUnread&&<MessageDivider message='Unread Messages'/>}
  644. <MessageRightFile
  645. url={url}
  646. tongue={isTongue}
  647. watched={watched}
  648. edited={edited}
  649. avatarUrl={avatarUrl}
  650. color={color}
  651. name={name}
  652. lastName={lastName}
  653. createdAt={createdAt}
  654. type={type}
  655. caption={caption}
  656. emoji={emoji}
  657. emojiCompanion={emojiCompanion}
  658. pinned={pinned}
  659. isSomeSelected={isSomeSelected}
  660. isSelected={isSelected}
  661. handleSelected={handleSelected}
  662. _id={_id}
  663. nightMode={nightMode}
  664. handleReply={handleReply}
  665. handleForward={handleForward}
  666. handleEdit={handleEdit}
  667. /></div>)
  668. }
  669. }) : <AlertInfo name='You do not have messages yet!' />}
  670. </div>
  671. </div>
  672. {!openPinned && !isSomeSelected && <SendMessage isArrow={isArrow} silentMode={silentMode} isReply={isReply} setIsReply={setIsReply}
  673. isForward={isForward} setIsForward={setIsForward}
  674. isEdit={isEdit} setIsEdit={setIsEdit}
  675. modalForward={modalForward} handleScrollToTheMessage={handleScrollToTheMessage}/>}
  676. {openPinned&&!isSomeSelected&&<UnpinBar pinnedMessagesMemo={pinnedMessagesMemo} handleUnpinAll={handleUnpinAll} />}
  677. </div>
  678. );
  679. }
  680. export default ChatBar