1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-05-22 01:16:07 +02:00
unleash.unleash/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureLifecycle/MarkCompletedDialogue.tsx
2024-05-13 14:51:28 +02:00

149 lines
5.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Box, Radio, RadioGroup, Typography } from '@mui/material';
import { Dialogue } from 'component/common/Dialogue/Dialogue';
import { LegalValueLabel } from 'component/common/NewConstraintAccordion/ConstraintAccordionEdit/ConstraintAccordionEditBody/LegalValueLabel/LegalValueLabel';
import { useState } from 'react';
import useFeatureLifecycleApi from 'hooks/api/actions/useFeatureLifecycleApi/useFeatureLifecycleApi';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { SingleVariantOptions } from './SingleVariantOptions';
import { useParentVariantOptions } from 'hooks/api/getters/useFeatureDependencyOptions/useFeatureDependencyOptions';
import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
interface IMarkCompletedDialogueProps {
isOpen: boolean;
setIsOpen: (open: boolean) => void;
onComplete: () => void;
projectId: string;
featureId: string;
}
type Status = 'kept' | 'discarded' | 'kept-with-variant';
export const MarkCompletedDialogue = ({
projectId,
featureId,
isOpen,
setIsOpen,
onComplete,
}: IMarkCompletedDialogueProps) => {
const { markFeatureCompleted } = useFeatureLifecycleApi();
const { parentVariantOptions: variantOptions } = useParentVariantOptions(
projectId,
featureId,
);
const [status, setStatus] = useState<Status>('kept');
const [variant, setVariant] = useState<string | undefined>(undefined);
const { trackEvent } = usePlausibleTracker();
const onClick = async () => {
const sentStatus = status === 'kept-with-variant' ? 'kept' : status;
await markFeatureCompleted(featureId, projectId, {
status: sentStatus,
statusValue: variant,
});
setIsOpen(false);
onComplete();
trackEvent('feature-lifecycle', {
props: {
eventType: 'complete',
status: sentStatus,
},
});
};
return (
<Dialogue
open={isOpen}
title='Mark completed'
onClose={() => {
setIsOpen(false);
}}
disabledPrimaryButton={
status === 'kept-with-variant' && variant === null
}
onClick={onClick}
primaryButtonText={'Mark completed'}
secondaryButtonText='Cancel'
>
<Box>
<Box
sx={{
mt: 2,
mb: 4,
}}
>
Marking the feature toggle as complete does not affect any
configuration, but it moves the feature toggle into its
next life cycle stage and is an indication that you have
learned what you needed in order to progress with the
feature. It serves as a reminder to start cleaning up the
feature toggle and removing it from the code.
</Box>
<Typography
sx={{
mb: 2,
}}
>
<b>What was the outcome of this feature?</b>
</Typography>
<RadioGroup
aria-label='selected-value'
name='selected'
sx={{ gap: (theme) => theme.spacing(0.5) }}
onChange={(e, value) => {
setStatus(value as Status);
}}
>
<LegalValueLabel
key={'kept'}
value={'kept'}
legal={{
value: 'We decided to keep the feature',
}}
control={<Radio />}
/>
<LegalValueLabel
key={'discarded'}
value={'discarded'}
legal={{
value: 'We decided to discard the feature',
}}
control={<Radio />}
/>
<ConditionallyRender
condition={variantOptions.length > 0}
show={
<LegalValueLabel
key={'kept-with-variant'}
value={'kept-with-variant'}
legal={{
value: 'We decided to keep the feature variant',
description:
'Choose to specify which feature variant will be kept',
}}
control={<Radio />}
/>
}
/>
<ConditionallyRender
condition={
variantOptions.length > 0 &&
status === 'kept-with-variant'
}
show={
<SingleVariantOptions
parent={featureId}
project={projectId}
onSelect={(variant) => {
setVariant(variant);
}}
/>
}
/>
</RadioGroup>
</Box>
</Dialogue>
);
};