From 476959df8e72d258f77aea2ff169faaba7858d93 Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Thu, 9 May 2024 12:19:24 +0200 Subject: [PATCH] refactor: extract feature lifecycle component (#7023) --- .../FeatureLifecycle/FeatureLifecycle.tsx | 43 +++++++++++++++++++ .../FeatureOverviewMetaData.tsx | 38 +++------------- 2 files changed, 50 insertions(+), 31 deletions(-) create mode 100644 frontend/src/component/feature/FeatureView/FeatureOverview/FeatureLifecycle/FeatureLifecycle.tsx diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureLifecycle/FeatureLifecycle.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureLifecycle/FeatureLifecycle.tsx new file mode 100644 index 0000000000..1457835b7f --- /dev/null +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureLifecycle/FeatureLifecycle.tsx @@ -0,0 +1,43 @@ +import { FeatureLifecycleStageIcon } from './FeatureLifecycleStageIcon'; +import { FeatureLifecycleTooltip } from './FeatureLifecycleTooltip'; +import useFeatureLifecycleApi from 'hooks/api/actions/useFeatureLifecycleApi/useFeatureLifecycleApi'; +import { populateCurrentStage } from './populateCurrentStage'; +import type { IFeatureToggle } from 'interfaces/featureToggle'; +import type { FC } from 'react'; + +export const FeatureLifecycle: FC<{ + onArchive: () => void; + onComplete: () => void; + onUncomplete: () => void; + feature: Pick< + IFeatureToggle, + 'lifecycle' | 'environments' | 'project' | 'name' + >; +}> = ({ feature, onComplete, onUncomplete, onArchive }) => { + const currentStage = populateCurrentStage(feature); + + const { markFeatureCompleted, markFeatureUncompleted, loading } = + useFeatureLifecycleApi(); + + const onCompleteHandler = async () => { + await markFeatureCompleted(feature.name, feature.project); + onComplete(); + }; + + const onUncompleteHandler = async () => { + await markFeatureUncompleted(feature.name, feature.project); + onUncomplete(); + }; + + return currentStage ? ( + + + + ) : null; +}; diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx index a2c4c5aa67..b44c580f8c 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx @@ -8,13 +8,9 @@ import PermissionIconButton from 'component/common/PermissionIconButton/Permissi import { UPDATE_FEATURE } from 'component/providers/AccessProvider/permissions'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; import { useUiFlag } from 'hooks/useUiFlag'; -import { FeatureLifecycleTooltip } from '../FeatureLifecycle/FeatureLifecycleTooltip'; -import { FeatureLifecycleStageIcon } from '../FeatureLifecycle/FeatureLifecycleStageIcon'; import { FeatureArchiveDialog } from 'component/common/FeatureArchiveDialog/FeatureArchiveDialog'; import { useState } from 'react'; import { FeatureArchiveNotAllowedDialog } from 'component/common/FeatureArchiveDialog/FeatureArchiveNotAllowedDialog'; -import { populateCurrentStage } from '../FeatureLifecycle/populateCurrentStage'; -import useFeatureLifecycleApi from 'hooks/api/actions/useFeatureLifecycleApi/useFeatureLifecycleApi'; import { StyledDetail } from '../FeatureOverviewSidePanel/FeatureOverviewSidePanelDetails/StyledRow'; import { formatDateYMD } from 'utils/formatDate'; import { parseISO } from 'date-fns'; @@ -23,6 +19,7 @@ import { DependencyRow } from './DependencyRow'; import { useLocationSettings } from 'hooks/useLocationSettings'; import { useShowDependentFeatures } from './useShowDependentFeatures'; import type { ILastSeenEnvironments } from 'interfaces/featureToggle'; +import { FeatureLifecycle } from '../FeatureLifecycle/FeatureLifecycle'; const StyledContainer = styled('div')(({ theme }) => ({ borderRadius: theme.shape.borderRadiusLarge, @@ -97,8 +94,6 @@ const FeatureOverviewMetaData = () => { const { feature, refetchFeature } = useFeature(projectId, featureId); const { project, description, type } = feature; const featureLifecycleEnabled = useUiFlag('featureLifecycle'); - const { markFeatureCompleted, markFeatureUncompleted, loading } = - useFeatureLifecycleApi(); const navigate = useNavigate(); const [showDelDialog, setShowDelDialog] = useState(false); const { locationSettings } = useLocationSettings(); @@ -115,18 +110,6 @@ const FeatureOverviewMetaData = () => { const IconComponent = getFeatureTypeIcons(type); - const currentStage = populateCurrentStage(feature); - - const onComplete = async () => { - await markFeatureCompleted(featureId, projectId); - refetchFeature(); - }; - - const onUncomplete = async () => { - await markFeatureUncompleted(featureId, projectId); - refetchFeature(); - }; - return ( @@ -151,23 +134,16 @@ const FeatureOverviewMetaData = () => { {project} Lifecycle: - setShowDelDialog(true)} - onComplete={onComplete} - onUncomplete={onUncomplete} - loading={loading} - > - - + onComplete={refetchFeature} + onUncomplete={refetchFeature} + /> } />