import { useEffect, useState } from 'react'; import ConditionallyRender from '../../common/ConditionallyRender'; import { useStyles } from './ProjectEnvironment.styles'; import useLoading from '../../../hooks/useLoading'; import PageContent from '../../common/PageContent'; import HeaderTitle from '../../common/HeaderTitle'; import { UPDATE_PROJECT } from '../../providers/AccessProvider/permissions'; import ApiError from '../../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 '@material-ui/core'; import useProjectApi from '../../../hooks/api/actions/useProjectApi/useProjectApi'; import EnvironmentDisableConfirm from './EnvironmentDisableConfirm/EnvironmentDisableConfirm'; import { Link } from 'react-router-dom'; import { Alert } from '@material-ui/lab'; import PermissionSwitch from '../../common/PermissionSwitch/PermissionSwitch'; import { IProjectEnvironment } from '../../../interfaces/environments'; import { getEnabledEnvs } from './helpers'; import StringTruncator from 'component/common/StringTruncator/StringTruncator'; import { useCommonStyles } from 'common.styles'; interface ProjectEnvironmentListProps { projectId: string; } const ProjectEnvironmentList = ({ projectId }: ProjectEnvironmentListProps) => { // api state const [envs, setEnvs] = useState([]); const { setToastData, setToastApiError } = useToast(); const { uiConfig } = useUiConfig(); const { environments, loading, error, refetch: refetchEnvs, } = useEnvironments(); const { project, refetch: refetchProject } = useProject(projectId); const { removeEnvironmentFromProject, addEnvironmentToProject } = useProjectApi(); const commonStyles = useCommonStyles(); // local state const [selectedEnv, setSelectedEnv] = useState(); const [confirmName, setConfirmName] = useState(''); const ref = useLoading(loading); const styles = useStyles(); useEffect(() => { const envs = environments.map(e => ({ name: e.name, enabled: project?.environments.includes(e.name), })); setEnvs(envs); }, [environments, project?.environments]); const refetch = () => { refetchEnvs(); 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;