From 4cd4153412529950d35c622efa1658680bd2e088 Mon Sep 17 00:00:00 2001 From: Jaanus Sellin Date: Fri, 14 Jul 2023 14:23:23 +0300 Subject: [PATCH] chore: remove split button strategy flag (#4245) --- .../context/ContextForm/ContextForm.tsx | 3 - .../ContextList/ContextList/ContextList.tsx | 2 - .../AddFromTemplateCard.tsx | 130 ------------------ .../FeatureStrategyEmpty.tsx | 95 +------------ .../LegacyFeatureStrategyMenu.tsx | 70 ---------- .../FeatureOverviewEnvironment.tsx | 92 +++---------- .../ProjectSettings/Settings/EditProject.tsx | 2 - .../segments/SegmentTable/SegmentTable.tsx | 2 - frontend/src/interfaces/uiConfig.ts | 1 - frontend/src/utils/routePathHelpers.ts | 2 - .../__snapshots__/create-config.test.ts.snap | 2 - src/lib/types/experimental.ts | 5 - src/server-dev.ts | 1 - 13 files changed, 26 insertions(+), 381 deletions(-) delete mode 100644 frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/AddFromTemplateCard/AddFromTemplateCard.tsx delete mode 100644 frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/LegacyFeatureStrategyMenu.tsx diff --git a/frontend/src/component/context/ContextForm/ContextForm.tsx b/frontend/src/component/context/ContextForm/ContextForm.tsx index a4d280bade..f6326af240 100644 --- a/frontend/src/component/context/ContextForm/ContextForm.tsx +++ b/frontend/src/component/context/ContextForm/ContextForm.tsx @@ -14,8 +14,6 @@ import { ILegalValue } from 'interfaces/context'; import { ContextFormChip } from 'component/context/ContectFormChip/ContextFormChip'; import { ContextFormChipList } from 'component/context/ContectFormChip/ContextFormChipList'; import { ContextFieldUsage } from '../ContextFieldUsage/ContextFieldUsage'; -import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; -import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; interface IContextForm { contextName: string; @@ -104,7 +102,6 @@ export const ContextForm: React.FC = ({ const [value, setValue] = useState(''); const [valueDesc, setValueDesc] = useState(''); const [valueFocused, setValueFocused] = useState(false); - const { uiConfig } = useUiConfig(); const isMissingValue = valueDesc.trim() && !value.trim(); diff --git a/frontend/src/component/context/ContextList/ContextList/ContextList.tsx b/frontend/src/component/context/ContextList/ContextList/ContextList.tsx index 71cebf0d81..fb7c805492 100644 --- a/frontend/src/component/context/ContextList/ContextList/ContextList.tsx +++ b/frontend/src/component/context/ContextList/ContextList/ContextList.tsx @@ -24,7 +24,6 @@ import { ContextActionsCell } from '../ContextActionsCell'; import { Adjust } from '@mui/icons-material'; import { IconCell } from 'component/common/Table/cells/IconCell/IconCell'; import { Search } from 'component/common/Search/Search'; -import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import { UsedInCell } from '../UsedInCell'; const ContextList: VFC = () => { @@ -32,7 +31,6 @@ const ContextList: VFC = () => { const [name, setName] = useState(); const { context, refetchUnleashContext, loading } = useUnleashContext(); const { removeContext } = useContextsApi(); - const { uiConfig } = useUiConfig(); const { setToastData, setToastApiError } = useToast(); const data = useMemo(() => { diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/AddFromTemplateCard/AddFromTemplateCard.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/AddFromTemplateCard/AddFromTemplateCard.tsx deleted file mode 100644 index 9fe26d88a4..0000000000 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/AddFromTemplateCard/AddFromTemplateCard.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { ElementType, FC } from 'react'; -import { Card, CardContent, Typography, styled, Box } from '@mui/material'; -import { ChangeRequestDialogue } from 'component/changeRequest/ChangeRequestConfirmDialog/ChangeRequestConfirmDialog'; -import useFeatureStrategyApi from 'hooks/api/actions/useFeatureStrategyApi/useFeatureStrategyApi'; -import useToast from 'hooks/useToast'; -import { AddStrategyMessage } from 'component/changeRequest/ChangeRequestConfirmDialog/ChangeRequestMessages/AddStrategyMessage'; -import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled'; -import { useChangeRequestAddStrategy } from 'hooks/useChangeRequestAddStrategy'; -import { formatUnknownError } from 'utils/formatUnknownError'; -import PermissionButton from 'component/common/PermissionButton/PermissionButton'; -import { CREATE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions'; -import { IFeatureStrategyPayload } from 'interfaces/strategy'; - -interface IAddFromTemplateCardProps { - title: string; - featureId: string; - projectId: string; - environmentId: string; - strategy: IFeatureStrategyPayload; - Icon: ElementType; - onAfterAddStrategy: () => void; -} - -const StyledCard = styled(Card)(({ theme }) => ({ - display: 'flex', - flexDirection: 'column', - borderRadius: theme.shape.borderRadiusMedium, -})); - -export const AddFromTemplateCard: FC = ({ - title, - children, - featureId, - projectId, - environmentId, - strategy, - Icon, - onAfterAddStrategy, -}) => { - const { addStrategyToFeature } = useFeatureStrategyApi(); - const { setToastApiError } = useToast(); - - const { isChangeRequestConfigured } = useChangeRequestsEnabled(projectId); - - const { - changeRequestDialogDetails, - onChangeRequestAddStrategy, - onChangeRequestAddStrategyConfirm, - onChangeRequestAddStrategyClose, - } = useChangeRequestAddStrategy(projectId, featureId, 'addStrategy'); - - const onStrategyAdd = async () => { - try { - if (isChangeRequestConfigured(environmentId)) { - onChangeRequestAddStrategy(environmentId, strategy); - } else { - await addStrategyToFeature( - projectId, - featureId, - environmentId, - strategy - ); - onAfterAddStrategy(); - } - } catch (error) { - setToastApiError(formatUnknownError(error)); - } - }; - - return ( - <> - - - - {title} - - - {children} - - - - - Use template - - - - - - } - /> - - ); -}; diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/FeatureStrategyEmpty.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/FeatureStrategyEmpty.tsx index 98d438d112..127035202b 100644 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/FeatureStrategyEmpty.tsx +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyEmpty/FeatureStrategyEmpty.tsx @@ -1,6 +1,5 @@ import { Link } from 'react-router-dom'; import { Box, styled } from '@mui/material'; -import { SectionSeparator } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/SectionSeparator/SectionSeparator'; import useFeatureStrategyApi from 'hooks/api/actions/useFeatureStrategyApi/useFeatureStrategyApi'; import useToast from 'hooks/useToast'; import { useFeature } from 'hooks/api/getters/useFeature/useFeature'; @@ -12,11 +11,7 @@ import { useChangeRequestAddStrategy } from 'hooks/useChangeRequestAddStrategy'; import { ChangeRequestDialogue } from 'component/changeRequest/ChangeRequestConfirmDialog/ChangeRequestConfirmDialog'; import { CopyStrategiesMessage } from 'component/changeRequest/ChangeRequestConfirmDialog/ChangeRequestMessages/CopyStrategiesMessage'; import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled'; -import { getFeatureStrategyIcon } from 'utils/strategyNames'; -import { AddFromTemplateCard } from './AddFromTemplateCard/AddFromTemplateCard'; import { FeatureStrategyMenu } from '../FeatureStrategyMenu/FeatureStrategyMenu'; -import { LegacyFeatureStrategyMenu } from '../FeatureStrategyMenu/LegacyFeatureStrategyMenu'; -import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; interface IFeatureStrategyEmptyProps { projectId: string; @@ -78,9 +73,6 @@ export const FeatureStrategyEmpty = ({ onChangeRequestAddStrategyClose, } = useChangeRequestAddStrategy(projectId, featureId, 'addStrategy'); - const { uiConfig } = useUiConfig(); - const strategySplittedButton = uiConfig?.flags?.strategySplittedButton; - const onAfterAddStrategy = (multiple = false) => { refetchFeature(); refetchFeatureImmutable(); @@ -171,26 +163,12 @@ export const FeatureStrategyEmpty = ({ justifyContent: 'center', }} > - - } - elseShow={ - - } + - - - - Or use a strategy template - - - - - The standard strategy is strictly on/off for - your entire userbase. - - - Roll out to a percentage of your userbase. - - - - } - /> ); diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/LegacyFeatureStrategyMenu.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/LegacyFeatureStrategyMenu.tsx deleted file mode 100644 index 13aada5ce6..0000000000 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/LegacyFeatureStrategyMenu.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React, { useState } from 'react'; -import PermissionButton, { - IPermissionButtonProps, -} from 'component/common/PermissionButton/PermissionButton'; -import { CREATE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions'; -import { Popover } from '@mui/material'; -import { FeatureStrategyMenuCards } from './FeatureStrategyMenuCards/FeatureStrategyMenuCards'; - -interface IFeatureStrategyMenuProps { - label: string; - projectId: string; - featureId: string; - environmentId: string; - variant?: IPermissionButtonProps['variant']; - matchWidth?: boolean; -} - -/** - * Remove when removing feature flag strategySplittedButton - * @deprecated - */ -export const LegacyFeatureStrategyMenu = ({ - label, - projectId, - featureId, - environmentId, - variant, - matchWidth, -}: IFeatureStrategyMenuProps) => { - const [anchor, setAnchor] = useState(); - const isPopoverOpen = Boolean(anchor); - const popoverId = isPopoverOpen ? 'FeatureStrategyMenuPopover' : undefined; - - const onClose = () => { - setAnchor(undefined); - }; - - const onClick = (event: React.SyntheticEvent) => { - setAnchor(event.currentTarget); - }; - - return ( -
event.stopPropagation()}> - - {label} - - - - -
- ); -}; diff --git a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx index d4b820ffeb..23727d4c3c 100644 --- a/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/FeatureOverviewEnvironment.tsx @@ -17,7 +17,6 @@ import EnvironmentAccordionBody from './EnvironmentAccordionBody/EnvironmentAcco import { EnvironmentFooter } from './EnvironmentFooter/EnvironmentFooter'; import FeatureOverviewEnvironmentMetrics from './FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics'; import { FeatureStrategyMenu } from 'component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenu'; -import { LegacyFeatureStrategyMenu } from 'component/feature/FeatureStrategy/FeatureStrategyMenu/LegacyFeatureStrategyMenu'; import { FEATURE_ENVIRONMENT_ACCORDION } from 'utils/testIds'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; import { FeatureStrategyIcons } from 'component/feature/FeatureStrategy/FeatureStrategyIcons/FeatureStrategyIcons'; @@ -106,19 +105,6 @@ const StyledStringTruncator = styled(StringTruncator)(({ theme }) => ({ }, })); -/** - * @deprecated - */ -const LegacyStyledButtonContainer = styled('div')(({ theme }) => ({ - display: 'flex', - alignItems: 'center', - marginLeft: '1.8rem', - [theme.breakpoints.down(560)]: { - flexDirection: 'column', - marginLeft: '0', - }, -})); - const StyledButtonContainer = styled('div')(({ theme }) => ({ display: 'flex', alignItems: 'center', @@ -138,8 +124,6 @@ const FeatureOverviewEnvironment = ({ const { metrics } = useFeatureMetrics(projectId, featureId); const { feature } = useFeature(projectId, featureId); const { value: globalStore } = useGlobalLocalStorage(); - const { uiConfig } = useUiConfig(); - const strategySplittedButton = uiConfig?.flags?.strategySplittedButton; const featureMetrics = getFeatureMetrics(feature?.environments, metrics); const environmentMetric = featureMetrics.find( @@ -189,42 +173,21 @@ const FeatureOverviewEnvironment = ({ } /> - - - - - } - elseShow={ - - - - - } - /> + + + + - - } - elseShow={ - - } + { const projectId = useOptionalPathParam('projectId'); const { segments, loading } = useSegments(); - const { uiConfig } = useUiConfig(); const isSmallScreen = useMediaQuery(theme.breakpoints.down('md')); const [initialState] = useState({ sortBy: [{ id: 'createdAt' }], diff --git a/frontend/src/interfaces/uiConfig.ts b/frontend/src/interfaces/uiConfig.ts index 33848a4a99..ac620831d4 100644 --- a/frontend/src/interfaces/uiConfig.ts +++ b/frontend/src/interfaces/uiConfig.ts @@ -51,7 +51,6 @@ export interface IFlags { disableNotifications?: boolean; advancedPlayground?: boolean; customRootRoles?: boolean; - strategySplittedButton?: boolean; strategyVariant?: boolean; newProjectLayout?: boolean; } diff --git a/frontend/src/utils/routePathHelpers.ts b/frontend/src/utils/routePathHelpers.ts index 76c989ec0f..24e1b856fd 100644 --- a/frontend/src/utils/routePathHelpers.ts +++ b/frontend/src/utils/routePathHelpers.ts @@ -1,5 +1,3 @@ -import useUiConfig from '../hooks/api/getters/useUiConfig/useUiConfig'; - export const getTogglePath = (projectId: string, featureToggleName: string) => { return `/projects/${projectId}/features/${featureToggleName}`; }; diff --git a/src/lib/__snapshots__/create-config.test.ts.snap b/src/lib/__snapshots__/create-config.test.ts.snap index 4a10893ac4..3403c76391 100644 --- a/src/lib/__snapshots__/create-config.test.ts.snap +++ b/src/lib/__snapshots__/create-config.test.ts.snap @@ -95,7 +95,6 @@ exports[`should create default config 1`] = ` "proPlanAutoCharge": false, "responseTimeWithAppNameKillSwitch": false, "slackAppAddon": false, - "strategySplittedButton": false, "strategyVariant": false, "strictSchemaValidation": false, }, @@ -130,7 +129,6 @@ exports[`should create default config 1`] = ` "proPlanAutoCharge": false, "responseTimeWithAppNameKillSwitch": false, "slackAppAddon": false, - "strategySplittedButton": false, "strategyVariant": false, "strictSchemaValidation": false, }, diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index 7a80d8b4ba..c355cd105c 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -22,7 +22,6 @@ export type IFlagKey = | 'disableNotifications' | 'advancedPlayground' | 'customRootRoles' - | 'strategySplittedButton' | 'strategyVariant' | 'newProjectLayout' | 'slackAppAddon' @@ -83,10 +82,6 @@ const flags: IFlags = { cleanClientApi: parseEnvVarBoolean(process.env.CLEAN_CLIENT_API, false), migrationLock: parseEnvVarBoolean(process.env.MIGRATION_LOCK, false), demo: parseEnvVarBoolean(process.env.UNLEASH_DEMO, false), - strategySplittedButton: parseEnvVarBoolean( - process.env.UNLEASH_STRATEGY_SPLITTED_BUTTON, - false, - ), googleAuthEnabled: parseEnvVarBoolean( process.env.GOOGLE_AUTH_ENABLED, false, diff --git a/src/server-dev.ts b/src/server-dev.ts index ebed002237..447a6f53db 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -38,7 +38,6 @@ process.nextTick(async () => { anonymiseEventLog: false, responseTimeWithAppNameKillSwitch: false, advancedPlayground: true, - strategySplittedButton: true, strategyVariant: true, newProjectLayout: true, emitPotentiallyStaleEvents: true,