import React, { useEffect, useLayoutEffect, useState } from 'react'; import classnames from 'classnames'; import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import { Paper, Typography, Button, Switch, LinearProgress } from '@material-ui/core'; import HistoryComponent from '../../history/history-list-toggle-container'; import MetricComponent from '../view/metric-container'; import UpdateStrategies from '../view/update-strategies-container'; import EditVariants from '../variant/update-variant-container'; import FeatureTypeSelect from '../feature-type-select-container'; import ProjectSelect from '../project-select-container'; import UpdateDescriptionComponent from '../view/update-description-component'; import { CREATE_FEATURE, DELETE_FEATURE, UPDATE_FEATURE } from '../../../permissions'; import StatusComponent from '../status-component'; import FeatureTagComponent from '../feature-tag-component'; import StatusUpdateComponent from '../view/status-update-component'; import AddTagDialog from '../add-tag-dialog-container'; import ConditionallyRender from '../../common/ConditionallyRender/ConditionallyRender'; import TabNav from '../../common/TabNav'; import { scrollToTop } from '../../common/util'; import styles from './FeatureView.module.scss'; import ConfirmDialogue from '../../common/Dialogue'; import { useCommonStyles } from '../../../common.styles'; const FeatureView = ({ activeTab, featureToggleName, features, toggleFeature, setStale, removeFeatureToggle, revive, fetchArchive, fetchFeatureToggles, editFeatureToggle, featureToggle, history, hasPermission, untagFeature, featureTags, fetchTags, tagTypes, }) => { const isFeatureView = !!fetchFeatureToggles; const [delDialog, setDelDialog] = useState(false); const commonStyles = useCommonStyles(); useEffect(() => { scrollToTop(); fetchTags(featureToggleName); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useLayoutEffect(() => { if (features.length === 0) { if (isFeatureView) { fetchFeatureToggles(); } else { fetchArchive(); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [features]); const getTabComponent = key => { switch (key) { case 'activation': if (isFeatureView && hasPermission(UPDATE_FEATURE)) { return ; } return ( ); case 'metrics': return ; case 'variants': return ( ); case 'log': return ; default: return null } }; const getTabData = () => [ { label: 'Activation', component: getTabComponent('activation'), name: 'strategies', path: `/features/strategies/${featureToggleName}`, }, { label: 'Metrics', component: getTabComponent('metrics'), name: 'metrics', path: `/features/metrics/${featureToggleName}`, }, { label: 'Variants', component: getTabComponent('variants'), name: 'variants', path: `/features/variants/${featureToggleName}`, }, { label: 'Log', component: getTabComponent('log'), name: 'logs', path: `/features/logs/${featureToggleName}`, }, ]; if (!featureToggle) { if (features.length === 0) { return ; } return ( Could not find the toggle{' '} {featureToggleName} } elseShow={featureToggleName} /> ); } const removeToggle = () => { removeFeatureToggle(featureToggle.name); history.push('/features'); }; const reviveToggle = () => { revive(featureToggle.name); history.push('/features'); }; const updateDescription = description => { let feature = { ...featureToggle, description }; if (Array.isArray(feature.strategies)) { feature.strategies.forEach(s => { delete s.id; }); } editFeatureToggle(feature); }; const updateType = evt => { evt.preventDefault(); const type = evt.target.value; let feature = { ...featureToggle, type }; if (Array.isArray(feature.strategies)) { feature.strategies.forEach(s => { delete s.id; }); } editFeatureToggle(feature); }; const updateProject = evt => { evt.preventDefault(); const project = evt.target.value; let feature = { ...featureToggle, project }; if (Array.isArray(feature.strategies)) { feature.strategies.forEach(s => { delete s.id; }); } editFeatureToggle(feature); }; const updateStale = stale => { setStale(stale, featureToggleName); }; const tabs = getTabData(); const findActiveTab = activeTab => tabs.findIndex(tab => tab.name === activeTab); return (
{featureToggle.name}
 
toggleFeature(!featureToggle.enabled, featureToggle.name)} /> {featureToggle.enabled ? 'Enabled' : 'Disabled'} } elseShow={ <> {featureToggle.enabled ? 'Enabled' : 'Disabled'} } />
} elseShow={ } />
{ setDelDialog(false); removeToggle(); }} />
); }; FeatureView.propTypes = { activeTab: PropTypes.string.isRequired, featureToggleName: PropTypes.string.isRequired, features: PropTypes.array.isRequired, toggleFeature: PropTypes.func, setStale: PropTypes.func, removeFeatureToggle: PropTypes.func, revive: PropTypes.func, fetchArchive: PropTypes.func, fetchFeatureToggles: PropTypes.func, fetchFeatureToggle: PropTypes.func, editFeatureToggle: PropTypes.func, featureToggle: PropTypes.object, history: PropTypes.object.isRequired, hasPermission: PropTypes.func.isRequired, fetchTags: PropTypes.func, untagFeature: PropTypes.func, featureTags: PropTypes.array, tagTypes: PropTypes.array, }; export default FeatureView;