UNPKG

@eeacms/volto-chatbot

Version:

@eeacms/volto-chatbot: Volto add-on

126 lines (116 loc) 3.26 kB
import React, { useState } from 'react'; import { trackEvent } from '@eeacms/volto-matomo/utils'; import { Modal, Button, TextArea, Form, Icon } from 'semantic-ui-react'; import { createChatMessageFeedback } from './lib'; const FeedbackModal = ({ modalOpen, onClose, setToast, onToast, isPositive, message, setIsToastActive, feedbackReasons, enableMatomoTracking, persona, }) => { const [feedbackText, setFeedbackText] = useState(''); const [selectedReason, setSelectedReason] = useState(''); const isPositiveFeedback = isPositive; const resetForm = () => { setFeedbackText(''); setSelectedReason(''); }; const handleClose = () => { resetForm(); onClose(); }; const submitFeedback = async () => { try { await createChatMessageFeedback({ chat_message_id: message.messageId, feedback_text: feedbackText, is_positive: isPositive, predefined_feedback: selectedReason, }); if (enableMatomoTracking) { trackEvent({ category: persona?.name ? `Chatbot - ${persona.name}` : 'Chatbot', action: isPositive ? 'Chatbot: Positive feedback submitted' : 'Chatbot: Negative feedback submitted', name: 'Feedback submitted', }); } setIsToastActive(true); onToast('Thanks for your feedback!', 'success'); } catch (error) { setIsToastActive(true); onToast('Failed to submit feedback.', 'error'); } finally { setTimeout(() => setIsToastActive(false), 5000); setTimeout(() => setToast(null), 3500); resetForm(); onClose(); } }; return ( <Modal open={modalOpen} onClose={handleClose} className="feedback-modal" size="small" > <Modal.Header> <h3> {isPositiveFeedback ? ( <> <Icon name="thumbs up outline" /> Share your positive feedback </> ) : ( <> <Icon name="thumbs down outline" /> Tell us how we can improve </> )} </h3> </Modal.Header> <Modal.Content> {!isPositiveFeedback && ( <div className="reason-buttons"> {feedbackReasons?.map((reason) => ( <Button primary size="small" key={reason} onClick={() => setSelectedReason(reason)} inverted={selectedReason !== reason} > {reason} </Button> ))} </div> )} <Form> <TextArea placeholder={ isPositiveFeedback ? 'What did you like about this response? (Optional)' : 'What could be improved? (Optional)' } value={feedbackText} onChange={(e) => setFeedbackText(e.target.value)} /> </Form> </Modal.Content> <Modal.Actions> <Button onClick={handleClose}>Cancel</Button> <Button primary onClick={submitFeedback}> Submit Feedback </Button> </Modal.Actions> </Modal> ); }; export default FeedbackModal;