useReleases.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {NewQuery, Release} from 'sentry/types';
  2. import EventView from 'sentry/utils/discover/eventView';
  3. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  4. import {useApiQuery} from 'sentry/utils/queryClient';
  5. import {decodeScalar} from 'sentry/utils/queryString';
  6. import {useLocation} from 'sentry/utils/useLocation';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import usePageFilters from 'sentry/utils/usePageFilters';
  9. import {useTableQuery} from 'sentry/views/starfish/views/screens/screensTable';
  10. export function useReleases(searchTerm?: string) {
  11. const organization = useOrganization();
  12. const {selection} = usePageFilters();
  13. const {environments, projects} = selection;
  14. const releaseResults = useApiQuery<Release[]>(
  15. [
  16. `/organizations/${organization.slug}/releases/`,
  17. {
  18. query: {
  19. project: projects,
  20. per_page: 100,
  21. environment: environments,
  22. query: searchTerm,
  23. sort: 'date',
  24. },
  25. },
  26. ],
  27. {staleTime: Infinity}
  28. );
  29. const newQuery: NewQuery = {
  30. name: '',
  31. fields: ['release', 'count()'],
  32. query: `transaction.op:ui.load ${searchTerm ? `release:*${searchTerm}*` : ''}`,
  33. dataset: DiscoverDatasets.METRICS,
  34. version: 2,
  35. projects: selection.projects,
  36. };
  37. const eventView = EventView.fromNewQueryWithPageFilters(newQuery, selection);
  38. const {data: metricsResult, isLoading: isMetricsStatsLoading} = useTableQuery({
  39. eventView,
  40. limit: 100,
  41. });
  42. const metricsStats: {[version: string]: {count: number}} = {};
  43. metricsResult?.data?.forEach(release => {
  44. metricsStats[release.release] = {count: release['count()'] as number};
  45. });
  46. const releaseStats: {
  47. dateCreated: string;
  48. version: string;
  49. count?: number;
  50. }[] =
  51. releaseResults.data && releaseResults.data.length && !isMetricsStatsLoading
  52. ? releaseResults.data.flatMap(release => {
  53. const releaseVersion = release.version;
  54. const dateCreated = release.dateCreated;
  55. if (metricsStats[releaseVersion]?.count) {
  56. return {
  57. dateCreated,
  58. version: releaseVersion,
  59. count: metricsStats[releaseVersion]?.count,
  60. };
  61. }
  62. return [];
  63. })
  64. : [];
  65. return {
  66. ...releaseResults,
  67. data: releaseStats,
  68. };
  69. }
  70. export function useReleaseSelection() {
  71. const location = useLocation();
  72. const {data: releases, isLoading} = useReleases();
  73. const primaryRelease =
  74. decodeScalar(location.query.primaryRelease) ?? releases?.[0]?.version ?? undefined;
  75. const secondaryRelease =
  76. decodeScalar(location.query.secondaryRelease) ??
  77. (releases && releases.length > 1 ? releases?.[1]?.version : undefined);
  78. return {primaryRelease, secondaryRelease, isLoading};
  79. }