@material-ui/icons#Block JavaScript Examples
The following examples show how to use
@material-ui/icons#Block.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: QuizzesSection.js From Quizzie with MIT License | 4 votes |
function QuizzesSection(props) {
const [loading, setLoading] = useState(true);
const [userType, setUserType] = useState(props.type);
const [profile, setProfile] = useState(props.profile);
const [quizzes, setQuizzes] = useState([]);
const [quizzesEnrolled, setQuizzesEnrolled] = useState([]);
const [joinModal, setJoinModal] = useState(false);
const [quizCode, setQuizCode] = useState("");
const [quizCodeError, setQuizCodeError] = useState(false);
const [enrollModal, setEnrollModal] = useState(false);
const [enrollQuizName, setEnrollQuiz] = useState("");
const [enrollQuizId, setEnrollQuizId] = useState("");
const [enrollSnack, setEnrollSnack] = useState(false);
const [snackbar, setSnackBar] = useState(false);
const [errorSnack, setErrorSnack] = useState(false);
const [infoModal, setInfoModal] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [currQuiz, setCurrQuiz] = useState({});
const [timeRemain, setTimeRemain] = useState("");
const [startModal, setStartModal] = useState(false);
const [quizStarted, setQuizStarted] = useState(false);
const [redirectId, setRedirectId] = useState("");
const [quizDetails, setQuizDetails] = useState({});
const [earlyError, setEarlyError] = useState(false);
const [lateError, setLateError] = useState(false);
const [givenSnack, setGivenSnack] = useState(false);
const [privateWrongCode, setPrivateWrongCode] = useState(false);
const [alreadyEnrolled, setAlreadyEnrolled] = useState(false);
const setRefresh = props.refresh;
const { executeRecaptcha } = useGoogleReCaptcha();
const getCols = () => {
if (isWidthUp("md", props.width)) {
return 3;
}
return 2;
};
const getInfoWidth = () => {
if (isWidthUp("sm", props.width)) {
return "45%";
}
return "80%";
};
const onCloseHandle = () => {
setJoinModal(false);
setInfoModal(false);
setStartModal(false);
setQuizCode("");
setQuizCodeError(false);
setEnrollModal(false);
setEnrollQuiz("");
setEnrollQuizId("");
setTimeRemain("");
setCurrQuiz({});
};
const onJoinClick = () => {
setJoinModal(true);
};
const handleJoinChange = (event) => {
setQuizCode(event.target.value);
};
const handleEnrollButton = (quiz) => {
setEnrollQuiz(quiz.quizName);
setEnrollQuizId(quiz._id);
setEnrollModal(true);
};
const handleInfoButton = (quiz) => {
setInfoModal(true);
getQuizInfo(quiz.quizId._id);
};
const handleStartButton = (quiz) => {
setEnrollQuiz(quiz.quizId.quizName);
setEnrollQuizId(quiz.quizId._id);
setStartModal(true);
};
const getQuizInfo = async (id) => {
setInfoLoading(true);
let token = localStorage.getItem("authToken");
let url = `https://quizzie-api.herokuapp.com/quiz/${id}`;
try {
await axios
.get(url, {
headers: {
"auth-token": token,
},
})
.then((res) => {
setCurrQuiz(res.data.result);
setInfoLoading(false);
});
} catch (error) {
console.log(error);
onCloseHandle();
setInfoLoading(false);
}
};
const handleJoinSubmit = async () => {
if (quizCode.trim().length === 0) {
setQuizCodeError(true);
return;
}
setQuizCodeError(false);
setEnrollSnack(true);
let url = "https://quizzie-api.herokuapp.com/quiz/enrollPrivate";
let token = localStorage.getItem("authToken");
let captcha = await executeRecaptcha("join_private");
let data = {
quizCode: quizCode,
captcha: captcha,
};
try {
await axios
.patch(url, data, {
headers: {
"auth-token": token,
},
})
.then((res) => {
setRefresh(true);
onCloseHandle();
setSnackBar(true);
});
} catch (error) {
setEnrollSnack(false);
if (error.response.status === 404) {
setPrivateWrongCode(true);
} else if (error.response.status === 409) {
setAlreadyEnrolled(true);
} else {
setErrorSnack(true);
}
}
};
const handleEnroll = async () => {
setEnrollSnack(true);
let token = localStorage.getItem("authToken");
let url = "https://quizzie-api.herokuapp.com/quiz/enroll";
let captcha = await executeRecaptcha("quiz_enroll");
let data = {
quizId: enrollQuizId,
captcha: captcha,
};
try {
await axios
.patch(url, data, {
headers: {
"auth-token": token,
},
})
.then((res) => {
setRefresh(true);
onCloseHandle();
setSnackBar(true);
});
} catch (error) {
console.log(error);
setErrorSnack(true);
}
};
const handleUnenroll = async () => {
setEnrollSnack(true);
let token = localStorage.getItem("authToken");
let url = "https://quizzie-api.herokuapp.com/quiz/unenroll";
let captcha = await executeRecaptcha("quiz_unenroll");
let data = {
quizId: currQuiz._id,
captcha: captcha,
};
try {
await axios
.patch(url, data, {
headers: {
"auth-token": token,
},
})
.then((res) => {
setRefresh(true);
});
} catch (error) {
console.log(error);
setErrorSnack(true);
}
};
const handleQuizStart = async () => {
setEnrollSnack(true);
let token = localStorage.getItem("authToken");
let url = `https://quizzie-api.herokuapp.com/quiz/start`;
let captcha = await executeRecaptcha("quiz_start");
let data = {
quizId: enrollQuizId,
captcha: captcha,
};
try {
await axios
.patch(url, data, {
headers: {
"auth-token": token,
},
})
.then((res) => {
setRedirectId(data.quizId);
setQuizDetails(res.data);
setQuizStarted(true);
});
} catch (error) {
setEnrollSnack(false);
if (error.response.status === 401) {
setEarlyError(true);
} else if (error.response.status === 402) {
setLateError(true);
} else if (error.response.status === 405) {
setGivenSnack(true);
}
}
};
const setupEnrolled = () => {
let quizzes = [];
profile.quizzesEnrolled.map((quiz) => {
if (
!profile.quizzesGiven.find((o) => o.quizId === quiz.quizId._id)
) {
quizzes.push(quiz);
}
});
setQuizzesEnrolled(quizzes);
};
const getQuizzes = async () => {
setLoading(true);
let token = localStorage.getItem("authToken");
let url = "https://quizzie-api.herokuapp.com/quiz/all";
let quizList = [];
try {
await axios
.get(url, {
headers: {
"auth-token": token,
},
})
.then((res) => {
res.data.result.map((quiz) => {
if (quiz.quizType === "public") {
if (userType === "user") {
if (
!profile.quizzesEnrolled.find(
(o) => o.quizId._id === quiz._id
)
)
quizList.push(quiz);
} else quizList.push(quiz);
}
});
quizList.sort(function (a, b) {
return a.scheduledFor - b.scheduledFor;
});
setQuizzes(quizList);
setLoading(false);
});
} catch (error) {
console.log(error);
}
};
useEffect(() => {
if (infoModal) {
if (currQuiz.scheduledFor <= Date.now()) {
setTimeRemain("Already Started!");
} else {
setTimeout(() => {
setTimeRemain(
countdown(
new Date(),
new Date(Number(currQuiz.scheduledFor))
).toString()
);
}, 1000);
}
}
});
useEffect(() => {
if (userType === "user") setupEnrolled();
getQuizzes();
}, []);
if (loading) {
return <QuizLoading />;
} else if (quizStarted) {
return (
<Redirect
to={{
pathname: `/quiz`,
state: {
questions: quizDetails.data,
duration: quizDetails.duration,
start: quizDetails.scheduledFor,
id: enrollQuizId,
timeStarted: Date.now(),
restartStatus: quizDetails.quizRestart,
},
}}
/>
);
} else {
return (
<div className="quizzes-section">
<div className="quiz-btn-section">
{userType === "user" ? (
<Button className="join-quiz-btn" onClick={onJoinClick}>
<Check />
Join a Quiz
</Button>
) : null}
{userType === "admin" ? (
<Button
className="create-quiz-btn"
component={Link}
to="/createQuiz"
>
<Add />
Create a quiz
</Button>
) : null}
</div>
{userType === "user" ? (
<div className="enrolled-list">
<Typography variant="h5" className="up-quizzes">
Enrolled Quizzes
</Typography>
{quizzesEnrolled.length === 0 ? (
<p style={{ textAlign: "center" }}>
Sorry! No quizzes available at the moment!
</p>
) : (
<div className="quiz-list root1">
<GridList
cols={getCols()}
className="grid-list btn-set"
>
{quizzesEnrolled.map((quiz) => (
<GridListTile
key={quiz._id}
className="quiz-tile"
>
<img src="../CC LOGO-01.svg" />
<GridListTileBar
title={quiz.quizId.quizName}
actionIcon={
<div className="inline">
<Tooltip title="Start Quiz">
<IconButton
aria-label={`start ${quiz.quizId.quizName}`}
onClick={() =>
handleStartButton(
quiz
)
}
>
<PlayCircleFilled className="enroll-icon" />
</IconButton>
</Tooltip>
<Tooltip title="Info">
<IconButton
aria-label={`info ${quiz.quizId.quizName}`}
onClick={() =>
handleInfoButton(
quiz
)
}
>
<Info className="enroll-icon" />
</IconButton>
</Tooltip>
</div>
}
/>
</GridListTile>
))}
</GridList>
</div>
)}
</div>
) : null}
<Typography variant="h5" className="up-quizzes">
Upcoming Quizzes
</Typography>
{quizzes.length === 0 ? (
<p style={{ textAlign: "center" }}>
Sorry! No quizzes available at the moment!
</p>
) : (
<div className="quiz-list root1">
<GridList cols={getCols()} className="grid-list">
{quizzes.map((quiz) => (
<GridListTile
key={quiz._id}
className="quiz-tile"
>
<img src="../CC LOGO-01.svg" />
<GridListTileBar
title={quiz.quizName}
subtitle={`By: ${quiz.adminId.name}`}
actionIcon={
userType === "user" ? (
<Tooltip title="Enroll">
<IconButton
aria-label={`enroll ${quiz.quizName}`}
onClick={() =>
handleEnrollButton(
quiz
)
}
>
<Check className="enroll-icon" />
</IconButton>
</Tooltip>
) : null
}
/>
</GridListTile>
))}
</GridList>
</div>
)}
<Dialog
open={joinModal}
onClose={onCloseHandle}
aria-labelledby="join-quiz-modal"
PaperProps={{
style: {
backgroundColor: "white",
color: "#333",
minWidth: "30%",
},
}}
style={{ width: "100%" }}
>
<div className="modal-info">
{userType === "admin" ? (
<Typography
variant="h6"
className="type-head join-sub"
>
Organizers cannot enroll in quizzes.
</Typography>
) : (
<div
style={{
display: "flex",
flexDirection: "column",
}}
>
<Typography variant="h5" className="type-head">
JOIN A PRIVATE QUIZ
</Typography>
<Typography
variant="h6"
className="type-head join-sub"
>
Enter the code of the quiz you want to join
</Typography>
<TextInput
error={quizCodeError}
helperText={
quizCodeError ? "Required" : null
}
label="Quiz Code"
variant="outlined"
value={quizCode}
onChange={handleJoinChange}
className="quiz-code-field"
/>
<Button
className="join-quiz-btn join-modal-btn"
onClick={handleJoinSubmit}
>
Join!
</Button>
</div>
)}
</div>
</Dialog>
<Dialog
open={enrollModal}
onClose={onCloseHandle}
aria-labelledby="enroll-quiz-modal"
PaperProps={{
style: {
backgroundColor: "white",
color: "#333",
minWidth: "30%",
},
}}
style={{ width: "100%" }}
>
<div className="modal-info">
{userType === "admin" ? (
<Typography
variant="h6"
className="type-head join-sub"
>
Organizers cannot enroll in quizzes.
</Typography>
) : (
<div>
<Typography
variant="h6"
className="type-head join-sub"
>{`Are you sure you want to join ${enrollQuizName}?`}</Typography>
<div className="btn-div m-top">
{/* classes in Navbar.css */}
<Button
className="logout-btn m-right"
onClick={handleEnroll}
>
Yes
</Button>
<Button
className="cancel-btn m-left"
onClick={onCloseHandle}
>
No
</Button>
</div>
</div>
)}
</div>
</Dialog>
<Dialog
open={startModal}
onClose={onCloseHandle}
aria-labelledby="start-quiz-modal"
PaperProps={{
style: {
backgroundColor: "white",
color: "#333",
minWidth: "30%",
},
}}
style={{ width: "100%" }}
>
<div className="modal-info">
<div>
<Typography
variant="h6"
className="type-head join-sub"
>{`Are you sure you want to start ${enrollQuizName}?`}</Typography>
<div className="btn-div m-top2 start-div">
{/* classes in Navbar.css */}
<Button
className="logout-btn m-right"
onClick={handleQuizStart}
>
Yes
</Button>
<Button
className="cancel-btn m-left"
onClick={onCloseHandle}
>
No
</Button>
</div>
</div>
</div>
</Dialog>
<Dialog
open={infoModal}
onClose={onCloseHandle}
aria-labelledby="info-quiz-modal"
PaperProps={{
style: {
backgroundColor: "white",
color: "#333",
minWidth: getInfoWidth(),
maxHeight: "45%",
},
}}
style={{ width: "100%" }}
>
<DialogTitle
style={{ textAlign: "center", fontWeight: "bold" }}
>
Quiz Info
</DialogTitle>
{/* From the profile section */}
{infoLoading ? (
<Loading />
) : (
<div
className="modal-info no-p-top"
style={{ textAlign: "center" }}
>
<Typography
variant="h6"
className="profile-param info-param"
>
Name:{" "}
<span className="profile-data">
{currQuiz.quizName}
</span>
</Typography>
<Typography
variant="h6"
className="profile-param info-param"
>
Date:{" "}
<span className="profile-data">
{new Date(
Number(currQuiz.scheduledFor)
).toDateString()}
</span>
</Typography>
<Typography
variant="h6"
className="profile-param info-param"
>
Time:{" "}
<span className="profile-data">
{new Date(
Number(currQuiz.scheduledFor)
).toLocaleTimeString()}
</span>
</Typography>
<div className="time-sec">
<Typography
variant="h6"
className="profile-param info-param"
>
<span className="profile-data time-rem">
{timeRemain}
</span>
</Typography>
</div>
<Button
className="unenroll-btn"
onClick={handleUnenroll}
>
<Block style={{ color: "white" }} />
Unenroll
</Button>
</div>
)}
</Dialog>
<Snackbar
open={snackbar}
autoHideDuration={2000}
onClose={() => setSnackBar(false)}
>
<Alert
variant="filled"
severity="success"
onClose={() => setSnackBar(false)}
>
Successfully Enrolled!
</Alert>
</Snackbar>
<Snackbar
open={errorSnack}
autoHideDuration={2000}
onClose={() => setErrorSnack(false)}
>
<Alert
variant="filled"
severity="error"
onClose={() => setErrorSnack(false)}
>
There was some error. Please try again!
</Alert>
</Snackbar>
<Snackbar
open={enrollSnack}
autoHideDuration={5000}
onClose={() => setEnrollSnack(false)}
>
<Alert
variant="filled"
severity="info"
onClose={() => setErrorSnack(false)}
>
Processing... Please Wait!
</Alert>
</Snackbar>
<Snackbar
open={earlyError}
autoHideDuration={5000}
onClose={() => setEarlyError(false)}
>
<Alert
variant="filled"
severity="error"
onClose={() => setEarlyError(false)}
>
The quiz has not yet started!
</Alert>
</Snackbar>
<Snackbar
open={lateError}
autoHideDuration={5000}
onClose={() => setLateError(false)}
>
<Alert
variant="filled"
severity="error"
onClose={() => setLateError(false)}
>
This quiz has ended!
</Alert>
</Snackbar>
<Snackbar
open={givenSnack}
autoHideDuration={5000}
onClose={() => setGivenSnack(false)}
>
<Alert
variant="filled"
severity="error"
onClose={() => setGivenSnack(false)}
>
Already given this quiz!
</Alert>
</Snackbar>
<Snackbar
open={privateWrongCode}
autoHideDuration={5000}
onClose={() => setPrivateWrongCode(false)}
>
<Alert
variant="filled"
severity="error"
onClose={() => setPrivateWrongCode(false)}
>
This quiz code does not exists!
</Alert>
</Snackbar>
<Snackbar
open={alreadyEnrolled}
autoHideDuration={5000}
onClose={() => setAlreadyEnrolled(false)}
>
<Alert
variant="filled"
severity="error"
onClose={() => setAlreadyEnrolled(false)}
>
Already enrolled in this quiz!
</Alert>
</Snackbar>
</div>
);
}
}
Example #2
Source File: index.js From whaticket with MIT License | 4 votes |
MessagesList = ({ ticketId, isGroup }) => {
const classes = useStyles();
const [messagesList, dispatch] = useReducer(reducer, []);
const [pageNumber, setPageNumber] = useState(1);
const [hasMore, setHasMore] = useState(false);
const [loading, setLoading] = useState(false);
const lastMessageRef = useRef();
const [selectedMessage, setSelectedMessage] = useState({});
const [anchorEl, setAnchorEl] = useState(null);
const messageOptionsMenuOpen = Boolean(anchorEl);
const currentTicketId = useRef(ticketId);
useEffect(() => {
dispatch({ type: "RESET" });
setPageNumber(1);
currentTicketId.current = ticketId;
}, [ticketId]);
useEffect(() => {
setLoading(true);
const delayDebounceFn = setTimeout(() => {
const fetchMessages = async () => {
try {
const { data } = await api.get("/messages/" + ticketId, {
params: { pageNumber },
});
if (currentTicketId.current === ticketId) {
dispatch({ type: "LOAD_MESSAGES", payload: data.messages });
setHasMore(data.hasMore);
setLoading(false);
}
if (pageNumber === 1 && data.messages.length > 1) {
scrollToBottom();
}
} catch (err) {
setLoading(false);
toastError(err);
}
};
fetchMessages();
}, 500);
return () => {
clearTimeout(delayDebounceFn);
};
}, [pageNumber, ticketId]);
useEffect(() => {
const socket = openSocket();
socket.on("connect", () => socket.emit("joinChatBox", ticketId));
socket.on("appMessage", (data) => {
if (data.action === "create") {
dispatch({ type: "ADD_MESSAGE", payload: data.message });
scrollToBottom();
}
if (data.action === "update") {
dispatch({ type: "UPDATE_MESSAGE", payload: data.message });
}
});
return () => {
socket.disconnect();
};
}, [ticketId]);
const loadMore = () => {
setPageNumber((prevPageNumber) => prevPageNumber + 1);
};
const scrollToBottom = () => {
if (lastMessageRef.current) {
lastMessageRef.current.scrollIntoView({});
}
};
const handleScroll = (e) => {
if (!hasMore) return;
const { scrollTop } = e.currentTarget;
if (scrollTop === 0) {
document.getElementById("messagesList").scrollTop = 1;
}
if (loading) {
return;
}
if (scrollTop < 50) {
loadMore();
}
};
const handleOpenMessageOptionsMenu = (e, message) => {
setAnchorEl(e.currentTarget);
setSelectedMessage(message);
};
const handleCloseMessageOptionsMenu = (e) => {
setAnchorEl(null);
};
const checkMessageMedia = (message) => {
if(message.mediaType === "location" && message.body.split('|').length >= 2) {
let locationParts = message.body.split('|')
let imageLocation = locationParts[0]
let linkLocation = locationParts[1]
let descriptionLocation = null
if(locationParts.length > 2)
descriptionLocation = message.body.split('|')[2]
return <LocationPreview image={imageLocation} link={linkLocation} description={descriptionLocation} />
}
else if (message.mediaType === "vcard") {
//console.log("vcard")
//console.log(message)
let array = message.body.split("\n");
let obj = [];
let contact = "";
for (let index = 0; index < array.length; index++) {
const v = array[index];
let values = v.split(":");
for (let ind = 0; ind < values.length; ind++) {
if (values[ind].indexOf("+") !== -1) {
obj.push({ number: values[ind] });
}
if (values[ind].indexOf("FN") !== -1) {
contact = values[ind + 1];
}
}
}
return <VcardPreview contact={contact} numbers={obj[0].number} />
}
/*else if (message.mediaType === "multi_vcard") {
console.log("multi_vcard")
console.log(message)
if(message.body !== null && message.body !== "") {
let newBody = JSON.parse(message.body)
return (
<>
{
newBody.map(v => (
<VcardPreview contact={v.name} numbers={v.number} />
))
}
</>
)
} else return (<></>)
}*/
else if (message.mediaType === "image") {
return <ModalImageCors imageUrl={message.mediaUrl} />;
} else if (message.mediaType === "audio") {
return (
<audio controls>
<source src={message.mediaUrl} type="audio/ogg"></source>
</audio>
);
} else if (message.mediaType === "video") {
return (
<video
className={classes.messageMedia}
src={message.mediaUrl}
controls
/>
);
} else {
return (
<>
<div className={classes.downloadMedia}>
<Button
startIcon={<GetApp />}
color="primary"
variant="outlined"
target="_blank"
href={message.mediaUrl}
>
Download
</Button>
</div>
<Divider />
</>
);
}
};
const renderMessageAck = (message) => {
if (message.ack === 0) {
return <AccessTime fontSize="small" className={classes.ackIcons} />;
}
if (message.ack === 1) {
return <Done fontSize="small" className={classes.ackIcons} />;
}
if (message.ack === 2) {
return <DoneAll fontSize="small" className={classes.ackIcons} />;
}
if (message.ack === 3 || message.ack === 4) {
return <DoneAll fontSize="small" className={classes.ackDoneAllIcon} />;
}
};
const renderDailyTimestamps = (message, index) => {
if (index === 0) {
return (
<span
className={classes.dailyTimestamp}
key={`timestamp-${message.id}`}
>
<div className={classes.dailyTimestampText}>
{format(parseISO(messagesList[index].createdAt), "dd/MM/yyyy")}
</div>
</span>
);
}
if (index < messagesList.length - 1) {
let messageDay = parseISO(messagesList[index].createdAt);
let previousMessageDay = parseISO(messagesList[index - 1].createdAt);
if (!isSameDay(messageDay, previousMessageDay)) {
return (
<span
className={classes.dailyTimestamp}
key={`timestamp-${message.id}`}
>
<div className={classes.dailyTimestampText}>
{format(parseISO(messagesList[index].createdAt), "dd/MM/yyyy")}
</div>
</span>
);
}
}
if (index === messagesList.length - 1) {
return (
<div
key={`ref-${message.createdAt}`}
ref={lastMessageRef}
style={{ float: "left", clear: "both" }}
/>
);
}
};
const renderMessageDivider = (message, index) => {
if (index < messagesList.length && index > 0) {
let messageUser = messagesList[index].fromMe;
let previousMessageUser = messagesList[index - 1].fromMe;
if (messageUser !== previousMessageUser) {
return (
<span style={{ marginTop: 16 }} key={`divider-${message.id}`}></span>
);
}
}
};
const renderQuotedMessage = (message) => {
return (
<div
className={clsx(classes.quotedContainerLeft, {
[classes.quotedContainerRight]: message.fromMe,
})}
>
<span
className={clsx(classes.quotedSideColorLeft, {
[classes.quotedSideColorRight]: message.quotedMsg?.fromMe,
})}
></span>
<div className={classes.quotedMsg}>
{!message.quotedMsg?.fromMe && (
<span className={classes.messageContactName}>
{message.quotedMsg?.contact?.name}
</span>
)}
{message.quotedMsg?.body}
</div>
</div>
);
};
const renderMessages = () => {
if (messagesList.length > 0) {
const viewMessagesList = messagesList.map((message, index) => {
if (!message.fromMe) {
return (
<React.Fragment key={message.id}>
{renderDailyTimestamps(message, index)}
{renderMessageDivider(message, index)}
<div className={classes.messageLeft}>
<IconButton
variant="contained"
size="small"
id="messageActionsButton"
disabled={message.isDeleted}
className={classes.messageActionsButton}
onClick={(e) => handleOpenMessageOptionsMenu(e, message)}
>
<ExpandMore />
</IconButton>
{isGroup && (
<span className={classes.messageContactName}>
{message.contact?.name}
</span>
)}
{(message.mediaUrl || message.mediaType === "location" || message.mediaType === "vcard"
//|| message.mediaType === "multi_vcard"
) && checkMessageMedia(message)}
<div className={classes.textContentItem}>
{message.quotedMsg && renderQuotedMessage(message)}
<MarkdownWrapper>{message.body}</MarkdownWrapper>
<span className={classes.timestamp}>
{format(parseISO(message.createdAt), "HH:mm")}
</span>
</div>
</div>
</React.Fragment>
);
} else {
return (
<React.Fragment key={message.id}>
{renderDailyTimestamps(message, index)}
{renderMessageDivider(message, index)}
<div className={classes.messageRight}>
<IconButton
variant="contained"
size="small"
id="messageActionsButton"
disabled={message.isDeleted}
className={classes.messageActionsButton}
onClick={(e) => handleOpenMessageOptionsMenu(e, message)}
>
<ExpandMore />
</IconButton>
{(message.mediaUrl || message.mediaType === "location" || message.mediaType === "vcard"
//|| message.mediaType === "multi_vcard"
) && checkMessageMedia(message)}
<div
className={clsx(classes.textContentItem, {
[classes.textContentItemDeleted]: message.isDeleted,
})}
>
{message.isDeleted && (
<Block
color="disabled"
fontSize="small"
className={classes.deletedIcon}
/>
)}
{message.quotedMsg && renderQuotedMessage(message)}
<MarkdownWrapper>{message.body}</MarkdownWrapper>
<span className={classes.timestamp}>
{format(parseISO(message.createdAt), "HH:mm")}
{renderMessageAck(message)}
</span>
</div>
</div>
</React.Fragment>
);
}
});
return viewMessagesList;
} else {
return <div>Say hello to your new contact!</div>;
}
};
return (
<div className={classes.messagesListWrapper}>
<MessageOptionsMenu
message={selectedMessage}
anchorEl={anchorEl}
menuOpen={messageOptionsMenuOpen}
handleClose={handleCloseMessageOptionsMenu}
/>
<div
id="messagesList"
className={classes.messagesList}
onScroll={handleScroll}
>
{messagesList.length > 0 ? renderMessages() : []}
</div>
{loading && (
<div>
<CircularProgress className={classes.circleLoading} />
</div>
)}
</div>
);
}