withSavedSearches.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import {RouteComponentProps} from 'react-router';
  2. import {SavedSearch} from 'sentry/types';
  3. import useOrganization from 'sentry/utils/useOrganization';
  4. import {useFetchSavedSearchesForOrg} from 'sentry/views/issueList/queries/useFetchSavedSearchesForOrg';
  5. import {useSelectedSavedSearch} from 'sentry/views/issueList/utils/useSelectedSavedSearch';
  6. type InjectedSavedSearchesProps = {
  7. savedSearch: SavedSearch | null;
  8. savedSearchLoading: boolean;
  9. savedSearches: SavedSearch[];
  10. } & RouteComponentProps<{searchId?: string}, {}>;
  11. /**
  12. * HOC to provide saved search data to class components.
  13. * When possible, use the hooks directly instead.
  14. */
  15. function withSavedSearches<P extends InjectedSavedSearchesProps>(
  16. WrappedComponent: React.ComponentType<P>
  17. ) {
  18. return (
  19. props: Omit<P, keyof InjectedSavedSearchesProps> & Partial<InjectedSavedSearchesProps>
  20. ) => {
  21. const organization = useOrganization();
  22. const {data: savedSearches, isLoading} = useFetchSavedSearchesForOrg({
  23. orgSlug: organization.slug,
  24. });
  25. const selectedSavedSearch = useSelectedSavedSearch();
  26. return (
  27. <WrappedComponent
  28. {...(props as P)}
  29. savedSearches={props.savedSearches ?? savedSearches}
  30. savedSearchLoading={props.savedSearchLoading ?? isLoading}
  31. savedSearch={props.savedSearch ?? selectedSavedSearch}
  32. />
  33. );
  34. };
  35. }
  36. export default withSavedSearches;