import { Link } from 'react-router-dom'; import { Box } 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'; import { FeatureStrategyMenu } from '../FeatureStrategyMenu/FeatureStrategyMenu'; import { PresetCard } from './PresetCard/PresetCard'; import { useStyles } from './FeatureStrategyEmpty.styles'; import { formatUnknownError } from 'utils/formatUnknownError'; import { useFeatureImmutable } from 'hooks/api/getters/useFeature/useFeatureImmutable'; import { getFeatureStrategyIcon } from 'utils/strategyNames'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { CopyButton } from './CopyButton/CopyButton'; interface IFeatureStrategyEmptyProps { projectId: string; featureId: string; environmentId: string; } export const FeatureStrategyEmpty = ({ projectId, featureId, environmentId, }: IFeatureStrategyEmptyProps) => { const { classes: styles } = useStyles(); const { addStrategyToFeature } = useFeatureStrategyApi(); const { setToastData, setToastApiError } = useToast(); const { refetchFeature } = useFeature(projectId, featureId); const { refetchFeature: refetchFeatureImmutable } = useFeatureImmutable( projectId, featureId ); const { feature } = useFeature(projectId, featureId); const otherAvailableEnvironments = feature?.environments.filter( environment => environment.name !== environmentId && environment.strategies && environment.strategies.length > 0 ); const onAfterAddStrategy = (multiple = false) => { refetchFeature(); refetchFeatureImmutable(); setToastData({ title: multiple ? 'Strategies created' : 'Strategy created', text: multiple ? 'Successfully copied from another environment' : 'Successfully created strategy', type: 'success', }); }; const onCopyStrategies = async (fromEnvironmentName: string) => { const strategies = otherAvailableEnvironments?.find( environment => environment.name === fromEnvironmentName )?.strategies || []; try { await Promise.all( strategies.map(strategy => { const { id, ...strategyCopy } = { ...strategy, environment: environmentId, }; return addStrategyToFeature( projectId, featureId, environmentId, strategyCopy ); }) ); onAfterAddStrategy(true); } catch (error) { setToastApiError(formatUnknownError(error)); } }; const onAddSimpleStrategy = async () => { try { await addStrategyToFeature(projectId, featureId, environmentId, { name: 'default', parameters: {}, constraints: [], }); onAfterAddStrategy(); } catch (error) { setToastApiError(formatUnknownError(error)); } }; const onAddGradualRolloutStrategy = async () => { try { await addStrategyToFeature(projectId, featureId, environmentId, { name: 'flexibleRollout', parameters: { rollout: '50', stickiness: 'default', groupId: feature.name, }, constraints: [], }); onAfterAddStrategy(); } catch (error) { setToastApiError(formatUnknownError(error)); } }; const canCopyFromOtherEnvironment = otherAvailableEnvironments && otherAvailableEnvironments.length > 0; return (
You have not defined any strategies yet.

Strategies added in this environment will only be executed if the SDK is using an{' '} API key configured for this environment.

environment.name )} onClick={onCopyStrategies} /> } /> Or use a strategy template The standard strategy is strictly on/off for your entire userbase. Roll out to a percentage of your userbase.
); };