useReleases.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {Release} from 'sentry/types';
  2. import {useApiQuery} from 'sentry/utils/queryClient';
  3. import {decodeScalar} from 'sentry/utils/queryString';
  4. import {useLocation} from 'sentry/utils/useLocation';
  5. import useOrganization from 'sentry/utils/useOrganization';
  6. import usePageFilters from 'sentry/utils/usePageFilters';
  7. export function useReleases(searchTerm?: string) {
  8. const organization = useOrganization();
  9. const {selection} = usePageFilters();
  10. const {environments, projects} = selection;
  11. const result = useApiQuery<Release[]>(
  12. [
  13. `/organizations/${organization.slug}/releases/`,
  14. {
  15. query: {
  16. project: projects,
  17. per_page: 50,
  18. environment: environments,
  19. query: searchTerm,
  20. health: 1,
  21. sort: 'sessions',
  22. flatten: 1,
  23. },
  24. },
  25. ],
  26. {staleTime: Infinity}
  27. );
  28. const releaseStats: {
  29. dateCreated: string;
  30. platform: string;
  31. projectSlug: string;
  32. 'sum(session)': number | undefined;
  33. version: string;
  34. }[] =
  35. result.data && result.data.length
  36. ? result.data.map(release => {
  37. const releaseVersion = release.version;
  38. const releaseProject = release.projects[0];
  39. const dateCreated = release.dateCreated;
  40. const projectSlug = releaseProject.slug;
  41. const platform = releaseProject.platform;
  42. const sessionCount = releaseProject.healthData?.totalSessions;
  43. return {
  44. projectSlug,
  45. 'sum(session)': sessionCount,
  46. platform,
  47. dateCreated,
  48. version: releaseVersion,
  49. };
  50. })
  51. : [];
  52. return {
  53. ...result,
  54. data: releaseStats,
  55. };
  56. }
  57. export function useReleaseSelection() {
  58. const location = useLocation();
  59. const {data: releases, isLoading} = useReleases();
  60. const primaryRelease =
  61. decodeScalar(location.query.primaryRelease) ?? releases?.[0]?.version ?? undefined;
  62. const secondaryRelease =
  63. decodeScalar(location.query.secondaryRelease) ??
  64. (releases && releases.length > 1 ? releases?.[1]?.version : undefined);
  65. return {primaryRelease, secondaryRelease, isLoading};
  66. }