import React, { useState } from 'react'; import { transform } from '../../../../../services/transformer/notificationAdapterTransformer'; import { Modal, Form, Button, Dropdown, Input, Message } from 'semantic-ui-react'; import { xhrPost } from '../../../../../services/xhr'; import Help from './NotificationHelpDisplay'; import { useSelector } from 'react-redux'; import Switch from 'react-switch'; import './NotificationAdapterMutator.less'; const sortAdapter = (a, b) => { if (a.name < b.name) { return -1; } if (a.name > b.name) { return 1; } return 0; }; const validate = (selectedAdapter) => { const results = []; for (let uiElement of Object.values(selectedAdapter.fields || [])) { if (uiElement.value == null) { results.push('All fields are mandatory and must be set.'); continue; } if (uiElement.type === 'number' && (typeof uiElement.value !== 'number' || uiElement.value < 0)) { results.push('A number field cannot contain anything else and must be > 0.'); continue; } if (uiElement.type === 'boolean' && typeof uiElement.value !== 'boolean') { results.push('A boolean field cannot be of a different type.'); continue; } if (typeof uiElement.value === 'string' && uiElement.value.length === 0) { results.push('All fields are mandatory and must be set.'); } } return [...new Set(results)]; }; export default function NotificationAdapterMutator({ onVisibilityChanged, visible = false, selected = [], onData, } = {}) { const adapter = useSelector((state) => state.notificationAdapter); const [selectedAdapter, setSelectedAdapter] = useState(null); const [validationMessage, setValidationMessage] = useState(null); const [successMessage, setSuccessMessage] = useState(null); const onSubmit = (doStore) => { if (doStore) { const validationResults = validate(selectedAdapter); if (validationResults.length > 0) { setValidationMessage(validationResults.join('
')); return; } onData( transform({ id: selectedAdapter.id, name: selectedAdapter.name, fields: selectedAdapter.fields || {}, }) ); setSelectedAdapter(null); onVisibilityChanged(false); } else { setSelectedAdapter(null); onVisibilityChanged(false); } }; const onTry = () => { setValidationMessage(null); setSuccessMessage(null); const validationResults = validate(selectedAdapter); if (validationResults.length > 0) { setValidationMessage(validationResults.join('
')); return; } xhrPost('/api/jobs/notificationAdapter/try', { id: selectedAdapter.id, fields: { ...selectedAdapter.fields, }, }) .then(() => { setSuccessMessage('It seems like it worked! Please check your service.'); }) .catch((error) => setValidationMessage(`This did not work :-( I've received the following error: ${error.json.message}`) ); }; const setValue = (selectedAdapter, uiElement, key, value) => { uiElement.value = value; setSelectedAdapter({ ...selectedAdapter, config: { ...selectedAdapter.fields, [key]: uiElement, }, }); }; const getFieldsFor = (selectedAdapter_) => { const selectedAdapter = Object.assign({}, selectedAdapter_); return Object.keys(selectedAdapter.fields || []).map((key) => { const uiElement = selectedAdapter.fields[key]; return ( {uiElement.type === 'boolean' ? ( { setValue(selectedAdapter, uiElement, key, checked); }} /> ) : ( { setValue(selectedAdapter, uiElement, key, e.target.value); }} /> )} ); }); }; return ( onVisibilityChanged(false)} onOpen={() => onVisibilityChanged(true)} open={visible} style={{ width: '95%' }} > Adding a new Notification Adapter {validationMessage != null && ( Houston we have a problem...

)} {successMessage != null && ( Yay!

)}

When Fredy found new listings, we like to report them to you. To do so, notification adapter can be configured.
There are multiple ways how Fredy can send new listings to you. Chose your weapon...

{ return { key: a.id, value: a.id, text: a.name, }; }) //filter out those, that have already been selected .filter((option) => selected.find((selectedOption) => selectedOption.id === option.key) == null) .sort(sortAdapter)} onChange={(e, { value }) => { setSuccessMessage(null); setValidationMessage(null); const selectedAdapter = adapter.find((a) => a.id === value); setSelectedAdapter(Object.assign({}, selectedAdapter)); }} />

{selectedAdapter != null && (
{selectedAdapter.description}
{selectedAdapter.readme != null && ( )}
{getFieldsFor(selectedAdapter)}
)}