import {useEffect, useMemo} from 'react';
import styled from '@emotion/styled';
import GuideAnchor from 'sentry/components/assistant/guideAnchor';
import * as Layout from 'sentry/components/layouts/thirds';
import LoadingError from 'sentry/components/loadingError';
import LoadingIndicator from 'sentry/components/loadingIndicator';
import NoProjectMessage from 'sentry/components/noProjectMessage';
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container';
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
import PanelTable from 'sentry/components/panels/panelTable';
// import {ALL_ACCESS_PROJECTS} from 'sentry/constants/pageFilters';
import {t} from 'sentry/locale';
// import ConfigStore from 'sentry/stores/configStore';
import {space} from 'sentry/styles/space';
// import {Project} from 'sentry/types';
import useOrganization from 'sentry/utils/useOrganization';
import usePageFilters from 'sentry/utils/usePageFilters';
// import useProjects from 'sentry/utils/useProjects';
import useRouter from 'sentry/utils/useRouter';
import Header from '../components/header';
import {Threshold} from '../utils/types';
import useFetchThresholdsListData from '../utils/useFetchThresholdsListData';
import {ThresholdGroupRow} from './thresholdGroupRow';
type Props = {};
function ReleaseThresholdList({}: Props) {
const router = useRouter();
const organization = useOrganization();
useEffect(() => {
const hasV2ReleaseUIEnabled = organization.features.includes('release-ui-v2');
if (!hasV2ReleaseUIEnabled) {
router.replace('/releases/');
}
}, [router, organization]);
// const {projects} = useProjects();
const {selection} = usePageFilters();
const {
data: thresholds = [],
error,
isLoading,
isError,
refetch,
} = useFetchThresholdsListData({
selectedProjectIds: selection.projects,
});
// const _getAllSelectedProjects = (): Project[] => {
// return projects.filter(project =>
// selection.projects.some(id => String(id) === project.id || id === -1)
// );
// };
// const _getAllEnvironments = (): string[] => {
// const selectedProjects = selection.projects.map(id => String(id));
// const {user} = ConfigStore.getState();
// const allEnvSet = new Set(projects.flatMap(project => project.environments));
// // NOTE: mostly taken from environmentSelector.tsx
// const unSortedEnvs = new Set(
// projects.flatMap(project => {
// /**
// * Include environments from:
// * all projects if the user is a superuser
// * the requested projects
// * all member projects if 'my projects' (empty list) is selected.
// * all projects if -1 is the only selected project.
// */
// if (
// (selectedProjects.length === 1 &&
// selectedProjects[0] === ALL_ACCESS_PROJECTS &&
// project.hasAccess) ||
// (selectedProjects.length === 0 && (project.isMember || user.isSuperuser)) ||
// selectedProjects.includes(project.id)
// ) {
// return project.environments;
// }
// return [];
// })
// );
// const envDiff = new Set([...allEnvSet].filter(x => !unSortedEnvs.has(x)));
// return Array.from(unSortedEnvs)
// .sort()
// .concat([...envDiff].sort());
// };
// NOTE: currently no way to filter for 'None' environments
const filteredThresholds = selection.environments.length
? thresholds.filter(
threshold => selection.environments.indexOf(threshold.environment.name) > -1
)
: thresholds;
const thresholdGroups: {[key: string]: {[key: string]: Threshold[]}} = useMemo(() => {
const byProj = {};
filteredThresholds.forEach(threshold => {
const projId = threshold.project.id;
if (!byProj[projId]) {
byProj[projId] = {};
}
const env = threshold.environment.name;
if (!byProj[projId][env]) {
byProj[projId][env] = [];
}
byProj[projId][env].push(threshold);
});
return byProj;
}, [filteredThresholds]);
if (isError) {
return ;
}
if (isLoading) {
return ;
}
return (
{thresholdGroups &&
Object.entries(thresholdGroups).map(([projId, byEnv]) => {
return Object.entries(byEnv).map(([envName, thresholdGroup]) => (
));
})}
);
}
export default ReleaseThresholdList;
const StyledPanelTable = styled(PanelTable)`
@media (min-width: ${p => p.theme.breakpoints.small}) {
overflow: initial;
}
grid-template-columns:
minmax(150px, 1fr) minmax(150px, 1fr) minmax(150px, 1fr) minmax(250px, 4fr)
auto;
white-space: nowrap;
font-size: ${p => p.theme.fontSizeMedium};
`;
const ReleaseThresholdsPageFilterBar = styled(PageFilterBar)`
margin-bottom: ${space(2)};
`;