index.tsx 25 KB

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