import { useState } from 'react'; import { styled, Tab, Tabs, useMediaQuery } from '@mui/material'; import { Archive, FileCopy, Label, WatchLater } from '@mui/icons-material'; import { Link, Route, Routes, useLocation, useNavigate, } from 'react-router-dom'; import { useFeature } from 'hooks/api/getters/useFeature/useFeature'; import useProject from 'hooks/api/getters/useProject/useProject'; import { CREATE_FEATURE, DELETE_FEATURE, UPDATE_FEATURE, } from 'component/providers/AccessProvider/permissions'; import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton'; import FeatureLog from './FeatureLog/FeatureLog'; import FeatureOverview from './FeatureOverview/FeatureOverview'; import { FeatureEnvironmentVariants } from './FeatureVariants/FeatureEnvironmentVariants/FeatureEnvironmentVariants'; import { FeatureMetrics } from './FeatureMetrics/FeatureMetrics'; import { FeatureSettings } from './FeatureSettings/FeatureSettings'; import useLoading from 'hooks/useLoading'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { FeatureStaleDialog } from 'component/common/FeatureStaleDialog/FeatureStaleDialog'; import { ManageTagsDialog } from './FeatureOverview/ManageTagsDialog/ManageTagsDialog'; import { FeatureStatusChip } from 'component/common/FeatureStatusChip/FeatureStatusChip'; import { FeatureNotFound } from 'component/feature/FeatureView/FeatureNotFound/FeatureNotFound'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; import { FeatureArchiveDialog } from 'component/common/FeatureArchiveDialog/FeatureArchiveDialog'; import { useFavoriteFeaturesApi } from 'hooks/api/actions/useFavoriteFeaturesApi/useFavoriteFeaturesApi'; import { FavoriteIconButton } from 'component/common/FavoriteIconButton/FavoriteIconButton'; const StyledHeader = styled('div')(({ theme }) => ({ backgroundColor: theme.palette.background.paper, borderRadius: theme.shape.borderRadiusLarge, marginBottom: theme.spacing(2), })); const StyledInnerContainer = styled('div')(({ theme }) => ({ padding: theme.spacing(2, 4, 2, 2), display: 'flex', justifyContent: 'space-between', alignItems: 'center', [theme.breakpoints.down(500)]: { flexDirection: 'column', }, })); const StyledToggleInfoContainer = styled('div')({ display: 'flex', alignItems: 'center', }); const StyledFeatureViewHeader = styled('h1')(({ theme }) => ({ fontSize: theme.fontSizes.mainHeader, fontWeight: 'normal', display: 'flex', alignItems: 'center', wordBreak: 'break-all', })); const StyledToolbarContainer = styled('div')({ flexShrink: 0, display: 'flex', }); const StyledSeparator = styled('div')(({ theme }) => ({ width: '100%', backgroundColor: theme.palette.background.elevation2, height: '1px', })); const StyledTabContainer = styled('div')(({ theme }) => ({ padding: theme.spacing(0, 4), })); const StyledTabButton = styled(Tab)(({ theme }) => ({ textTransform: 'none', width: 'auto', fontSize: theme.fontSizes.bodySize, padding: '0 !important', [theme.breakpoints.up('md')]: { minWidth: 160, }, })); export const FeatureView = () => { const projectId = useRequiredPathParam('projectId'); const featureId = useRequiredPathParam('featureId'); const { refetch: projectRefetch } = useProject(projectId); const { favorite, unfavorite } = useFavoriteFeaturesApi(); const { refetchFeature } = useFeature(projectId, featureId); const [openTagDialog, setOpenTagDialog] = useState(false); 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 navigate = useNavigate(); const { pathname } = useLocation(); const ref = useLoading(loading); const basePath = `/projects/${projectId}/features/${featureId}`; 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 === pathname) ?? tabData[0]; const onFavorite = async () => { if (feature?.favorite) { await unfavorite(projectId, feature.name); } else { await favorite(projectId, feature.name); } refetchFeature(); }; if (status === 404) { return ; } if (error !== undefined) { return
; } return (
{feature.name}{' '} } /> setShowDelDialog(true)} > setOpenStaleDialog(true)} permission={UPDATE_FEATURE} projectId={projectId} tooltipProps={{ title: 'Toggle stale state', }} data-loading > setOpenTagDialog(true)} permission={UPDATE_FEATURE} projectId={projectId} tooltipProps={{ title: 'Add tag' }} data-loading > {tabData.map(tab => ( navigate(tab.path)} /> ))} } /> } /> } /> } /> } /> { projectRefetch(); navigate(`/projects/${projectId}`); }} onClose={() => setShowDelDialog(false)} projectId={projectId} featureIds={[featureId]} /> { setOpenStaleDialog(false); refetchFeature(); }} featureId={featureId} projectId={projectId} />
); };