import {Component} from 'react'; import {RouteComponentProps} from 'react-router'; import SavedSearchesStore from 'sentry/stores/savedSearchesStore'; import {SavedSearch} from 'sentry/types'; import getDisplayName from 'sentry/utils/getDisplayName'; type InjectedSavedSearchesProps = { savedSearch: SavedSearch | null; savedSearchLoading: boolean; savedSearches: SavedSearch[]; } & RouteComponentProps<{searchId?: string}, {}>; type State = { isLoading: boolean; savedSearches: SavedSearch[]; }; /** * Wrap a component with saved issue search data from the store. */ function withSavedSearches

( WrappedComponent: React.ComponentType

) { class WithSavedSearches extends Component< Omit & Partial, State > { static displayName = `withSavedSearches(${getDisplayName(WrappedComponent)})`; state = SavedSearchesStore.get(); componentWillUnmount() { this.unsubscribe(); } unsubscribe = SavedSearchesStore.listen( (searchesState: State) => this.onUpdate(searchesState), undefined ); onUpdate(newState: State) { this.setState(newState); } render() { const { params, location, savedSearchLoading, savedSearch: savedSearchProp, savedSearches: savedSearchesProp, } = this.props as P; const {searchId} = params; const {savedSearches, isLoading} = this.state as State; let savedSearch: SavedSearch | null = null; // Switch to the current saved search or pinned result if available if (!isLoading && savedSearches) { if (searchId) { const match = savedSearches.find(search => search.id === searchId); savedSearch = match ? match : null; } // If there's no direct saved search being requested (via URL route) // *AND* there's no query in URL, then check if there is pinned search // // Note: Don't use pinned searches when there is an empty query (query === empty string) if (!savedSearch && typeof location.query.query === 'undefined') { const pin = savedSearches.find(search => search.isPinned); savedSearch = pin ? pin : null; } } return ( ); } } return WithSavedSearches; } export default withSavedSearches;