import type {InjectedRouter} from 'react-router'; import type {Location} from 'history'; import {openModal} from 'sentry/actionCreators/modal'; import ContextPickerModal from 'sentry/components/contextPickerModal'; import ProjectsStore from 'sentry/stores/projectsStore'; import replaceRouterParams from 'sentry/utils/replaceRouterParams'; import normalizeUrl from 'sentry/utils/url/normalizeUrl'; // TODO(ts): figure out better typing for react-router here export function navigateTo( to: string, router: InjectedRouter & {location?: Location}, configUrl?: string ) { // Check for placeholder params const needOrg = to.includes(':orgId'); const needProject = to.includes(':projectId') || to.includes(':project'); const comingFromProjectId = router?.location?.query?.project; const needProjectId = !comingFromProjectId || Array.isArray(comingFromProjectId); const projectById = ProjectsStore.getById(comingFromProjectId); if (needOrg || (needProject && (needProjectId || !projectById)) || configUrl) { openModal( modalProps => ( { modalProps.closeModal(); return window.setTimeout(() => router.push(normalizeUrl(path)), 0); }} /> ), {} ); } else { if (projectById) { to = replaceRouterParams(to, { projectId: projectById.slug, project: projectById.id, }); } router.push(normalizeUrl(to)); } }