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
229 lines (204 loc) • 6.05 kB
JavaScript
import React, { useState, useRef } from 'react';
import { Table, Icon, ButtonGroup, Button } from 'rsuite';
import gql from 'graphql-tag';
import { Link } from 'react-router-dom';
import { useMutation } from 'react-apollo';
const { Column, HeaderCell, Cell } = Table;
import PageContainer from '../../../src/components/page-container';
import Breadcrumbs from '../../../src/components/breadcrumbs';
import SmartDate from '../../../src/components/smart-date';
import CustomTable from '../../../src/components/table';
import { useModal } from '../../../src/components/modal';
import confirm from '../../../src/components/confirm';
import ShowError from '../../../src/components/show-error';
import ModalDevice from '../views/modal-device';
import DevicesMap from '../views/devices-map';
const DEVICES = gql`
query ($limit: Int, $offset: Int, $order: String) {
counters {
rows: devices {
count
}
}
rows: devices(limit: $limit, offset: $offset, order: $order) {
id,
name,
payload,
createdAt,
updatedAt,
status,
snapshot,
jsonSchema,
version,
lat,
lon
}
}
`;
const EDIT_DEVICE = gql`
mutation($id: Int!, $device: NewDevice!) {
editDevice(id: $id, device: $device) {
id,
name,
payload,
createdAt,
updatedAt,
status,
lat,
lon,
jsonSchema,
version,
lastUpdate,
snapshot
}
}
`;
const CREATE_DEVICE = gql`
mutation($device: NewDevice!) {
createDevice(device: $device) {
id,
name,
payload,
createdAt,
updatedAt,
status,
lat,
lon,
jsonSchema,
version,
lastUpdate,
snapshot
}
}
`;
const DELETE_DEVICE = gql`
mutation($id: Int!) {
deleteDevice(id: $id) {
id
}
}`;
const updateDevices = (devices, device) => {
if (device.id != null) {
return devices.map(d => d.id === device.id ? device : d);
} else return [...devices, device];
};
const Devices = () => {
const [devices, setDevices] = useState();
const table = useRef();
const { open, close, disable } = useModal({
view: ModalDevice,
labelSubmit: 'Save device',
title: device => device != null && device.id != null ?
<span>Edit device <em>"{device.name}"</em></span> : <span>Create new device</span>
});
const [editDevice, { error: editError }] = useMutation(EDIT_DEVICE);
const [createDevice, { error: createError }] = useMutation(CREATE_DEVICE);
const [deleteDevice, { loading: deleteLoading, error: deleteError }] = useMutation(DELETE_DEVICE);
//const [ admin, setAdmin ] = useState(null);
//const { saving, error, deleteAdmin, editAdmin, createAdmin } = useAdmins();
const disabled = deleteLoading;
const error = editError || createError || deleteError;
return (
<PageContainer className="page-devices">
<Breadcrumbs pages={['Devices']}/>
{error != null && <ShowError error={error}/>}
{devices != null && (
<DevicesMap devices={devices} />
)}
<div className="buttons">
<Button
appearance="primary"
disabled={disabled}
onClick={async () => {
const newDevice = await open({ });
if (newDevice != null) {
disable();
await createDevice({ variables: {
device: _.omit(newDevice, ['id', '__typename'])
}});
setDevices(updateDevices(devices, newDevice));
table.current.refetch();
}
close();
}}
>
Add Device
</Button>
</div>
<CustomTable
ref={table}
query={DEVICES}
height={600}
initialSortField="createdAt"
initialSortDirection="desc"
onData={devices => {
setDevices(devices);
}}
autoHeight
>
<Column width={60} align="center">
<HeaderCell>Id</HeaderCell>
<Cell dataKey="id" />
</Column>
<Column width={140} resizable>
<HeaderCell>Last Update</HeaderCell>
<Cell>
{({ createdAt }) => <SmartDate date={createdAt} />}
</Cell>
</Column>
<Column flexGrow={1}>
<HeaderCell>Name</HeaderCell>
<Cell dataKey="name">
{({ name, id }) => <Link to={`/devices/${id}`}>{name}</Link>}
</Cell>
</Column>
<Column width={200} resizable>
<HeaderCell>Status</HeaderCell>
<Cell dataKey="status"/>
</Column>
<Column width={80}>
<HeaderCell>Action</HeaderCell>
<Cell>
{device => (
<ButtonGroup>
<Button
size="xs"
onClick={async () => {
const modifiedDevice = await open(device);
console.log('modifiedDevice', modifiedDevice)
if (modifiedDevice != null) {
disable();
await editDevice({ variables: {
id: device.id,
device: _.omit(modifiedDevice, ['id', '__typename'])
}});
setDevices(updateDevices(devices, modifiedDevice));
}
close();
}}
>
<Icon icon="edit2" />
</Button>
<Button
size="xs"
onClick={async () => {
if (await confirm(
<div>Delete device <em>"{device.name}" ?</em></div>,
{ okLabel: 'Yes, delete' }
)) {
await deleteDevice({ variables: { id: device.id }});
table.current.refetch();
}
}}
>
<Icon icon="trash" />
</Button>
</ButtonGroup>
)}
</Cell>
</Column>
</CustomTable>
</PageContainer>
);
};
export default Devices;