1+ import { useEffect } from 'react' ;
2+ import {
3+ useLocation ,
4+ useNavigate ,
5+ useNavigationType ,
6+ NavigationType ,
7+ } from 'react-router-dom' ;
18import { useTranslation } from 'react-i18next' ;
29import { NavNode } from 'state/types' ;
310import { useUrl } from 'hooks/useUrl' ;
@@ -11,7 +18,6 @@ import {
1118 SideNavigationSubItem ,
1219 SideNavigationItem ,
1320} from '@ui5/webcomponents-react' ;
14- import { useNavigate } from 'react-router-dom' ;
1521import { isResourceEditedState } from 'state/resourceEditedAtom' ;
1622
1723import { isFormOpenState } from 'state/formOpenAtom' ;
@@ -28,6 +34,8 @@ export function NavItem({ node, subItem = false }: NavItemProps) {
2834 const { t } = useTranslation ( ) ;
2935 const urlGenerators = useUrl ( ) ;
3036 const navigate = useNavigate ( ) ;
37+ const location = useLocation ( ) ;
38+ const navigationType = useNavigationType ( ) ;
3139 const setLayoutColumn = useSetRecoilState ( columnLayoutState ) ;
3240 const [ isResourceEdited , setIsResourceEdited ] = useRecoilState (
3341 isResourceEditedState ,
@@ -55,44 +63,57 @@ export function NavItem({ node, subItem = false }: NavItemProps) {
5563 }
5664 } ;
5765
58- let propsForNav = {
66+ const handleNavigation = ( isNavigatingForward ?: boolean ) => {
67+ if ( node . dataSources ) {
68+ let link =
69+ ! jsonataError && jsonataLink ? jsonataLink : node . externalUrl ?? '' ;
70+ link = link . startsWith ( 'http' ) ? link : `https://${ link } ` ;
71+ const newWindow = window . open ( link , 'noopener, noreferrer' ) ;
72+ if ( newWindow ) newWindow . opener = null ;
73+ } else if ( node . externalUrl ) {
74+ const link = node . externalUrl . startsWith ( 'http' )
75+ ? node . externalUrl
76+ : `https://${ node . externalUrl } ` ;
77+ const newWindow = window . open ( link , 'noopener, noreferrer' ) ;
78+ if ( newWindow ) newWindow . opener = null ;
79+ } else {
80+ handleActionIfFormOpen (
81+ isResourceEdited ,
82+ setIsResourceEdited ,
83+ isFormOpen ,
84+ setIsFormOpen ,
85+ ( ) => {
86+ setLayoutColumn ( {
87+ midColumn : null ,
88+ endColumn : null ,
89+ layout : 'OneColumn' ,
90+ } ) ;
91+ const url = node . createUrlFn
92+ ? node . createUrlFn ( urlGenerators )
93+ : scopedUrl ( node . pathSegment ) ;
94+ if ( location ?. pathname !== url && isNavigatingForward ) {
95+ navigate ( url ) ;
96+ }
97+ } ,
98+ ) ;
99+ }
100+ } ;
101+
102+ useEffect ( ( ) => {
103+ if ( navigationType === NavigationType . Pop ) {
104+ handleNavigation ( ) ;
105+ }
106+ // eslint-disable-next-line react-hooks/exhaustive-deps
107+ } , [ navigationType ] ) ;
108+
109+ const propsForNav = {
59110 icon : node . externalUrl ? 'action' : node . icon ,
60111 text : t ( node . label , { defaultValue : node . label } ) ,
61112 selected : isNodeSelected ( node ) ,
62113 key : node . pathSegment ,
63114 onClick : ( e : Event ) => {
64- if ( node . dataSources ) {
65- let link =
66- ! jsonataError && jsonataLink ? jsonataLink : node . externalUrl || '' ;
67- link = link . startsWith ( 'http' ) ? link : `https://${ link } ` ;
68- const newWindow = window . open ( link , 'noopener, noreferrer' ) ;
69- if ( newWindow ) newWindow . opener = null ;
70- } else if ( node . externalUrl ) {
71- const link = node . externalUrl . startsWith ( 'http' )
72- ? node . externalUrl
73- : `https://${ node . externalUrl } ` ;
74- const newWindow = window . open ( link , 'noopener, noreferrer' ) ;
75- if ( newWindow ) newWindow . opener = null ;
76- } else {
77- handleActionIfFormOpen (
78- isResourceEdited ,
79- setIsResourceEdited ,
80- isFormOpen ,
81- setIsFormOpen ,
82- ( ) => {
83- setLayoutColumn ( {
84- midColumn : null ,
85- endColumn : null ,
86- layout : 'OneColumn' ,
87- } ) ;
88- navigate (
89- node . createUrlFn
90- ? node . createUrlFn ( urlGenerators )
91- : scopedUrl ( node . pathSegment ) ,
92- ) ;
93- } ,
94- ) ;
95- }
115+ e . stopPropagation ( ) ;
116+ handleNavigation ( true ) ;
96117 } ,
97118 } ;
98119
0 commit comments