useReleases.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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, isReady} = 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, enabled: isReady}
  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. staleTime: Infinity,
  42. });
  43. const metricsStats: {[version: string]: {count: number}} = {};
  44. metricsResult?.data?.forEach(release => {
  45. metricsStats[release.release] = {count: release['count()'] as number};
  46. });
  47. const releaseStats: {
  48. dateCreated: string;
  49. version: string;
  50. count?: number;
  51. }[] =
  52. releaseResults.data && releaseResults.data.length && !isMetricsStatsLoading
  53. ? releaseResults.data.flatMap(release => {
  54. const releaseVersion = release.version;
  55. const dateCreated = release.dateCreated;
  56. if (metricsStats[releaseVersion]?.count) {
  57. return {
  58. dateCreated,
  59. version: releaseVersion,
  60. count: metricsStats[releaseVersion]?.count,
  61. };
  62. }
  63. return [];
  64. })
  65. : [];
  66. return {
  67. ...releaseResults,
  68. data: releaseStats,
  69. };
  70. }
  71. export function useReleaseSelection(): {
  72. isLoading: boolean;
  73. primaryRelease: string | undefined;
  74. secondaryRelease: string | undefined;
  75. } {
  76. const location = useLocation();
  77. const {data: releases, isLoading} = useReleases();
  78. const primaryRelease =
  79. decodeScalar(location.query.primaryRelease) ?? releases?.[0]?.version ?? undefined;
  80. const secondaryRelease =
  81. decodeScalar(location.query.secondaryRelease) ??
  82. (releases && releases.length > 1 ? releases?.[1]?.version : undefined);
  83. return {primaryRelease, secondaryRelease, isLoading};
  84. }