groupListBody.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import {IndexedMembersByProject} from 'sentry/actionCreators/members';
  2. import LoadingError from 'sentry/components/loadingError';
  3. import LoadingIndicator from 'sentry/components/loadingIndicator';
  4. import {PanelBody} from 'sentry/components/panels';
  5. import IssuesReplayCountProvider from 'sentry/components/replays/issuesReplayCountProvider';
  6. import StreamGroup from 'sentry/components/stream/group';
  7. import GroupStore from 'sentry/stores/groupStore';
  8. import {Group} from 'sentry/types';
  9. import theme from 'sentry/utils/theme';
  10. import useApi from 'sentry/utils/useApi';
  11. import useMedia from 'sentry/utils/useMedia';
  12. import useOrganization from 'sentry/utils/useOrganization';
  13. import NoGroupsHandler from './noGroupsHandler';
  14. import {IssueSortOptions} from './utils';
  15. type GroupListBodyProps = {
  16. displayReprocessingLayout: boolean;
  17. error: string | null;
  18. groupIds: string[];
  19. groupStatsPeriod: string;
  20. isSavedSearchesOpen: boolean;
  21. loading: boolean;
  22. memberList: IndexedMembersByProject;
  23. query: string;
  24. refetchGroups: () => void;
  25. selectedProjectIds: number[];
  26. sort: string;
  27. };
  28. type GroupListProps = {
  29. displayReprocessingLayout: boolean;
  30. groupIds: string[];
  31. groupStatsPeriod: string;
  32. isSavedSearchesOpen: boolean;
  33. memberList: IndexedMembersByProject;
  34. query: string;
  35. sort: string;
  36. };
  37. function GroupListBody({
  38. groupIds,
  39. memberList,
  40. query,
  41. sort,
  42. displayReprocessingLayout,
  43. groupStatsPeriod,
  44. loading,
  45. error,
  46. refetchGroups,
  47. selectedProjectIds,
  48. isSavedSearchesOpen,
  49. }: GroupListBodyProps) {
  50. const api = useApi();
  51. const organization = useOrganization();
  52. if (loading) {
  53. return <LoadingIndicator hideMessage />;
  54. }
  55. if (error) {
  56. return <LoadingError message={error} onRetry={refetchGroups} />;
  57. }
  58. if (!groupIds.length) {
  59. return (
  60. <NoGroupsHandler
  61. api={api}
  62. organization={organization}
  63. query={query}
  64. selectedProjectIds={selectedProjectIds}
  65. groupIds={groupIds}
  66. />
  67. );
  68. }
  69. return (
  70. <IssuesReplayCountProvider groupIds={groupIds}>
  71. <GroupList
  72. groupIds={groupIds}
  73. memberList={memberList}
  74. query={query}
  75. sort={sort}
  76. displayReprocessingLayout={displayReprocessingLayout}
  77. groupStatsPeriod={groupStatsPeriod}
  78. isSavedSearchesOpen={isSavedSearchesOpen}
  79. />
  80. </IssuesReplayCountProvider>
  81. );
  82. }
  83. function GroupList({
  84. groupIds,
  85. memberList,
  86. query,
  87. sort,
  88. displayReprocessingLayout,
  89. groupStatsPeriod,
  90. isSavedSearchesOpen,
  91. }: GroupListProps) {
  92. const topIssue = groupIds[0];
  93. const showInboxTime = sort === IssueSortOptions.INBOX;
  94. const canSelect = !useMedia(
  95. `(max-width: ${
  96. isSavedSearchesOpen ? theme.breakpoints.large : theme.breakpoints.small
  97. })`
  98. );
  99. return (
  100. <PanelBody>
  101. {groupIds.map((id, index) => {
  102. const hasGuideAnchor = id === topIssue;
  103. const group = GroupStore.get(id) as Group | undefined;
  104. return (
  105. <StreamGroup
  106. index={index}
  107. key={id}
  108. id={id}
  109. statsPeriod={groupStatsPeriod}
  110. query={query}
  111. hasGuideAnchor={hasGuideAnchor}
  112. memberList={group?.project ? memberList[group.project.slug] : undefined}
  113. displayReprocessingLayout={displayReprocessingLayout}
  114. useFilteredStats
  115. showInboxTime={showInboxTime}
  116. canSelect={canSelect}
  117. narrowGroups={isSavedSearchesOpen}
  118. />
  119. );
  120. })}
  121. </PanelBody>
  122. );
  123. }
  124. export default GroupListBody;