navigation.tsx 1.6 KB

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