Files
2024-02-15 17:01:50 +00:00

51 lines
1.6 KiB
TypeScript

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/withDomainRequired';
// 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 => (
<ContextPickerModal
{...modalProps}
nextPath={to}
needOrg={needOrg}
needProject={needProject}
configUrl={configUrl}
onFinish={path => {
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));
}
}