useFunctions.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import {useEffect, useState} from 'react';
  2. import * as Sentry from '@sentry/react';
  3. import {Client} from 'sentry/api';
  4. import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse';
  5. import {t} from 'sentry/locale';
  6. import {Organization, PageFilters, Project, RequestState} from 'sentry/types';
  7. import {FunctionCall} from 'sentry/types/profiling/core';
  8. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  9. import useApi from 'sentry/utils/useApi';
  10. import useOrganization from 'sentry/utils/useOrganization';
  11. interface UseFunctionsOptions {
  12. project: Project;
  13. query: string;
  14. transaction: string;
  15. selection?: PageFilters;
  16. }
  17. function useFunctions({
  18. project,
  19. query,
  20. transaction,
  21. selection,
  22. }: UseFunctionsOptions): RequestState<FunctionCall[]> {
  23. const api = useApi();
  24. const organization = useOrganization();
  25. const [requestState, setRequestState] = useState<RequestState<FunctionCall[]>>({
  26. type: 'initial',
  27. });
  28. useEffect(() => {
  29. if (selection === undefined) {
  30. return undefined;
  31. }
  32. setRequestState({type: 'loading'});
  33. fetchFunctions(api, organization, {
  34. projectSlug: project.slug,
  35. query,
  36. selection,
  37. transaction,
  38. })
  39. .then(functions => {
  40. setRequestState({
  41. type: 'resolved',
  42. data: functions.functions ?? [],
  43. });
  44. })
  45. .catch(err => {
  46. setRequestState({type: 'errored', error: t('Error: Unable to load functions')});
  47. Sentry.captureException(err);
  48. });
  49. return () => api.clear();
  50. }, [api, organization, project.slug, query, selection, transaction]);
  51. return requestState;
  52. }
  53. function fetchFunctions(
  54. api: Client,
  55. organization: Organization,
  56. {
  57. projectSlug,
  58. query,
  59. selection,
  60. transaction,
  61. }: {
  62. projectSlug: Project['slug'];
  63. query: string;
  64. selection: PageFilters;
  65. transaction: string;
  66. }
  67. ) {
  68. const conditions = new MutableSearch(query);
  69. conditions.setFilterValues('transaction_name', [transaction]);
  70. return api.requestPromise(
  71. `/projects/${organization.slug}/${projectSlug}/profiling/functions/`,
  72. {
  73. method: 'GET',
  74. includeAllArgs: false,
  75. query: {
  76. environment: selection.environments,
  77. ...normalizeDateTimeParams(selection.datetime),
  78. query: conditions.formatString(),
  79. },
  80. }
  81. );
  82. }
  83. export {useFunctions};