useOwners.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import {useEffect, useMemo} from 'react';
  2. import {useMembers} from 'sentry/utils/useMembers';
  3. import {useTeams} from 'sentry/utils/useTeams';
  4. import {useTeamsById} from 'sentry/utils/useTeamsById';
  5. interface Options {
  6. /**
  7. * The current selected values that will be ensured loaded. These should be
  8. * in the actor identifier format
  9. */
  10. currentValue?: string[];
  11. }
  12. /**
  13. * Hook to fetch owner options
  14. */
  15. export function useOwners({currentValue}: Options) {
  16. // Ensure the current value of the fields members is loaded
  17. const ensureUserIds = useMemo(
  18. () =>
  19. currentValue
  20. ?.filter(item => item.startsWith('user:'))
  21. .map(user => user.replace(/^user:/, '')),
  22. [currentValue]
  23. );
  24. useMembers({ids: ensureUserIds});
  25. const {
  26. members,
  27. fetching: fetchingMembers,
  28. onSearch: onMemberSearch,
  29. loadMore: loadMoreMembers,
  30. } = useMembers();
  31. // Ensure the current value of the fields teams is loaded
  32. const ensureTeamIds = useMemo(
  33. () =>
  34. currentValue
  35. ?.filter(item => item.startsWith('team:'))
  36. .map(user => user.replace(/^team:/, '')),
  37. [currentValue]
  38. );
  39. useTeamsById({ids: ensureTeamIds});
  40. const {
  41. teams,
  42. fetching: fetchingTeams,
  43. onSearch: onTeamSearch,
  44. loadMore: loadMoreTeams,
  45. } = useTeams();
  46. // TODO(epurkhiser): This is an unfortunate hack right now since we don't
  47. // actually load members anywhere and the useMembers and useTeams hook don't
  48. // handle initial loading of data.
  49. //
  50. // In the future when these things use react query we should be able to clean
  51. // this up.
  52. useEffect(
  53. () => {
  54. loadMoreMembers();
  55. loadMoreTeams();
  56. },
  57. // Only ensure things are loaded at mount
  58. // eslint-disable-next-line react-hooks/exhaustive-deps
  59. []
  60. );
  61. return {
  62. members,
  63. teams,
  64. fetching: fetchingMembers || fetchingTeams,
  65. onMemberSearch,
  66. onTeamSearch,
  67. };
  68. }