2 changed files with 85 additions and 6 deletions
@ -0,0 +1,83 @@
@@ -0,0 +1,83 @@
|
||||
// Custom component for AntDesign Button that makes an api call, then displays a confirmation icon upon
|
||||
import React, { useState, useEffect } from "react"; |
||||
import { Button, Tooltip } from "antd"; |
||||
import { EyeOutlined, EyeInvisibleOutlined, CheckCircleFilled, ExclamationCircleFilled } from "@ant-design/icons"; |
||||
import { fetchData, UPDATE_CHAT_MESSGAE_VIZ } from "../../utils/apis"; |
||||
import { MessageType } from '../../types/chat'; |
||||
import { OUTCOME_TIMEOUT } from "../chat"; |
||||
import { isEmptyObject } from "../../utils/format"; |
||||
|
||||
interface MessageToggleProps { |
||||
isVisible: boolean; |
||||
message: MessageType; |
||||
setMessage: (message: MessageType) => void, |
||||
}; |
||||
|
||||
|
||||
export default function MessageVisiblityToggle({ isVisible, message, setMessage }: MessageToggleProps) { |
||||
if (!message || isEmptyObject(message)) { |
||||
return null; |
||||
} |
||||
|
||||
let outcomeTimeout = null; |
||||
const [outcome, setOutcome] = useState(0); |
||||
|
||||
const { id: messageId } = message || {}; |
||||
|
||||
const resetOutcome = () => { |
||||
outcomeTimeout = setTimeout(() => { setOutcome(0)}, OUTCOME_TIMEOUT); |
||||
}; |
||||
|
||||
useEffect(() => { |
||||
return () => { |
||||
clearTimeout(outcomeTimeout); |
||||
}; |
||||
}); |
||||
|
||||
|
||||
const updateChatMessage = async () => { |
||||
clearTimeout(outcomeTimeout); |
||||
setOutcome(0); |
||||
const result = await fetchData(UPDATE_CHAT_MESSGAE_VIZ, { |
||||
auth: true, |
||||
method: 'POST', |
||||
data: { |
||||
visible: !isVisible, |
||||
idArray: [messageId], |
||||
}, |
||||
}); |
||||
|
||||
if (result.success && result.message === "changed") { |
||||
setMessage({ ...message, visible: !isVisible }); |
||||
setOutcome(1); |
||||
} else { |
||||
setMessage({ ...message, visible: isVisible }); |
||||
setOutcome(-1); |
||||
} |
||||
resetOutcome(); |
||||
} |
||||
|
||||
|
||||
let outcomeIcon = <CheckCircleFilled style={{ color: 'transparent' }} />; |
||||
if (outcome) { |
||||
outcomeIcon = outcome > 0 ? |
||||
<CheckCircleFilled style={{ color: 'var(--ant-success)' }} /> : |
||||
<ExclamationCircleFilled style={{ color: 'var(--ant-warning)' }} />; |
||||
} |
||||
|
||||
const toolTipMessage = `Click to ${isVisible ? 'hide' : 'show'} this message`; |
||||
return ( |
||||
<div className={`toggle-switch ${isVisible ? '' : 'hidden'}`}> |
||||
<span className="outcome-icon">{outcomeIcon}</span> |
||||
<Tooltip title={toolTipMessage} placement="topRight"> |
||||
<Button |
||||
shape="circle" |
||||
size="small" |
||||
type="text" |
||||
icon={ isVisible ? <EyeOutlined /> : <EyeInvisibleOutlined /> } |
||||
onClick={updateChatMessage} |
||||
/> |
||||
</Tooltip> |
||||
</div> |
||||
); |
||||
} |
Loading…
Reference in new issue