UNPKG

node-red-contrib-chatbot

Version:

REDBot a Chat bot for a full featured chat bot for Telegram, Facebook Messenger and Slack. Almost no coding skills required

100 lines (92 loc) 3 kB
import React, { useState } from 'react'; import { Modal, Button } from 'rsuite'; import gql from 'graphql-tag'; import { useQuery, useMutation } from 'react-apollo' import ReactJson from 'react-json-view' import WarningBox from '../../components/warning-box'; import useCanCloseModal from '../../../src/hooks/modal-can-close'; import LoaderModal from '../../../src/components/loader-modal'; import ShowError from '../show-error'; import './style.scss'; const USER = gql` query($id: Int!) { user(id: $id) { id, userId, context } }`; const UPDATE_CONTEXT = gql` mutation($id: Int!, $user: InputUser!) { editUser(id: $id, user: $user) { id, context } } `; const ContextModal = ({ user, onSubmit = () => {}, onCancel = () => {} }) => { const { handleCancel, isChanged, setIsChanged } = useCanCloseModal({ onCancel }); const [context, setContext] = useState(); const { loading, error: loadingError } = useQuery(USER, { fetchPolicy: 'network-only', variables: { id: user.id }, onCompleted: data => { if (data.user != null) { setContext(data.user.context); } } }); const [ updateContext, { loading: saving, error: updateError }] = useMutation(UPDATE_CONTEXT, { onCompleted: () => onSubmit() }); const handleChange = ({ updated_src: json }) => { setContext(json); setIsChanged(true); } const error = loadingError || updateError; const disabled = loading || saving; return ( <Modal backdrop show onHide={() => handleCancel()} size="md" overflow={false} className="modal-context"> <Modal.Header> <Modal.Title>Context <em>(id: {user.id})</em></Modal.Title> </Modal.Header> <Modal.Body> {loading && <LoaderModal/>} {error && <ShowError error={error} />} {!loading && !error && context == null && ( <WarningBox icon="database" title="No Context" hover="ban" > Context is not available for this user.<br /> This happens if the chatbot uses a Memory or Plain File context provider or the SQLite proivders are running on a different database of Mission Control </WarningBox> )} {!loading && context != null && ( <ReactJson src={context} onEdit={!disabled ? handleChange : undefined} onAdd={!disabled ? handleChange : undefined} onDelete={!disabled ? handleChange : undefined} /> )} </Modal.Body> <Modal.Footer> <Button onClick={() => handleCancel()} appearance="subtle"> Cancel </Button> <Button appearance="primary" disabled={disabled || !isChanged} appearance="primary" onClick={() => updateContext({ variables: { id: user.id, user: { context } } })} > Save context </Button> </Modal.Footer> </Modal> ); } export default ContextModal;