navigation.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import {InjectedRouter} from 'react-router';
  2. import {Location} from 'history';
  3. import {openModal} from 'app/actionCreators/modal';
  4. import NavigationActions from 'app/actions/navigationActions';
  5. import ContextPickerModal from 'app/components/contextPickerModal';
  6. import ProjectsStore from 'app/stores/projectsStore';
  7. // TODO(ts): figure out better typing for react-router here
  8. export function navigateTo(
  9. to: string,
  10. router: InjectedRouter & {location?: Location},
  11. configUrl?: string
  12. ) {
  13. // Check for placeholder params
  14. const needOrg = to.indexOf(':orgId') > -1;
  15. const needProject = to.indexOf(':projectId') > -1;
  16. const comingFromProjectId = router?.location?.query?.project;
  17. const needProjectId = !comingFromProjectId || Array.isArray(comingFromProjectId);
  18. const projectById = ProjectsStore.getById(comingFromProjectId);
  19. if (needOrg || (needProject && (needProjectId || !projectById)) || configUrl) {
  20. openModal(
  21. modalProps => (
  22. <ContextPickerModal
  23. {...modalProps}
  24. nextPath={to}
  25. needOrg={needOrg}
  26. needProject={needProject}
  27. configUrl={configUrl}
  28. comingFromProjectId={
  29. Array.isArray(comingFromProjectId) ? '' : comingFromProjectId || ''
  30. }
  31. onFinish={path => {
  32. modalProps.closeModal();
  33. setTimeout(() => router.push(path), 0);
  34. }}
  35. />
  36. ),
  37. {}
  38. );
  39. } else {
  40. projectById
  41. ? router.push(to.replace(':projectId', projectById.slug))
  42. : router.push(to);
  43. }
  44. }
  45. export function setLastRoute(route: string) {
  46. NavigationActions.setLastRoute(route);
  47. }