203 lines
4.5 KiB
JavaScript
Raw Normal View History

2019-12-16 21:53:30 +01:00
/**
*
* EditView
*
*/
2019-12-18 18:13:24 +01:00
import React, { useEffect, useReducer } from 'react';
import { useLocation } from 'react-router-dom';
2020-01-06 01:52:26 +01:00
import { isEmpty, isEqual } from 'lodash';
2019-12-18 18:13:24 +01:00
import { Header } from '@buffetjs/custom';
2020-01-06 01:52:26 +01:00
import { Play } from '@buffetjs/icons';
2019-12-18 18:13:24 +01:00
import { request, useGlobalContext } from 'strapi-helper-plugin';
import reducer, { initialState } from './reducer';
2020-01-02 09:55:26 +01:00
import form from './utils/form';
import Inputs from '../../../components/Inputs';
2020-01-06 01:52:26 +01:00
import TriggerContainer from '../../../components/TriggerContainer';
2020-01-02 09:55:26 +01:00
import Wrapper from './Wrapper';
2019-12-16 21:53:30 +01:00
function EditView() {
2019-12-18 18:13:24 +01:00
const { formatMessage } = useGlobalContext();
const [reducerState, dispatch] = useReducer(reducer, initialState);
const location = useLocation();
2020-01-06 01:52:26 +01:00
const {
modifiedWebhook,
initialWebhook,
isTriggering,
triggerResponse,
} = reducerState.toJS();
2019-12-18 18:13:24 +01:00
const { name } = modifiedWebhook;
const id = location.pathname.split('/')[3];
const isCreatingWebhook = id === 'create';
useEffect(() => {
if (!isCreatingWebhook) {
fetchData();
}
}, [fetchData, isCreatingWebhook]);
const fetchData = async () => {
try {
const { data } = await request(`/admin/webhooks/${id}`, {
method: 'GET',
});
dispatch({
type: 'GET_DATA_SUCCEEDED',
data,
});
} catch (err) {
if (err.code !== 20) {
strapi.notification.error('notification.error');
}
}
};
// Header props
const headerTitle = isCreatingWebhook
? formatMessage({
id: `Settings.webhooks.create`,
})
: name;
2020-01-06 01:52:26 +01:00
const actionsAreDisabled = isEqual(initialWebhook, modifiedWebhook);
const handleTrigger = async () => {
dispatch({
type: 'ON_TRIGGER',
});
try {
const response = await request(`/admin/webhooks/${id}/trigger`, {
method: 'POST',
});
dispatch({
type: 'TRIGGER_SUCCEEDED',
response,
});
} catch (err) {
const { message } = err;
dispatch({
type: 'TRIGGER_SUCCEEDED',
response: { error: message },
});
if (err.code !== 20) {
strapi.notification.error('notification.error');
}
}
};
2019-12-18 18:13:24 +01:00
const actions = [
{
color: 'primary',
2020-01-06 01:52:26 +01:00
disabled:
isCreatingWebhook || (!isCreatingWebhook && !actionsAreDisabled),
2019-12-18 18:13:24 +01:00
type: 'button',
2020-01-06 01:52:26 +01:00
label: formatMessage({
2019-12-18 18:13:24 +01:00
id: `Settings.webhooks.trigger`,
}),
2020-01-06 01:52:26 +01:00
onClick: () => {
handleTrigger();
},
2019-12-18 18:13:24 +01:00
style: {
paddingRight: 15,
paddingLeft: 15,
},
2020-01-06 01:52:26 +01:00
icon: <Play width="6px" height="7px" />,
2019-12-18 18:13:24 +01:00
},
{
onClick: () => {},
color: 'cancel',
disabled: actionsAreDisabled,
type: 'button',
2020-01-06 01:52:26 +01:00
label: formatMessage({
2019-12-18 18:13:24 +01:00
id: `app.components.Button.reset`,
}),
style: {
paddingRight: 20,
paddingLeft: 20,
},
},
{
onClick: () => {},
color: 'success',
disabled: actionsAreDisabled,
type: 'submit',
2020-01-06 01:52:26 +01:00
label: formatMessage({
2019-12-18 18:13:24 +01:00
id: `app.components.Button.save`,
}),
style: {
minWidth: 140,
},
},
];
const headerProps = {
title: {
label: headerTitle,
},
actions: actions,
};
2020-01-02 09:55:26 +01:00
const handleChange = ({ target: { name, value } }) => {
dispatch({
type: 'ON_CHANGE',
keys: name.split('.'),
value,
});
};
2020-01-03 10:53:58 +01:00
const handleClick = () => {
dispatch({
type: 'ADD_NEW_HEADER',
keys: ['headers'],
});
};
2019-12-16 21:53:30 +01:00
return (
2019-12-18 18:13:24 +01:00
<Wrapper>
<Header {...headerProps} />
2020-01-06 01:52:26 +01:00
{(isTriggering || !isEmpty(triggerResponse)) && (
<div className="trigger-wrapper">
<TriggerContainer
isPending={isTriggering}
response={triggerResponse}
/>
</div>
)}
2020-01-02 09:55:26 +01:00
<div className="form-wrapper">
2020-01-03 10:53:58 +01:00
<div className="form-card">
<div className="row">
{Object.keys(form).map(key => {
return (
<div key={key} className={form[key].styleName}>
<Inputs
{...form[key]}
// customInputs={{
// headers: HeadersInput,
// }}
name={key}
onChange={handleChange}
onClick={handleClick}
validations={form[key].validations}
value={modifiedWebhook[key] || form[key].value}
/>
</div>
);
})}
</div>
2020-01-02 09:55:26 +01:00
</div>
</div>
2019-12-18 18:13:24 +01:00
</Wrapper>
2019-12-16 21:53:30 +01:00
);
}
export default EditView;