// 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);