|
@@ -18,7 +18,7 @@ import MessageRightFile from "./Messages/MessageRightFile";
|
|
import MessageTime from "./Messages/MessageTime";
|
|
import MessageTime from "./Messages/MessageTime";
|
|
import AlertInfo from "../../../reusableComponents/AlertInfo";
|
|
import AlertInfo from "../../../reusableComponents/AlertInfo";
|
|
import { getMessagesMemo } from '../../../../redux/messages/selector'
|
|
import { getMessagesMemo } from '../../../../redux/messages/selector'
|
|
-import { getNumber } from '../../../../redux/authorization/selector'
|
|
|
|
|
|
+import { getAuthorizationState } from '../../../../redux/authorization/selector'
|
|
import { getChat } from '../../../../redux/chat/selector'
|
|
import { getChat } from '../../../../redux/chat/selector'
|
|
import { getScrollChat } from '../../../../redux/control/selector'
|
|
import { getScrollChat } from '../../../../redux/control/selector'
|
|
import { actionScrollChat } from '../../../../redux/control/action'
|
|
import { actionScrollChat } from '../../../../redux/control/action'
|
|
@@ -26,6 +26,7 @@ import { asyncGetMessagesById } from '../../../../redux/messages/operations'
|
|
import { asyncGetChatById } from "../../../../redux/chat/operations";
|
|
import { asyncGetChatById } from "../../../../redux/chat/operations";
|
|
import { seenChat } from "../../../../api-data";
|
|
import { seenChat } from "../../../../api-data";
|
|
import { TPinnedMessages } from "../../../../typescript/redux/pinnedMessages/types";
|
|
import { TPinnedMessages } from "../../../../typescript/redux/pinnedMessages/types";
|
|
|
|
+import { TMessage } from "../../../../typescript/redux/allMessages/types";
|
|
import { timeStampFilter,prodAwsS3,refreshAppTime } from "../../../../helpers";
|
|
import { timeStampFilter,prodAwsS3,refreshAppTime } from "../../../../helpers";
|
|
const debounce = require('lodash.debounce');
|
|
const debounce = require('lodash.debounce');
|
|
|
|
|
|
@@ -91,9 +92,10 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
const classes = useStyles();
|
|
const classes = useStyles();
|
|
const dispatch = useDispatch()
|
|
const dispatch = useDispatch()
|
|
const messagesMemo = useSelector(getMessagesMemo)
|
|
const messagesMemo = useSelector(getMessagesMemo)
|
|
- const userNumber = useSelector(getNumber)
|
|
|
|
|
|
+ const { number:userNumber,nightMode,silentMode} = useSelector(getAuthorizationState)
|
|
const { companionId,total,seen,mute } = useSelector(getChat)
|
|
const { companionId,total,seen,mute } = useSelector(getChat)
|
|
const scrollChat = useSelector(getScrollChat)
|
|
const scrollChat = useSelector(getScrollChat)
|
|
|
|
+ const [isReply, setIsReply] = useState<TMessage | undefined>(undefined)
|
|
const [isArrow, setIsArrow] = useState<boolean>(false)
|
|
const [isArrow, setIsArrow] = useState<boolean>(false)
|
|
const [isNew, setIsNew] = useState<{new:number,mute:boolean}>({new:0,mute:false})
|
|
const [isNew, setIsNew] = useState<{new:number,mute:boolean}>({new:0,mute:false})
|
|
let time: any
|
|
let time: any
|
|
@@ -104,6 +106,7 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
setSelectedArr(selectedArr.filter((el:string) => el !== _id))
|
|
setSelectedArr(selectedArr.filter((el:string) => el !== _id))
|
|
else setSelectedArr([...selectedArr,_id])
|
|
else setSelectedArr([...selectedArr,_id])
|
|
}
|
|
}
|
|
|
|
+
|
|
const handleScrollTo = useCallback(() => {
|
|
const handleScrollTo = useCallback(() => {
|
|
chatDivRef.current&&chatDivRef.current.scrollTo({
|
|
chatDivRef.current&&chatDivRef.current.scrollTo({
|
|
top: chatDivRef.current.scrollHeight,
|
|
top: chatDivRef.current.scrollHeight,
|
|
@@ -119,6 +122,14 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
}, [total,seen, companionId,openPinned])
|
|
}, [total,seen, companionId,openPinned])
|
|
|
|
|
|
const debouncedHandleScroll = debounce(handleScroll, 300)
|
|
const debouncedHandleScroll = debounce(handleScroll, 300)
|
|
|
|
+
|
|
|
|
+ const renderArr = useMemo(() => {
|
|
|
|
+ return !openPinned ? messagesMemo : pinnedMessagesMemo
|
|
|
|
+ }, [messagesMemo, pinnedMessagesMemo, openPinned])
|
|
|
|
+
|
|
|
|
+ const handleReply = (_id: string) => {
|
|
|
|
+ setIsReply(renderArr.find((el) => el._id ===_id))
|
|
|
|
+ }
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
if (scrollChat) {
|
|
if (scrollChat) {
|
|
@@ -139,22 +150,25 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
setIsNew({ new:total-seen,mute})
|
|
setIsNew({ new:total-seen,mute})
|
|
- }, [total,seen,mute]);
|
|
|
|
|
|
+ }, [total, seen, mute]);
|
|
|
|
+
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ if (chatDivRef.current&&openPinned) {
|
|
|
|
+ const { scrollHeight, clientHeight } = chatDivRef.current
|
|
|
|
+ if (scrollHeight === clientHeight && isArrow) setIsArrow(false)
|
|
|
|
+ }
|
|
|
|
+ }, [chatDivRef,openPinned,pinnedMessagesMemo.length, isArrow]);
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
const handleReset = () => {
|
|
const handleReset = () => {
|
|
if (chatDivRef.current&&!openPinned) {
|
|
if (chatDivRef.current&&!openPinned) {
|
|
const { scrollHeight, clientHeight } = chatDivRef.current
|
|
const { scrollHeight, clientHeight } = chatDivRef.current
|
|
- if (total !== seen && scrollHeight === clientHeight) seenChat(companionId)
|
|
|
|
|
|
+ if (total !== seen && scrollHeight === clientHeight) seenChat(companionId)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const idInterval = setInterval(handleReset, refreshAppTime);
|
|
const idInterval = setInterval(handleReset, refreshAppTime);
|
|
return () => clearInterval(idInterval);
|
|
return () => clearInterval(idInterval);
|
|
}, [total, seen, chatDivRef, companionId,openPinned]);
|
|
}, [total, seen, chatDivRef, companionId,openPinned]);
|
|
-
|
|
|
|
- const renderArr = useMemo(() => {
|
|
|
|
- return !openPinned ? messagesMemo : pinnedMessagesMemo
|
|
|
|
- },[messagesMemo,pinnedMessagesMemo,openPinned])
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
<div className={classes.container} >
|
|
<div className={classes.container} >
|
|
@@ -163,7 +177,7 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
className={messagesMemo.length > 0 ? classes.messagesScroll : classes.messagesEmpty}>
|
|
className={messagesMemo.length > 0 ? classes.messagesScroll : classes.messagesEmpty}>
|
|
<div className={classes.messagesBody}>
|
|
<div className={classes.messagesBody}>
|
|
{messagesMemo.length > 0 ? renderArr.map(({ message, name, lastName, color,pinned,
|
|
{messagesMemo.length > 0 ? renderArr.map(({ message, name, lastName, color,pinned,
|
|
- createdAt,number, type,fullType,caption,emoji,emojiCompanion,_id }) => {
|
|
|
|
|
|
+ createdAt,number, type,fullType,caption,emoji,emojiCompanion,_id}) => {
|
|
let isTime
|
|
let isTime
|
|
if (!time) {
|
|
if (!time) {
|
|
isTime = true
|
|
isTime = true
|
|
@@ -189,6 +203,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -206,7 +222,9 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
name={name}
|
|
name={name}
|
|
- lastName={lastName}
|
|
|
|
|
|
+ lastName={lastName}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -222,6 +240,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -237,6 +257,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -252,6 +274,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
} else {
|
|
} else {
|
|
if (type === 'text') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type === 'text') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
@@ -269,6 +293,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type === 'image') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -287,6 +313,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
_id={_id}
|
|
_id={_id}
|
|
name={name}
|
|
name={name}
|
|
lastName={lastName}
|
|
lastName={lastName}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type === 'audio') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -302,6 +330,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type === 'video') return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -317,6 +347,8 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
if (type) return (<div key={createdAt} id={_id} style={{borderRadius: 7}}>
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
{isTime&&<MessageTime message={timeStampFilter(createdAt)}/>}
|
|
@@ -332,13 +364,15 @@ const ChatBar = ({chatDivRef,selectedArr,setSelectedArr,isSomeSelected,setIsSome
|
|
isSelected={isSelected}
|
|
isSelected={isSelected}
|
|
handleSelected={handleSelected}
|
|
handleSelected={handleSelected}
|
|
_id={_id}
|
|
_id={_id}
|
|
|
|
+ nightMode={nightMode}
|
|
|
|
+ handleReply={handleReply}
|
|
/></div>)
|
|
/></div>)
|
|
}
|
|
}
|
|
}) : <AlertInfo name='You do not have messages yet!' />}
|
|
}) : <AlertInfo name='You do not have messages yet!' />}
|
|
</div>
|
|
</div>
|
|
- </div>
|
|
|
|
- {!openPinned ? <SendMessage isArrow={isArrow} /> :
|
|
|
|
- <UnpinBar pinnedMessagesMemo={pinnedMessagesMemo} handleUnpinAll={handleUnpinAll} />}
|
|
|
|
|
|
+ </div>
|
|
|
|
+ {!openPinned&&<SendMessage isArrow={isArrow} silentMode={silentMode} isReply={isReply} setIsReply={setIsReply} chatDivRef={chatDivRef}/>}
|
|
|
|
+ {openPinned&&!isSomeSelected &&<UnpinBar pinnedMessagesMemo={pinnedMessagesMemo} handleUnpinAll={handleUnpinAll} />}
|
|
</div>
|
|
</div>
|
|
);
|
|
);
|
|
}
|
|
}
|