index.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import {Fragment} from 'react';
  2. import LoadingError from 'sentry/components/loadingError';
  3. import LoadingIndicator from 'sentry/components/loadingIndicator';
  4. import Pagination from 'sentry/components/pagination';
  5. import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
  6. import {t} from 'sentry/locale';
  7. import type {Repository} from 'sentry/types/integrations';
  8. import {setApiQueryData, useApiQuery, useQueryClient} from 'sentry/utils/queryClient';
  9. import {useLocation} from 'sentry/utils/useLocation';
  10. import useOrganization from 'sentry/utils/useOrganization';
  11. import OrganizationRepositories from './organizationRepositories';
  12. function OrganizationRepositoriesContainer() {
  13. const organization = useOrganization();
  14. const location = useLocation();
  15. const queryClient = useQueryClient();
  16. const {
  17. data: itemList,
  18. isPending,
  19. isError,
  20. getResponseHeader,
  21. } = useApiQuery<Repository[]>(
  22. [`/organizations/${organization.slug}/repos/`, {query: location.query}],
  23. {staleTime: 0}
  24. );
  25. const itemListPageLinks = getResponseHeader?.('Link');
  26. if (isPending) {
  27. return <LoadingIndicator />;
  28. }
  29. if (isError) {
  30. return <LoadingError />;
  31. }
  32. // Callback used by child component to signal state change
  33. function onRepositoryChange(data: Pick<Repository, 'id' | 'status'>) {
  34. setApiQueryData<Repository[]>(
  35. queryClient,
  36. [`/organizations/${organization.slug}/repos/`, {query: location.query}],
  37. oldItemList =>
  38. oldItemList.map(item =>
  39. item.id === data.id ? {...item, status: data.status} : item
  40. )
  41. );
  42. }
  43. return (
  44. <Fragment>
  45. <SentryDocumentTitle title={t('Repositories')} orgSlug={organization.slug} />
  46. <OrganizationRepositories
  47. organization={organization}
  48. itemList={itemList}
  49. onRepositoryChange={onRepositoryChange}
  50. />
  51. {itemListPageLinks && <Pagination pageLinks={itemListPageLinks} />}
  52. </Fragment>
  53. );
  54. }
  55. export default OrganizationRepositoriesContainer;