// eslint-disable-next-line no-restricted-imports import {withRouter, WithRouterProps} from 'react-router'; import {LocationDescriptor} from 'history'; import * as qs from 'query-string'; import Link, {LinkProps} from 'sentry/components/links/link'; import {extractSelectionParameters} from 'sentry/components/organizations/pageFilters/utils'; interface Props extends WithRouterProps { /** * Location that is being linked to */ to: LocationDescriptor; children?: React.ReactNode; /** * Styles applied to the component's root */ className?: string; /** * Click event (not for navigation) */ onClick?: LinkProps['onClick']; /** * Inline styles */ style?: React.CSSProperties; } /** * A modified link used for navigating between organization level pages that * will keep the global selection values (projects, environments, time) in the * querystring when navigating if it's present * * Falls back to if there is no router present. */ function GlobalSelectionLink(props: Props) { const {location, to} = props; const globalQuery = extractSelectionParameters(location?.query); const hasGlobalQuery = Object.keys(globalQuery).length > 0; const query = typeof to === 'object' && to.query ? {...globalQuery, ...to.query} : globalQuery; if (location) { const toWithGlobalQuery: LocationDescriptor = !hasGlobalQuery ? {} : typeof to === 'string' ? {pathname: to, query} : {...to, query}; const routerProps = hasGlobalQuery ? {...props, to: toWithGlobalQuery} : {...props, to}; return ; } let queryStringObject = {}; if (typeof to === 'object' && to.search) { queryStringObject = qs.parse(to.search); } queryStringObject = {...queryStringObject, ...globalQuery}; if (typeof to === 'object' && to.query) { queryStringObject = {...queryStringObject, ...to.query}; } const queryString = qs.stringify(queryStringObject); const url = (typeof to === 'string' ? to : to.pathname) + (queryString ? `?${queryString}` : ''); return ; } export default withRouter(GlobalSelectionLink);