useProjectStats.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import {useEffect, useState} from 'react';
  2. import {t} from 'sentry/locale';
  3. import {SeriesApi} from 'sentry/types';
  4. import handleXhrErrorResponse from 'sentry/utils/handleXhrErrorResponse';
  5. import useApi from 'sentry/utils/useApi';
  6. import {projectStatsToSeries} from './projectStatsToSeries';
  7. function useProjectStats({orgSlug, projectId, interval, statsPeriod, disable = false}) {
  8. const api = useApi();
  9. const [loading, setLoading] = useState(false);
  10. const [error, setError] = useState<string | undefined>(undefined);
  11. const [projectStats, setProjectStats] = useState<SeriesApi | undefined>(undefined);
  12. useEffect(() => {
  13. async function fetchStats() {
  14. try {
  15. setLoading(true);
  16. const response = await api.requestPromise(`/organizations/${orgSlug}/stats_v2/`, {
  17. query: {
  18. category: 'transaction',
  19. field: 'sum(quantity)',
  20. groupBy: 'outcome',
  21. project: projectId,
  22. interval,
  23. statsPeriod,
  24. },
  25. });
  26. setProjectStats(response);
  27. setLoading(false);
  28. } catch (err) {
  29. const errorMessage = t('Unable to load project stats');
  30. handleXhrErrorResponse(errorMessage)(err);
  31. setError(errorMessage);
  32. setLoading(false);
  33. }
  34. }
  35. if (!disable) {
  36. fetchStats();
  37. }
  38. }, [api, projectId, orgSlug, interval, statsPeriod, disable]);
  39. return {
  40. loading,
  41. error,
  42. projectStats,
  43. projectStatsSeries: projectStatsToSeries(projectStats),
  44. };
  45. }
  46. export default useProjectStats;