useProjectSdkUpdates.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import {useEffect, useMemo, useState} from 'react';
  2. import {Client} from 'sentry/api';
  3. import {RequestState} from 'sentry/types';
  4. import {Organization} from '../types/organization';
  5. import {Project, ProjectSdkUpdates} from '../types/project';
  6. import useApi from './useApi';
  7. function loadSdkUpdates(api: Client, orgSlug: string): Promise<ProjectSdkUpdates[]> {
  8. return api.requestPromise(`/organizations/${orgSlug}/sdk-updates/`);
  9. }
  10. interface UseProjectSdkOptions {
  11. organization: Organization;
  12. projectId: Project['id'] | null;
  13. }
  14. export function useProjectSdkUpdates(
  15. options: UseProjectSdkOptions & {projectId: null}
  16. ): RequestState<ProjectSdkUpdates[] | null>;
  17. export function useProjectSdkUpdates(
  18. options: UseProjectSdkOptions & {projectId: Project['id']}
  19. ): RequestState<ProjectSdkUpdates | null>;
  20. export function useProjectSdkUpdates(
  21. options: UseProjectSdkOptions
  22. ): RequestState<ProjectSdkUpdates | ProjectSdkUpdates[] | null> {
  23. const api = useApi();
  24. const [state, setState] = useState<RequestState<ProjectSdkUpdates[] | null>>({
  25. type: 'initial',
  26. });
  27. useEffect(() => {
  28. let unmounted = false;
  29. loadSdkUpdates(api, options.organization.slug)
  30. .then(data => {
  31. if (unmounted) {
  32. return;
  33. }
  34. setState({
  35. type: 'resolved',
  36. data,
  37. });
  38. })
  39. .catch(e => {
  40. if (unmounted) {
  41. return;
  42. }
  43. setState({
  44. type: 'errored',
  45. error: e,
  46. });
  47. });
  48. return () => {
  49. unmounted = true;
  50. };
  51. }, [api, options.organization.slug]);
  52. const stateForProject = useMemo((): RequestState<
  53. ProjectSdkUpdates[] | ProjectSdkUpdates | null
  54. > => {
  55. if (!options.projectId) {
  56. return {
  57. ...state,
  58. type: 'resolved',
  59. data: state.type === 'resolved' && state.data ? state.data : null,
  60. };
  61. }
  62. if (state.type === 'resolved') {
  63. return {
  64. ...state,
  65. type: 'resolved',
  66. data:
  67. state.type === 'resolved' && state.data
  68. ? state.data.find(sdk => sdk.projectId === options.projectId) ?? null
  69. : null,
  70. };
  71. }
  72. return state;
  73. }, [state, options.projectId]);
  74. return stateForProject;
  75. }