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
193 lines (183 loc) • 6.67 kB
JavaScript
import React, { useState, useRef } from 'react';
import _ from 'lodash';
import PropTypes from 'prop-types';
import { Modal, Button, Form, FormGroup, ControlLabel, FormControl, FlexboxGrid, Nav } from 'rsuite';
import JSONEditor from '../../../src/components/json-editor';
import Permissions from '../../../src/components/permissions';
import SelectChatbots from '../../../src/components/select-chatbots';
import PasswordInput from '../../../src/components/password-input';
import useCanCloseModal from '../../../src/hooks/modal-can-close';
import adminModel from '../model';
const ModalAdmin = ({ admin, onCancel = () => {}, onSubmit = () => {}, disabled = false }) => {
const form = useRef();
const { handleCancel, isChanged, setIsChanged } = useCanCloseModal({ onCancel });
const [formValue, setFormValue] = useState({ ...admin, password: undefined });
const [jsonValue, setJsonValue] = useState({
json: !_.isEmpty(admin.payload) ? JSON.stringify(admin.payload, null, 2) : ''
});
const [formError, setFormError] = useState(null);
const [tab, setTab] = useState('admin-details');
const isNew = admin.id == null;
return (
<Modal backdrop show onHide={() => handleCancel()} size="md" overflow={false} className="modal-admin">
<Modal.Header>
<Modal.Title>Edit Admin <em>(id: {admin.id})</em></Modal.Title>
</Modal.Header>
<Modal.Body>
<Nav
appearance="tabs"
active={tab}
onSelect={tab => {
// tab is switched to manual edit of payload, make sure the current payload field is serialized
// in serialized payload in order to show the updated one
if (tab === 'admin-payload') {
setJsonValue({
json: !_.isEmpty(formValue.payload) ? JSON.stringify(formValue.payload, null, 2) : ''
});
}
setTab(tab);
}}
activeKey={tab}
style={{ marginBottom: '15px' }}
>
<Nav.Item eventKey="admin-details">Admin details</Nav.Item>
<Nav.Item eventKey="admin-payload">Admin payload</Nav.Item>
</Nav>
{tab === 'admin-details' && (
<Form
ref={form}
checkTrigger="none"
model={adminModel}
formValue={formValue}
formError={formError}
onCheck={errors => {
if (formValue.id == null && _.isEmpty(formValue.password)) {
errors = { ...errors, password: 'Password is required' };
}
setFormError(errors);
}}
onChange={formValue => {
setIsChanged(true);
setFormValue(formValue);
setFormError(null);
}}
fluid autoComplete="off"
>
<FlexboxGrid justify="space-between" style={{ marginBottom: '20px' }}>
<FlexboxGrid.Item colspan={11}>
<FormGroup>
<ControlLabel>Username</ControlLabel>
<FormControl
disabled={disabled}
name="username" />
</FormGroup>
</FlexboxGrid.Item>
<FlexboxGrid.Item colspan={11}>
<FormGroup>
<ControlLabel>Password</ControlLabel>
<FormControl
disabled={disabled}
accepter={PasswordInput}
placeholder={!isNew ? 'something' : null}
name="password" />
</FormGroup>
</FlexboxGrid.Item>
</FlexboxGrid>
<FlexboxGrid justify="space-between" style={{ marginBottom: '20px' }}>
<FlexboxGrid.Item colspan={11}>
<FormGroup>
<ControlLabel>First Name</ControlLabel>
<FormControl autoComplete="off" disabled={disabled} name="first_name" />
</FormGroup>
</FlexboxGrid.Item>
<FlexboxGrid.Item colspan={11}>
<FormGroup>
<ControlLabel>Last Name</ControlLabel>
<FormControl disabled={disabled} name="last_name" />
</FormGroup>
</FlexboxGrid.Item>
</FlexboxGrid>
<FormGroup>
<ControlLabel>Email</ControlLabel>
<FormControl disabled={disabled} name="email" />
</FormGroup>
<FormGroup>
<ControlLabel>Permissions</ControlLabel>
<FormControl
disabled={disabled}
name="permissions"
accepter={Permissions}
/>
</FormGroup>
<FormGroup>
<ControlLabel>Chatbots</ControlLabel>
<FormControl
disabled={disabled}
name="chatbotIds"
accepter={SelectChatbots}
/>
</FormGroup>
</Form>
)}
{tab === 'admin-payload' && (
<Form
formValue={jsonValue}
formError={formError}
fluid autoComplete="off"
>
<FormGroup>
<ControlLabel>Payload</ControlLabel>
<FormControl
disabled={disabled}
name="json"
accepter={JSONEditor}
onChange={json => {
if (!_.isEmpty(json)) {
let payload;
setJsonValue({ json });
try {
payload = JSON.parse(json);
} catch(e) {
// error do nothing
return;
}
setFormValue({ ...formValue, payload });
setIsChanged(true);
}
}}
/>
</FormGroup>
</Form>
)}
</Modal.Body>
<Modal.Footer>
<Button onClick={() => handleCancel()} appearance="subtle">
Cancel
</Button>
<Button
appearance="primary"
disabled={disabled || !isChanged}
onClick={() => {
if (!form.current.check()) {
return;
}
onSubmit(formValue)
}}
>
Save admin
</Button>
</Modal.Footer>
</Modal>
);
};
const TypeAdmin = PropTypes.shape({
id: PropTypes.number,
payload: PropTypes.object
});
ModalAdmin.propTypes = {
admin: TypeAdmin,
disabled: PropTypes.bool,
onSubmit: PropTypes.func,
onCancel: PropTypes.func
};
export default ModalAdmin;