import ThumbDownOffAlt from '@mui/icons-material/ThumbDownOffAlt'; import ThumbUpOffAltIcon from '@mui/icons-material/ThumbUpOffAlt'; import { Button, IconButton, Popover, TextField } from '@mui/material'; import { green, red } from '@mui/material/colors'; import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; import { Chat, Feedback, Message } from '../../contexts/AppContext'; type SubmitFeedbackFunction = ( feedbackData: Feedback, chat: Chat, message: Message, opts: { onSuccess?: () => void; onError?: (err: any) => void; }, feedbackText?: string ) => Promise; interface FeedbackButtonsProps { index: number; message: Message; chat: Chat; submitFeedback: SubmitFeedbackFunction; } const FeedbackButtons: React.FC = ({ index, submitFeedback, message, chat }) => { const [thumbUp, setThumbUp] = useState(false); const [thumbDown, setThumbDown] = useState(false); const [anchorEl, setAnchorEl] = useState(null); const [popoverPlacement, setPopoverPlacement] = useState<'top' | 'bottom'>('bottom'); const [otherFeedback, setOtherFeedback] = useState(''); const popoverRef = useRef(null); const textFieldRef = useRef(null); const toggleThumbUpState = () => { setThumbDown(false); setThumbUp(prev => !prev); }; const toggleThumbDownState = () => { setThumbUp(false); setThumbDown(prev => !prev); }; const handleThumbUpClick = () => { submitFeedback(Feedback.THUMBS_UP, chat, message, { onSuccess: toggleThumbUpState, onError: (err) => { console.error(err); toggleThumbUpState(); }, }); }; const handleThumbDownClick = (event: React.MouseEvent) => { if(thumbDown) { toggleThumbDownState(); } else { setAnchorEl(event.currentTarget); } }; const handleClose = () => { setAnchorEl(null); setOtherFeedback(''); }; const handleFeedback = (feedbackText: string) => { submitFeedback( Feedback.THUMBS_DOWN, chat, message, { onSuccess: () => { handleClose(); toggleThumbDownState(); }, onError: (err) => { console.error(err); handleClose(); }, }, feedbackText ); }; const open = Boolean(anchorEl); useLayoutEffect(() => { if (open && anchorEl) { setTimeout(() => { if(popoverRef.current) { const popoverRect = popoverRef.current.getBoundingClientRect(); const anchorRect = anchorEl.getBoundingClientRect(); const viewportHeight = window.innerHeight; if (anchorRect.bottom + popoverRect.height > viewportHeight) { setPopoverPlacement('top'); } else { setPopoverPlacement('bottom'); } } }, 200); } }, [open, anchorEl]); useEffect(() => { const handleResize = () => { if(open && anchorEl && popoverRef.current && textFieldRef.current) { const popoverRect = popoverRef.current.getBoundingClientRect(); const textFieldRect = textFieldRef.current.getBoundingClientRect(); const anchorRect = anchorEl.getBoundingClientRect(); const newTop = popoverPlacement === 'bottom' ? anchorRect.bottom + (textFieldRect.height - popoverRect.height) : anchorRect.top - textFieldRect.height; popoverRef.current.style.top = `${newTop}px`; } }; window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); }, [open, anchorEl, popoverPlacement]); return (
setOtherFeedback(e.target.value)} maxRows={4} InputProps={{ style: { fontSize: '0.875rem', padding: '0.5rem', }, }} />
Was it helpful?
); }; export default FeedbackButtons;