import { useEffect, useState } from 'react'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { useStyles } from './ProjectEnvironment.styles'; import useLoading from 'hooks/useLoading'; import { PageContent } from 'component/common/PageContent/PageContent'; import { PageHeader } from 'component/common/PageHeader/PageHeader'; import { UPDATE_PROJECT } from 'component/providers/AccessProvider/permissions'; import ApiError from 'component/common/ApiError/ApiError'; import useToast from 'hooks/useToast'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import { useEnvironments } from 'hooks/api/getters/useEnvironments/useEnvironments'; import useProject from 'hooks/api/getters/useProject/useProject'; import { FormControlLabel, FormGroup } from '@mui/material'; import useProjectApi from 'hooks/api/actions/useProjectApi/useProjectApi'; import EnvironmentDisableConfirm from './EnvironmentDisableConfirm/EnvironmentDisableConfirm'; import { Link } from 'react-router-dom'; import { Alert } from '@mui/material'; import PermissionSwitch from 'component/common/PermissionSwitch/PermissionSwitch'; import { IProjectEnvironment } from 'interfaces/environments'; import { getEnabledEnvs } from './helpers'; import StringTruncator from 'component/common/StringTruncator/StringTruncator'; import { useThemeStyles } from 'themes/themeStyles'; interface IProjectEnvironmentListProps { projectId: string; } const ProjectEnvironmentList = ({ projectId, }: IProjectEnvironmentListProps) => { // api state const [envs, setEnvs] = useState([]); const { setToastData, setToastApiError } = useToast(); const { uiConfig } = useUiConfig(); const { environments, loading, error, refetchEnvironments } = useEnvironments(); const { project, refetch: refetchProject } = useProject(projectId); const { removeEnvironmentFromProject, addEnvironmentToProject } = useProjectApi(); const { classes: themeStyles } = useThemeStyles(); // local state const [selectedEnv, setSelectedEnv] = useState(); const [confirmName, setConfirmName] = useState(''); const ref = useLoading(loading); const { classes: styles } = useStyles(); useEffect(() => { const envs = environments.map(e => ({ name: e.name, enabled: project?.environments.includes(e.name), })); setEnvs(envs); }, [environments, project?.environments]); const refetch = () => { refetchEnvironments(); refetchProject(); }; const renderError = () => { return ( ); }; const errorMsg = (enable: boolean): string => { return `Got an API error when trying to ${ enable ? 'enable' : 'disable' } the environment.`; }; const toggleEnv = async (env: IProjectEnvironment) => { if (env.enabled) { const enabledEnvs = getEnabledEnvs(envs); if (enabledEnvs > 1) { setSelectedEnv(env); return; } setToastData({ title: 'One environment must be active', text: 'You must always have at least one active environment per project', type: 'error', }); } else { try { await addEnvironmentToProject(projectId, env.name); setToastData({ title: 'Environment enabled', text: 'Environment successfully enabled. You can now use it to segment strategies in your feature toggles.', type: 'success', }); } catch (error) { setToastApiError(errorMsg(true)); } } refetch(); }; const handleDisableEnvironment = async () => { if (selectedEnv && confirmName === selectedEnv.name) { try { await removeEnvironmentFromProject(projectId, selectedEnv.name); setSelectedEnv(undefined); setConfirmName(''); setToastData({ title: 'Environment disabled', text: 'Environment successfully disabled.', type: 'success', }); } catch (e) { setToastApiError(errorMsg(false)); } refetch(); } }; const handleCancelDisableEnvironment = () => { setSelectedEnv(undefined); setConfirmName(''); }; const genLabel = (env: IProjectEnvironment) => (
{/* This is ugly - but regular {" "} doesn't work here*/}

  environment is{' '} {env.enabled ? 'enabled' : 'disabled'}

); const renderEnvironments = () => { return ( {envs.map(env => ( toggleEnv(env)} /> } /> ))} ); }; return (
} > Important! In order for your application to retrieve configured activation strategies for a specific environment, the application
must use an environment specific API key. You can look up the environment-specific API keys here.

Your administrator can configure an environment-specific API key to be used in the SDK. If you are an administrator you can{' '} create a new API key.
No environments available.
} elseShow={renderEnvironments()} /> } elseShow={ This feature has not been Unleashed for you yet. } /> ); }; export default ProjectEnvironmentList;