releaseActivity.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import {useContext, useEffect} from 'react';
  2. import styled from '@emotion/styled';
  3. import * as Layout from 'sentry/components/layouts/thirds';
  4. import GroupStore from 'sentry/stores/groupStore';
  5. import space from 'sentry/styles/space';
  6. import useApiRequests from 'sentry/utils/useApiRequests';
  7. import {useParams} from 'sentry/utils/useParams';
  8. import {ReleaseContext} from '../index';
  9. import {ReleaseActivityItem, ReleaseActivityWaiting} from './releaseActivityItems';
  10. import {ReleaseActivity, ReleaseActivityIssue, ReleaseActivityType} from './types';
  11. export function ReleaseActivityList() {
  12. const params = useParams();
  13. const {project} = useContext(ReleaseContext);
  14. const {data, renderComponent} = useApiRequests({
  15. endpoints: [
  16. [
  17. 'activities',
  18. `/projects/${params.orgId}/${project.slug}/releases/${params.release}/activity/`,
  19. ],
  20. ],
  21. });
  22. useEffect(() => {
  23. const groups = (data.activities as ReleaseActivity[] | null)
  24. ?.filter(
  25. (activity): activity is ReleaseActivityIssue =>
  26. activity.type === ReleaseActivityType.ISSUE
  27. )
  28. .map(activity => activity.data.group);
  29. // Add groups to the store for displaying via EventOrGroupHeader
  30. GroupStore.add(groups ?? []);
  31. return () => {
  32. GroupStore.reset();
  33. };
  34. }, [data.activities]);
  35. const activities: ReleaseActivity[] = data.activities ?? [];
  36. const isFinished = activities.some(
  37. activity => activity.type === ReleaseActivityType.FINISHED
  38. );
  39. return renderComponent(
  40. <Layout.Body>
  41. <Layout.Main fullWidth>
  42. <ActivityList>
  43. {activities.map((activity, idx) => (
  44. <ReleaseActivityItem key={idx} activity={activity} />
  45. ))}
  46. {isFinished ? null : <ReleaseActivityWaiting />}
  47. </ActivityList>
  48. </Layout.Main>
  49. </Layout.Body>
  50. );
  51. }
  52. const ActivityList = styled('div')`
  53. display: flex;
  54. flex-direction: column;
  55. gap: ${space(4)};
  56. `;