@eeacms/volto-chatbot
Version:
@eeacms/volto-chatbot: Volto add-on
126 lines (116 loc) • 3.26 kB
JSX
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;