import { Tab, Tabs, useMediaQuery } from '@material-ui/core'; import React, { useState } from 'react'; import { Archive, FileCopy, Label, WatchLater } from '@material-ui/icons'; import { Link, Route, useHistory, useParams, Switch } from 'react-router-dom'; import useFeatureApi from '../../../hooks/api/actions/useFeatureApi/useFeatureApi'; import { useFeature } from 'hooks/api/getters/useFeature/useFeature'; import useProject from '../../../hooks/api/getters/useProject/useProject'; import useTabs from '../../../hooks/useTabs'; import useToast from '../../../hooks/useToast'; import { IFeatureViewParams } from 'interfaces/params'; import { CREATE_FEATURE, DELETE_FEATURE, UPDATE_FEATURE, } from '../../providers/AccessProvider/permissions'; import Dialogue from '../../common/Dialogue'; import PermissionIconButton from '../../common/PermissionIconButton/PermissionIconButton'; import FeatureLog from './FeatureLog/FeatureLog'; import FeatureOverview from './FeatureOverview/FeatureOverview'; import FeatureVariants from './FeatureVariants/FeatureVariants'; import { FeatureMetrics } from './FeatureMetrics/FeatureMetrics'; import { useStyles } from './FeatureView.styles'; import { FeatureSettings } from './FeatureSettings/FeatureSettings'; import useLoading from '../../../hooks/useLoading'; import ConditionallyRender from '../../common/ConditionallyRender'; import StaleDialog from './FeatureOverview/StaleDialog/StaleDialog'; import AddTagDialog from './FeatureOverview/AddTagDialog/AddTagDialog'; import StatusChip from '../../common/StatusChip/StatusChip'; import { formatUnknownError } from 'utils/formatUnknownError'; import { FeatureNotFound } from 'component/feature/FeatureView/FeatureNotFound/FeatureNotFound'; export const FeatureView = () => { const { projectId, featureId } = useParams(); const { refetch: projectRefetch } = useProject(projectId); const [openTagDialog, setOpenTagDialog] = useState(false); const { a11yProps } = useTabs(0); const { archiveFeatureToggle } = useFeatureApi(); const { setToastData, setToastApiError } = useToast(); const [showDelDialog, setShowDelDialog] = useState(false); const [openStaleDialog, setOpenStaleDialog] = useState(false); const smallScreen = useMediaQuery(`(max-width:${500}px)`); const { feature, loading, error, status } = useFeature( projectId, featureId ); const styles = useStyles(); const history = useHistory(); const ref = useLoading(loading); const basePath = `/projects/${projectId}/features/${featureId}`; const archiveToggle = async () => { try { await archiveFeatureToggle(projectId, featureId); setToastData({ text: 'Your feature toggle has been archived', type: 'success', title: 'Feature archived', }); setShowDelDialog(false); projectRefetch(); history.push(`/projects/${projectId}`); } catch (error: unknown) { setToastApiError(formatUnknownError(error)); setShowDelDialog(false); } }; const handleCancel = () => setShowDelDialog(false); const tabData = [ { title: 'Overview', path: `${basePath}`, name: 'overview', }, { title: 'Metrics', path: `${basePath}/metrics`, name: 'Metrics', }, { title: 'Variants', path: `${basePath}/variants`, name: 'Variants' }, { title: 'Settings', path: `${basePath}/settings`, name: 'Settings' }, { title: 'Event log', path: `${basePath}/logs`, name: 'Event log', }, ]; const activeTab = tabData.find(tab => tab.path === history.location.pathname) ?? tabData[0]; const renderTabs = () => { return tabData.map((tab, index) => { return ( { history.push(tab.path); }} className={styles.tabButton} /> ); }); }; if (status === 404) { return ; } return (

{feature.name}{' '}

} />
setShowDelDialog(true)} > setOpenStaleDialog(true)} permission={UPDATE_FEATURE} projectId={projectId} data-loading > setOpenTagDialog(true)} permission={UPDATE_FEATURE} projectId={projectId} data-loading >
{renderTabs()}
archiveToggle()} open={showDelDialog} onClose={handleCancel} primaryButtonText="Archive toggle" secondaryButtonText="Cancel" title="Archive feature toggle" > Are you sure you want to archive this feature toggle?
} /> ); };