import React, { useState, useEffect, useContext, useRef } from "react"; import "emoji-mart/css/emoji-mart.css"; import { useParams } from "react-router-dom"; import { Picker } from "emoji-mart"; import MicRecorder from "mic-recorder-to-mp3"; import clsx from "clsx"; import { makeStyles } from "@material-ui/core/styles"; import Paper from "@material-ui/core/Paper"; import InputBase from "@material-ui/core/InputBase"; import CircularProgress from "@material-ui/core/CircularProgress"; import { green } from "@material-ui/core/colors"; import AttachFileIcon from "@material-ui/icons/AttachFile"; import IconButton from "@material-ui/core/IconButton"; import MoodIcon from "@material-ui/icons/Mood"; import SendIcon from "@material-ui/icons/Send"; import CancelIcon from "@material-ui/icons/Cancel"; import ClearIcon from "@material-ui/icons/Clear"; import MicIcon from "@material-ui/icons/Mic"; import CheckCircleOutlineIcon from "@material-ui/icons/CheckCircleOutline"; import HighlightOffIcon from "@material-ui/icons/HighlightOff"; import { FormControlLabel, Switch } from "@material-ui/core"; import { i18n } from "../../translate/i18n"; import api from "../../services/api"; import RecordingTimer from "./RecordingTimer"; import { ReplyMessageContext } from "../../context/ReplyingMessage/ReplyingMessageContext"; import { AuthContext } from "../../context/Auth/AuthContext"; import { useLocalStorage } from "../../hooks/useLocalStorage"; import toastError from "../../errors/toastError"; const Mp3Recorder = new MicRecorder({ bitRate: 128 }); const useStyles = makeStyles(theme => ({ mainWrapper: { backgroundColor: theme.palette.bordabox, //DARK MODE PLW DESIGN// display: "flex", flexDirection: "column", alignItems: "center", borderTop: "1px solid rgba(0, 0, 0, 0.12)", }, newMessageBox: { background: "#eee", width: "100%", display: "flex", padding: "7px", alignItems: "center", }, messageInputWrapper: { padding: 6, marginRight: 7, background: "#fff", display: "flex", borderRadius: 20, flex: 1, }, messageInput: { paddingLeft: 10, flex: 1, border: "none", }, sendMessageIcons: { color: "grey", }, uploadInput: { display: "none", }, viewMediaInputWrapper: { display: "flex", padding: "10px 13px", position: "relative", justifyContent: "space-between", alignItems: "center", backgroundColor: "#eee", borderTop: "1px solid rgba(0, 0, 0, 0.12)", }, emojiBox: { position: "absolute", bottom: 63, width: 40, borderTop: "1px solid #e8e8e8", }, circleLoading: { color: green[500], opacity: "70%", position: "absolute", top: "20%", left: "50%", marginLeft: -12, }, audioLoading: { color: green[500], opacity: "70%", }, recorderWrapper: { display: "flex", alignItems: "center", alignContent: "middle", }, cancelAudioIcon: { color: "red", }, sendAudioIcon: { color: "green", }, replyginMsgWrapper: { display: "flex", width: "100%", alignItems: "center", justifyContent: "center", paddingTop: 8, paddingLeft: 73, paddingRight: 7, }, replyginMsgContainer: { flex: 1, marginRight: 5, overflowY: "hidden", backgroundColor: "rgba(0, 0, 0, 0.05)", borderRadius: "7.5px", display: "flex", position: "relative", }, replyginMsgBody: { padding: 10, height: "auto", display: "block", whiteSpace: "pre-wrap", overflow: "hidden", }, replyginContactMsgSideColor: { flex: "none", width: "4px", backgroundColor: "#35cd96", }, replyginSelfMsgSideColor: { flex: "none", width: "4px", backgroundColor: "#6bcbef", }, messageContactName: { display: "flex", color: "#6bcbef", fontWeight: 500, }, })); const MessageInput = ({ ticketStatus }) => { const classes = useStyles(); const { ticketId } = useParams(); const [medias, setMedias] = useState([]); const [inputMessage, setInputMessage] = useState(""); const [showEmoji, setShowEmoji] = useState(false); const [loading, setLoading] = useState(false); const [recording, setRecording] = useState(false); const inputRef = useRef(); const { setReplyingMessage, replyingMessage } = useContext( ReplyMessageContext ); const { user } = useContext(AuthContext); const [signMessage, setSignMessage] = useLocalStorage("signOption", true); useEffect(() => { inputRef.current.focus(); }, [replyingMessage]); useEffect(() => { inputRef.current.focus(); return () => { setInputMessage(""); setShowEmoji(false); setMedias([]); setReplyingMessage(null); }; }, [ticketId, setReplyingMessage]); const handleChangeInput = e => { setInputMessage(e.target.value); }; const handleAddEmoji = e => { let emoji = e.native; setInputMessage(prevState => prevState + emoji); }; const handleChangeMedias = e => { if (!e.target.files) { return; } const selectedMedias = Array.from(e.target.files); setMedias(selectedMedias); }; const handleInputPaste = e => { if (e.clipboardData.files[0]) { setMedias([e.clipboardData.files[0]]); } }; const handleUploadMedia = async e => { setLoading(true); e.preventDefault(); const formData = new FormData(); formData.append("fromMe", true); medias.forEach(media => { formData.append("medias", media); formData.append("body", media.name); }); try { await api.post(`/messages/${ticketId}`, formData); } catch (err) { toastError(err); } setLoading(false); setMedias([]); }; const handleSendMessage = async () => { if (inputMessage.trim() === "") return; setLoading(true); const message = { read: 1, fromMe: true, mediaUrl: "", body: signMessage ? `*${user?.name}:*\n${inputMessage.trim()}` : inputMessage.trim(), quotedMsg: replyingMessage, }; try { await api.post(`/messages/${ticketId}`, message); } catch (err) { toastError(err); } setInputMessage(""); setShowEmoji(false); setLoading(false); setReplyingMessage(null); }; const handleStartRecording = async () => { setLoading(true); try { await navigator.mediaDevices.getUserMedia({ audio: true }); await Mp3Recorder.start(); setRecording(true); setLoading(false); } catch (err) { toastError(err); setLoading(false); } }; const handleUploadAudio = async () => { setLoading(true); try { const [, blob] = await Mp3Recorder.stop().getMp3(); if (blob.size < 10000) { setLoading(false); setRecording(false); return; } const formData = new FormData(); const filename = `${new Date().getTime()}.mp3`; formData.append("medias", blob, filename); formData.append("body", filename); formData.append("fromMe", true); await api.post(`/messages/${ticketId}`, formData); } catch (err) { toastError(err); } setRecording(false); setLoading(false); }; const handleCancelAudio = async () => { try { await Mp3Recorder.stop().getMp3(); setRecording(false); } catch (err) { toastError(err); } }; const renderReplyingMessage = message => { return (