diff --git a/frontend/src/component/feature/Dependencies/AddDependencyDialogue.tsx b/frontend/src/component/feature/Dependencies/AddDependencyDialogue.tsx index 8165c36ded..241c9b977e 100644 --- a/frontend/src/component/feature/Dependencies/AddDependencyDialogue.tsx +++ b/frontend/src/component/feature/Dependencies/AddDependencyDialogue.tsx @@ -2,8 +2,10 @@ import React, { useState } from 'react'; import { Box, styled, Typography } from '@mui/material'; import { Dialogue } from 'component/common/Dialogue/Dialogue'; import GeneralSelect from 'component/common/GeneralSelect/GeneralSelect'; +import { useDependentFeaturesApi } from 'hooks/api/actions/useDependentFeaturesApi/useDependentFeaturesApi'; interface IAddDependencyDialogueProps { + featureId: string; showDependencyDialogue: boolean; onClose: () => void; } @@ -14,18 +16,27 @@ const StyledSelect = styled(GeneralSelect)(({ theme }) => ({ })); export const AddDependencyDialogue = ({ + featureId, showDependencyDialogue, onClose, }: IAddDependencyDialogueProps) => { - const [dependency, setDependency] = useState(''); + const [parent, setParent] = useState(''); + const { addDependency, removeDependencies } = useDependentFeaturesApi(); return ( {}} - primaryButtonText={'Add'} + onClick={async () => { + if (parent === '') { + await removeDependencies(featureId); + } else { + await addDependency(featureId, { feature: parent }); + } + onClose(); + }} + primaryButtonText="Add" secondaryButtonText="Cancel" > @@ -37,11 +48,12 @@ export const AddDependencyDialogue = ({ diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx index 46a0a9669c..cdfbab1a9b 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/FeatureOverviewSidePanelDetails.tsx @@ -94,6 +94,7 @@ export const FeatureOverviewSidePanelDetails = ({ } /> setShowDependencyDialogue(false)} showDependencyDialogue={ dependentFeatures && showDependencyDialogue diff --git a/frontend/src/hooks/api/actions/useDependentFeaturesApi/useDependentFeaturesApi.ts b/frontend/src/hooks/api/actions/useDependentFeaturesApi/useDependentFeaturesApi.ts index f0241caeb7..1862709a62 100644 --- a/frontend/src/hooks/api/actions/useDependentFeaturesApi/useDependentFeaturesApi.ts +++ b/frontend/src/hooks/api/actions/useDependentFeaturesApi/useDependentFeaturesApi.ts @@ -1,4 +1,7 @@ import useAPI from '../useApi/useApi'; +import useToast from '../../../useToast'; +import { formatUnknownError } from '../../../../utils/formatUnknownError'; +import { useCallback } from 'react'; // TODO: generate from orval interface IParentFeaturePayload { @@ -8,6 +11,7 @@ export const useDependentFeaturesApi = () => { const { makeRequest, createRequest, errors, loading } = useAPI({ propagateErrors: true, }); + const { setToastData, setToastApiError } = useToast(); const addDependency = async ( childFeature: string, @@ -22,13 +26,67 @@ export const useDependentFeaturesApi = () => { ); try { await makeRequest(req.caller, req.id); - } catch (e) { - throw e; + + setToastData({ + title: 'Dependency added', + type: 'success', + }); + } catch (error) { + setToastApiError(formatUnknownError(error)); } }; + const removeDependency = async ( + childFeature: string, + parentFeature: string + ) => { + const req = createRequest( + `/api/admin/projects/default/features/${childFeature}/dependencies/${parentFeature}`, + { + method: 'DELETE', + } + ); + try { + await makeRequest(req.caller, req.id); + + setToastData({ + title: 'Dependency removed', + type: 'success', + }); + } catch (error) { + setToastApiError(formatUnknownError(error)); + } + }; + + const removeDependencies = async (childFeature: string) => { + const req = createRequest( + `/api/admin/projects/default/features/${childFeature}/dependencies`, + { + method: 'DELETE', + } + ); + try { + await makeRequest(req.caller, req.id); + + setToastData({ + title: 'Dependencies removed', + type: 'success', + }); + } catch (error) { + setToastApiError(formatUnknownError(error)); + } + }; + + const callbackDeps = [ + createRequest, + makeRequest, + setToastData, + formatUnknownError, + ]; return { - addDependency, + addDependency: useCallback(addDependency, callbackDeps), + removeDependency: useCallback(removeDependency, callbackDeps), + removeDependencies: useCallback(removeDependencies, callbackDeps), errors, loading, };