// React Imports import { useRef, useState, useEffect } from 'react' import type { FormEvent, KeyboardEvent, RefObject, MouseEvent } from 'react' // MUI Imports import TextField from '@mui/material/TextField' import Button from '@mui/material/Button' import IconButton from '@mui/material/IconButton' import Popper from '@mui/material/Popper' import Fade from '@mui/material/Fade' import Paper from '@mui/material/Paper' import ClickAwayListener from '@mui/material/ClickAwayListener' import Menu from '@mui/material/Menu' import MenuItem from '@mui/material/MenuItem' // Third-party Imports import Picker from '@emoji-mart/react' import data from '@emoji-mart/data' // Type Imports import type { ContactType } from '@/types/apps/chatTypes' import type { AppDispatch } from '@/redux-store' // Slice Imports import { sendMsg } from '@/redux-store/slices/chat' // Component Imports import CustomIconButton from '@core/components/mui/IconButton' type Props = { dispatch: AppDispatch activeUser: ContactType isBelowSmScreen: boolean messageInputRef: RefObject } // Emoji Picker Component for selecting emojis const EmojiPicker = ({ onChange, isBelowSmScreen, openEmojiPicker, setOpenEmojiPicker, anchorRef }: { onChange: (value: string) => void isBelowSmScreen: boolean openEmojiPicker: boolean setOpenEmojiPicker: (value: boolean | ((prevVar: boolean) => boolean)) => void anchorRef: RefObject }) => { return ( <> {({ TransitionProps, placement }) => ( setOpenEmojiPicker(false)}> { onChange(emoji.native) setOpenEmojiPicker(false) }} {...(isBelowSmScreen && { perLine: 8 })} /> )} ) } const SendMsgForm = ({ dispatch, activeUser, isBelowSmScreen, messageInputRef }: Props) => { // States const [msg, setMsg] = useState('') const [anchorEl, setAnchorEl] = useState(null) const [openEmojiPicker, setOpenEmojiPicker] = useState(false) // Refs const anchorRef = useRef(null) // Vars const open = Boolean(anchorEl) const handleToggle = () => { setOpenEmojiPicker(prevOpen => !prevOpen) } const handleClick = (event: MouseEvent) => { setAnchorEl(prev => (prev ? null : event.currentTarget)) } const handleClose = () => { setAnchorEl(null) } const handleSendMsg = (event: FormEvent | KeyboardEvent, msg: string) => { event.preventDefault() if (msg.trim() !== '') { dispatch(sendMsg({ msg })) setMsg('') } } const handleInputEndAdornment = () => { return (
{isBelowSmScreen ? ( <> { handleToggle() handleClose() }} > { setMsg(msg + value) if (messageInputRef.current) { messageInputRef.current.focus() } }} /> ) : ( <> { setMsg(msg + value) if (messageInputRef.current) { messageInputRef.current.focus() } }} /> )} {isBelowSmScreen ? ( ) : ( )}
) } useEffect(() => { setMsg('') }, [activeUser.id]) return (
handleSendMsg(event, msg)}> setMsg(e.target.value)} sx={{ '& fieldset': { border: '0' }, '& .MuiOutlinedInput-root': { background: 'var(--mui-palette-background-paper)', boxShadow: 'var(--mui-customShadows-xs) !important' } }} onKeyDown={(e: KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { handleSendMsg(e, msg) } }} size='small' inputRef={messageInputRef} slotProps={{ input: { endAdornment: handleInputEndAdornment() } }} /> ) } export default SendMsgForm