import React, { FC, useState } from 'react'; import useFeatureStrategyApi from 'hooks/api/actions/useFeatureStrategyApi/useFeatureStrategyApi'; import { formatUnknownError } from 'utils/formatUnknownError'; import { useNavigate } from 'react-router-dom'; import useToast from 'hooks/useToast'; import { formatFeaturePath } from '../FeatureStrategyEdit/FeatureStrategyEdit'; import { Dialogue } from 'component/common/Dialogue/Dialogue'; import { Alert, styled, Typography } from '@mui/material'; import PermissionButton from 'component/common/PermissionButton/PermissionButton'; import { DELETE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions'; import { useFeature } from 'hooks/api/getters/useFeature/useFeature'; import { STRATEGY_FORM_REMOVE_ID } from 'utils/testIds'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton'; import { Delete } from '@mui/icons-material'; import { useChangeRequestApi } from 'hooks/api/actions/useChangeRequestApi/useChangeRequestApi'; import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled'; import { useChangeRequestOpen } from 'hooks/api/getters/useChangeRequestOpen/useChangeRequestOpen'; interface IFeatureStrategyRemoveProps { projectId: string; featureId: string; environmentId: string; strategyId: string; disabled?: boolean; icon?: boolean; } interface IFeatureStrategyRemoveDialogueProps { onRemove: (event: React.FormEvent) => Promise; onClose: () => void; isOpen: boolean; } const RemoveAlert: FC = () => ( Removing the strategy will change which users receive access to the feature. ); const FeatureStrategyRemoveDialogue: FC< IFeatureStrategyRemoveDialogueProps > = ({ onRemove, onClose, isOpen }) => { return ( ); }; const MsgContainer = styled('div')(({ theme }) => ({ marginTop: theme.spacing(3), marginBottom: theme.spacing(1), })); const SuggestFeatureStrategyRemoveDialogue: FC< IFeatureStrategyRemoveDialogueProps > = ({ onRemove, onClose, isOpen }) => { return ( Your suggestion: Remove strategy ); }; interface IRemoveProps { projectId: string; featureId: string; environmentId: string; strategyId: string; } const useOnRemove = ({ projectId, featureId, environmentId, strategyId, }: IRemoveProps) => { const { deleteStrategyFromFeature } = useFeatureStrategyApi(); const { setToastData, setToastApiError } = useToast(); const navigate = useNavigate(); const { refetchFeature } = useFeature(projectId, featureId); const onRemove = async (event: React.FormEvent) => { try { event.preventDefault(); await deleteStrategyFromFeature( projectId, featureId, environmentId, strategyId ); setToastData({ title: 'Strategy deleted', type: 'success', }); refetchFeature(); navigate(formatFeaturePath(projectId, featureId)); } catch (error: unknown) { setToastApiError(formatUnknownError(error)); } }; return onRemove; }; const useOnSuggestRemove = ({ projectId, featureId, environmentId, strategyId, }: IRemoveProps) => { const { addChangeRequest } = useChangeRequestApi(); const { refetch: refetchChangeRequests } = useChangeRequestOpen(projectId); const { setToastData, setToastApiError } = useToast(); const onSuggestRemove = async (event: React.FormEvent) => { try { event.preventDefault(); await addChangeRequest(projectId, environmentId, { action: 'deleteStrategy', feature: featureId, payload: { id: strategyId, }, }); setToastData({ title: 'Changes added to the draft!', type: 'success', }); await refetchChangeRequests(); } catch (error: unknown) { setToastApiError(formatUnknownError(error)); } }; return onSuggestRemove; }; export const FeatureStrategyRemove = ({ projectId, featureId, environmentId, strategyId, disabled, icon, }: IFeatureStrategyRemoveProps) => { const [openDialogue, setOpenDialogue] = useState(false); const changeRequestsEnabled = useChangeRequestsEnabled(); const onRemove = useOnRemove({ featureId, projectId, strategyId, environmentId, }); const onSuggestRemove = useOnSuggestRemove({ featureId, projectId, strategyId, environmentId, }); return ( <> setOpenDialogue(true)} projectId={projectId} environmentId={environmentId} disabled={disabled} permission={DELETE_FEATURE_STRATEGY} data-testid={STRATEGY_FORM_REMOVE_ID} tooltipProps={{ title: 'Remove strategy' }} type="button" > } elseShow={ setOpenDialogue(true)} projectId={projectId} environmentId={environmentId} disabled={disabled} permission={DELETE_FEATURE_STRATEGY} data-testid={STRATEGY_FORM_REMOVE_ID} color="secondary" variant="text" type="button" > Remove strategy } /> setOpenDialogue(false)} onRemove={async e => { await onSuggestRemove(e); setOpenDialogue(false); }} /> } elseShow={ setOpenDialogue(false)} onRemove={onRemove} /> } /> ); };