Files
2024-02-15 17:01:50 +00:00

127 lines
3.2 KiB
TypeScript

import type {IndexedMembersByProject} from 'sentry/actionCreators/members';
import LoadingError from 'sentry/components/loadingError';
import LoadingIndicator from 'sentry/components/loadingIndicator';
import PanelBody from 'sentry/components/panels/panelBody';
import StreamGroup from 'sentry/components/stream/group';
import GroupStore from 'sentry/stores/groupStore';
import type {Group} from 'sentry/types';
import theme from 'sentry/utils/theme';
import useApi from 'sentry/utils/useApi';
import useMedia from 'sentry/utils/useMedia';
import useOrganization from 'sentry/utils/useOrganization';
import {useSyncedLocalStorageState} from 'sentry/utils/useSyncedLocalStorageState';
import NoGroupsHandler from './noGroupsHandler';
import {SAVED_SEARCHES_SIDEBAR_OPEN_LOCALSTORAGE_KEY} from './utils';
type GroupListBodyProps = {
displayReprocessingLayout: boolean;
error: string | null;
groupIds: string[];
groupStatsPeriod: string;
loading: boolean;
memberList: IndexedMembersByProject;
query: string;
refetchGroups: () => void;
selectedProjectIds: number[];
};
type GroupListProps = {
displayReprocessingLayout: boolean;
groupIds: string[];
groupStatsPeriod: string;
memberList: IndexedMembersByProject;
query: string;
};
function GroupListBody({
groupIds,
memberList,
query,
displayReprocessingLayout,
groupStatsPeriod,
loading,
error,
refetchGroups,
selectedProjectIds,
}: GroupListBodyProps) {
const api = useApi();
const organization = useOrganization();
if (loading) {
return <LoadingIndicator hideMessage />;
}
if (error) {
return <LoadingError message={error} onRetry={refetchGroups} />;
}
if (!groupIds.length) {
return (
<NoGroupsHandler
api={api}
organization={organization}
query={query}
selectedProjectIds={selectedProjectIds}
groupIds={groupIds}
/>
);
}
return (
<GroupList
groupIds={groupIds}
memberList={memberList}
query={query}
displayReprocessingLayout={displayReprocessingLayout}
groupStatsPeriod={groupStatsPeriod}
/>
);
}
function GroupList({
groupIds,
memberList,
query,
displayReprocessingLayout,
groupStatsPeriod,
}: GroupListProps) {
const [isSavedSearchesOpen] = useSyncedLocalStorageState(
SAVED_SEARCHES_SIDEBAR_OPEN_LOCALSTORAGE_KEY,
false
);
const topIssue = groupIds[0];
const canSelect = !useMedia(
`(max-width: ${
isSavedSearchesOpen ? theme.breakpoints.large : theme.breakpoints.small
})`
);
return (
<PanelBody>
{groupIds.map((id, index) => {
const hasGuideAnchor = id === topIssue;
const group = GroupStore.get(id) as Group | undefined;
return (
<StreamGroup
index={index}
key={id}
id={id}
statsPeriod={groupStatsPeriod}
query={query}
hasGuideAnchor={hasGuideAnchor}
memberList={group?.project ? memberList[group.project.slug] : undefined}
displayReprocessingLayout={displayReprocessingLayout}
useFilteredStats
canSelect={canSelect}
narrowGroups={isSavedSearchesOpen}
/>
);
})}
</PanelBody>
);
}
export default GroupListBody;