UNPKG

@eeacms/volto-chatbot

Version:

@eeacms/volto-chatbot: Volto add-on

120 lines (105 loc) 3.12 kB
import React from 'react'; import { Button, Message, MessageContent } from 'semantic-ui-react'; import { serializeNodes } from '@plone/volto-slate/editor/render'; import Spinner from './Spinner'; import { SVGIcon } from './utils'; import GlassesIcon from './../icons/glasses.svg'; import RotateIcon from './../icons/rotate.svg'; const VERIFY_CLAIM_MESSAGES = [ 'Going through each claim and verify against the referenced documents...', 'Summarising claim verifications results...', 'Calculating scores...', ]; function visitTextNodes(node, visitor) { if (Array.isArray(node)) { node.forEach((child) => visitTextNodes(child, visitor)); } else if (node && typeof node === 'object') { if (node.text !== undefined) { // Process the text node value here // console.log(node.text); visitor(node); } if (node.children) { visitTextNodes(node.children, visitor); } } } function printSlate(value, score) { if (typeof value === 'string') { return value.replaceAll('{score}', score); } function visitor(node) { if (node.text.indexOf('{score}') > -1) { node.text = node.text.replaceAll('{score}', score); } } visitTextNodes(value, visitor); return serializeNodes(value); } function VerifyClaims() { const [message, setMessage] = React.useState(0); React.useEffect(() => { const timer = setTimeout(() => { if (message < VERIFY_CLAIM_MESSAGES.length - 1) { setMessage(message + 1); } }, 5000); return () => clearTimeout(timer); }, [message]); return ( <div className="verify-claims"> <Spinner /> {VERIFY_CLAIM_MESSAGES[message]} </div> ); } const HalloumiFeedback = ({ halloumiMessage, isLoadingHalloumi, markers, score, scoreColor, onManualVerify, showVerifyClaimsButton, sources, retryHalloumi, }) => { const noClaimsScore = markers?.claims[0]?.score === null; const messageBySource = 'Please allow a few minutes for claim verification when many references are involved.'; return ( <> {showVerifyClaimsButton && ( <div className="halloumi-feedback-button"> <Button onClick={onManualVerify} className="icon claims-btn"> <SVGIcon name={GlassesIcon} /> Fact-check AI answer </Button> <div> <span>{messageBySource}</span>{' '} </div> </div> )} {isLoadingHalloumi && sources.length > 0 && ( <Message color="blue"> <VerifyClaims /> </Message> )} {noClaimsScore && ( <> <Message color="red">{markers?.claims?.[0].rationale}</Message> <Button onClick={retryHalloumi} className="icon"> <SVGIcon name={RotateIcon} /> Retry Fact-check AI answer </Button> </> )} {!!halloumiMessage && !!markers && !noClaimsScore && ( <Message color={scoreColor} icon> <MessageContent> {printSlate(halloumiMessage, `${score}%`)} </MessageContent> </Message> )} </> ); }; export default HalloumiFeedback;