import { useCallback, useRef, useState } from "react"; import { FormControl, IconButton, InputAdornment, InputBase, useMediaQuery, useTheme, } from "@mui/material"; import SendIcon from "@icons/SendIcon"; import AttachFileIcon from "@mui/icons-material/AttachFile"; import { checkAcceptableMediaType } from "@utils/checkAcceptableMediaType"; import { enqueueSnackbar } from "notistack"; interface ChatInputProps { sendMessage: (message: string) => Promise; sendFile: (file: File | undefined) => Promise; isMessageSending: boolean; } const ChatInput = ({ sendMessage, sendFile, isMessageSending }: ChatInputProps) => { const theme = useTheme(); const upMd = useMediaQuery(theme.breakpoints.up("md")); const [messageField, setMessageField] = useState(""); const [disableFileButton, setDisableFileButton] = useState(false); const fileInputRef = useRef(null); const handleSendMessage = useCallback(async () => { const successful = await sendMessage(messageField); if (successful) { setMessageField(""); } }, [sendMessage, messageField]); const handleSendFile = useCallback(async (file: File) => { const check = checkAcceptableMediaType(file); if (check.length > 0) { enqueueSnackbar(check); return; } setDisableFileButton(true); await sendFile(file); setDisableFileButton(false); }, [sendFile]); const handleFileInputChange = useCallback((e: React.ChangeEvent) => { if (e.target.files?.[0]) { handleSendFile(e.target.files[0]); } }, [handleSendFile]); const handleFileButtonClick = useCallback(() => { if (!disableFileButton) { fileInputRef.current?.click(); } }, [disableFileButton]); const handleTextfieldKeyPress: React.KeyboardEventHandler< HTMLInputElement | HTMLTextAreaElement > = useCallback((e) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); handleSendMessage(); } }, [handleSendMessage]); const handleInputChange = useCallback((e: React.ChangeEvent) => { setMessageField(e.target.value); }, []); return ( } /> ); }; export default ChatInput;