import { useState, useEffect } 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'; interface ProjectEnvironmentListProps { projectId: string; } const ProjectEnvironmentList = ({ projectId }: ProjectEnvironmentListProps) => { // api state const [envs, setEnvs] = useState([]); const { toast, setToastData } = useToast(); const { uiConfig } = useUiConfig(); const { environments, loading, error, refetch: refetchEnvs, } = useEnvironments(); const { project, refetch: refetchProject } = useProject(projectId); const { removeEnvironmentFromProject, addEnvironmentToProject } = useProjectApi(); // 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: ProjectEnvironment) => { if (env.enabled) { const enabledEnvs = getEnabledEnvs(envs); if (enabledEnvs > 1) { setSelectedEnv(env); return; } setToastData({ text: 'You must always have at least one active environment per project', type: 'error', show: true, }); } else { try { await addEnvironmentToProject(projectId, env.name); setToastData({ text: 'Environment successfully enabled.', type: 'success', show: true, }); } catch (error) { setToastData({ text: errorMsg(true), type: 'error', show: true, }); } } refetch(); }; const handleDisableEnvironment = async () => { if (selectedEnv && confirmName === selectedEnv.name) { try { await removeEnvironmentFromProject(projectId, selectedEnv.name); setSelectedEnv(undefined); setConfirmName(''); setToastData({ text: 'Environment successfully disabled.', type: 'success', show: true, }); } catch (e) { setToastData({ text: errorMsg(false), type: 'error', show: true, }); } refetch(); } }; const handleCancelDisableEnvironment = () => { setSelectedEnv(undefined); setConfirmName(''); }; const genLabel = (env: ProjectEnvironment) => ( <> {env.name} 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. } /> {toast} ); }; export default ProjectEnvironmentList;