diff --git a/frontend/src/component/addons/AddonList/AddonList.jsx b/frontend/src/component/addons/AddonList/AddonList.jsx
index 0e0f3a4b8d..a849d2672b 100644
--- a/frontend/src/component/addons/AddonList/AddonList.jsx
+++ b/frontend/src/component/addons/AddonList/AddonList.jsx
@@ -1,5 +1,4 @@
-import React, { useContext, useEffect } from 'react';
-import PropTypes from 'prop-types';
+import { useContext, useEffect } from 'react';
import ConfiguredAddons from './ConfiguredAddons';
import AvailableAddons from './AvailableAddons';
import { Avatar } from '@material-ui/core';
@@ -14,6 +13,8 @@ import webhooksIcon from '../../../assets/icons/webhooks.svg';
import teamsIcon from '../../../assets/icons/teams.svg';
import dataDogIcon from '../../../assets/icons/datadog.svg';
import { formatAssetPath } from '../../../utils/format-path';
+import useAddons from '../../../hooks/api/getters/useAddons/useAddons';
+import { useHistory } from 'react-router-dom';
const style = {
width: '40px',
@@ -73,18 +74,14 @@ const getIcon = name => {
}
};
-const AddonList = ({
- addons,
- providers,
- fetchAddons,
- removeAddon,
- toggleAddon,
- history,
-}) => {
+const AddonList = () => {
const { hasAccess } = useContext(AccessContext);
+ const { addons, providers, refetchAddons } = useAddons();
+ const history = useHistory();
+
useEffect(() => {
if (addons.length === 0) {
- fetchAddons();
+ refetchAddons();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [addons.length]);
@@ -96,9 +93,7 @@ const AddonList = ({
show={
}
@@ -115,13 +110,4 @@ const AddonList = ({
);
};
-AddonList.propTypes = {
- addons: PropTypes.array.isRequired,
- providers: PropTypes.array.isRequired,
- fetchAddons: PropTypes.func.isRequired,
- removeAddon: PropTypes.func.isRequired,
- toggleAddon: PropTypes.func.isRequired,
- history: PropTypes.object.isRequired,
-};
-
export default AddonList;
diff --git a/frontend/src/component/addons/AddonList/AvailableAddons/AvailableAddons.jsx b/frontend/src/component/addons/AddonList/AvailableAddons/AvailableAddons.jsx
index 95fb25e755..138881d9bc 100644
--- a/frontend/src/component/addons/AddonList/AvailableAddons/AvailableAddons.jsx
+++ b/frontend/src/component/addons/AddonList/AvailableAddons/AvailableAddons.jsx
@@ -13,6 +13,8 @@ import { CREATE_ADDON } from '../../../providers/AccessProvider/permissions';
import PropTypes from 'prop-types';
const AvailableAddons = ({ providers, getIcon, hasAccess, history }) => {
+
+ console.log('this is ', providers)
const renderProvider = provider => (
{getIcon(provider.name)}
diff --git a/frontend/src/component/addons/AddonList/ConfiguredAddons/ConfiguredAddons.jsx b/frontend/src/component/addons/AddonList/ConfiguredAddons/ConfiguredAddons.jsx
index 7346408721..4b6b23e9ab 100644
--- a/frontend/src/component/addons/AddonList/ConfiguredAddons/ConfiguredAddons.jsx
+++ b/frontend/src/component/addons/AddonList/ConfiguredAddons/ConfiguredAddons.jsx
@@ -17,15 +17,51 @@ import {
import { Link } from 'react-router-dom';
import PageContent from '../../../common/PageContent/PageContent';
import PropTypes from 'prop-types';
+import useAddons from '../../../../hooks/api/getters/useAddons/useAddons';
+import useToast from '../../../../hooks/useToast';
+import useAddonsApi from '../../../../hooks/api/actions/useAddonsApi/useAddonsApi';
+
+const ConfiguredAddons = ({ addons, hasAccess, getIcon }) => {
+ const { refetchAddons } = useAddons();
+ const { updateAddon, removeAddon } = useAddonsApi();
+ const { setToastData } = useToast();
+
+ const toggleAddon = async addon => {
+ try {
+ await updateAddon({ ...addon, enabled: !addon.enabled });
+ refetchAddons();
+ setToastData({
+ type: 'success',
+ title: 'Success',
+ text: 'Addon state switched successfully',
+ });
+ } catch (e) {
+ setToastData({
+ type: 'error',
+ title: 'Error',
+ text: 'Can not change addon state',
+ });
+ }
+ };
+
+ const onRemoveAddon = addon => async () => {
+ try {
+ await removeAddon(addon.id);
+ refetchAddons();
+ setToastData({
+ type: 'success',
+ title: 'Success',
+ text: 'Deleted addon successfully',
+ });
+ } catch (e) {
+ setToastData({
+ type: 'error',
+ title: 'Error',
+ text: 'Can not delete addon',
+ });
+ }
+ };
-const ConfiguredAddons = ({
- addons,
- hasAccess,
- removeAddon,
- getIcon,
- toggleAddon,
-}) => {
- const onRemoveAddon = addon => () => removeAddon(addon);
const renderAddon = addon => (
{getIcon(addon.provider)}
@@ -95,7 +131,6 @@ const ConfiguredAddons = ({
ConfiguredAddons.propTypes = {
addons: PropTypes.array.isRequired,
hasAccess: PropTypes.func.isRequired,
- removeAddon: PropTypes.func.isRequired,
toggleAddon: PropTypes.func.isRequired,
getIcon: PropTypes.func.isRequired,
};
diff --git a/frontend/src/component/addons/form-addon-component.jsx b/frontend/src/component/addons/form-addon-component.jsx
index ab8fa4260f..e4483d6593 100644
--- a/frontend/src/component/addons/form-addon-component.jsx
+++ b/frontend/src/component/addons/form-addon-component.jsx
@@ -10,15 +10,15 @@ import cloneDeep from 'lodash.clonedeep';
import styles from './form-addon-component.module.scss';
import PageContent from '../common/PageContent/PageContent';
+import useAddonsApi from '../../hooks/api/actions/useAddonsApi/useAddonsApi';
+import useToast from '../../hooks/useToast';
+import { useHistory } from 'react-router-dom';
+
+const AddonFormComponent = ({ editMode, provider, addon, fetch }) => {
+ const { createAddon, updateAddon } = useAddonsApi();
+ const { setToastData, setToastApiError } = useToast();
+ const history = useHistory();
-const AddonFormComponent = ({
- editMode,
- provider,
- addon,
- fetch,
- cancel,
- submit,
-}) => {
const [config, setConfig] = useState(addon);
const [errors, setErrors] = useState({
parameters: {},
@@ -73,6 +73,10 @@ const AddonFormComponent = ({
setErrors({ ...errors, events: undefined });
};
+ const handleCancel = () => {
+ history.goBack();
+ };
+
const onSubmit = async evt => {
evt.preventDefault();
if (!provider) return;
@@ -100,8 +104,25 @@ const AddonFormComponent = ({
}
try {
- await submit(config);
+ if (editMode) {
+ await updateAddon(config);
+ history.push('/addons');
+ setToastData({
+ type: 'success',
+ title: 'Addon updated successfully',
+ });
+ } else {
+ await createAddon(config);
+ history.push('/addons');
+ setToastData({
+ type: 'success',
+ title: 'Addon created successfully',
+ });
+ }
} catch (e) {
+ setToastApiError({
+ text: e.toString(),
+ });
setErrors({ parameters: {}, general: e.message });
}
};
@@ -175,7 +196,7 @@ const AddonFormComponent = ({
/>
diff --git a/frontend/src/hooks/api/actions/useAddonsApi/useAddonsApi.ts b/frontend/src/hooks/api/actions/useAddonsApi/useAddonsApi.ts
index 2dd5b48536..bf2e8855b6 100644
--- a/frontend/src/hooks/api/actions/useAddonsApi/useAddonsApi.ts
+++ b/frontend/src/hooks/api/actions/useAddonsApi/useAddonsApi.ts
@@ -1,8 +1,7 @@
-import { SWRConfiguration } from 'swr';
import { IAddons } from '../../../../interfaces/addons';
import useAPI from '../useApi/useApi';
-const useAddonsApi = (options: SWRConfiguration = {}) => {
+const useAddonsApi = () => {
const { makeRequest, createRequest, errors, loading } = useAPI({
propagateErrors: true,
});
diff --git a/frontend/src/hooks/api/getters/useAddons/useAddons.ts b/frontend/src/hooks/api/getters/useAddons/useAddons.ts
index 9479641740..24c29c22aa 100644
--- a/frontend/src/hooks/api/getters/useAddons/useAddons.ts
+++ b/frontend/src/hooks/api/getters/useAddons/useAddons.ts
@@ -17,7 +17,7 @@ const useAddons = (options: SWRConfiguration = {}) => {
const { data, error } = useSWR(KEY, fetcher, options);
const [loading, setLoading] = useState(!error && !data);
- const refetch = () => {
+ const refetchAddons = () => {
mutate(KEY);
};
@@ -26,10 +26,11 @@ const useAddons = (options: SWRConfiguration = {}) => {
}, [data, error]);
return {
- addons: data || [],
+ addons: data?.addons || [],
+ providers: data?.providers || [],
error,
loading,
- refetch,
+ refetchAddons,
};
};