@@ -2,15 +2,17 @@ import _ from 'lodash';
22import BottomTabsNode from '../Layouts/BottomTabsNode' ;
33import ParentNode from '../Layouts/ParentNode' ;
44import LayoutNodeFactory from '../Layouts/LayoutNodeFactory' ;
5- import { Options } from '../../src/interfaces/Options ' ;
5+ import { SideMenuNode } from '../Layouts/SideMenu ' ;
66import StackNode from '../Layouts/StackNode' ;
7+ import { Options } from '../../src/interfaces/Options' ;
78
89const remx = require ( 'remx' ) ;
910
1011const state = remx . state ( {
1112 root : { } ,
1213 modals : [ ] ,
1314 overlays : [ ] ,
15+ sideMenu : undefined ,
1416} ) ;
1517
1618const setters = remx . setters ( {
@@ -75,6 +77,23 @@ const setters = remx.setters({
7577 selectTabIndex ( layout : BottomTabsNode , index : number ) {
7678 getters . getLayoutById ( layout . nodeId ) . selectedIndex = index ;
7779 } ,
80+ openSideMenu ( layout : SideMenuNode ) {
81+ if ( state . sideMenu ) {
82+ throw new Error (
83+ 'A side-menu is already open; Mocked-testing of multiple side-menu scenarios is not supported yet.' +
84+ ' You can submit a request in https://github.com/wix/react-native-navigation/issues/new/choose.'
85+ ) ;
86+ }
87+ state . sideMenu = layout ;
88+ } ,
89+ closeSideMenu ( _layout : SideMenuNode ) {
90+ state . sideMenu = undefined ;
91+ } ,
92+ applyOptions ( componentId : string , options : Options ) {
93+ const layout = getters . getLayoutById ( componentId ) ;
94+ if ( layout ) layout . applyOptions ( options ) ;
95+ else console . warn ( `[RNN error] Merge options failure: cannot find layout for: ${ componentId } ` ) ;
96+ } ,
7897 mergeOptions ( componentId : string , options : Options ) {
7998 const layout = getters . getLayoutById ( componentId ) ;
8099 if ( layout ) layout . mergeOptions ( options ) ;
@@ -87,12 +106,26 @@ const getters = remx.getters({
87106 return state . root ;
88107 } ,
89108 getVisibleLayout ( ) {
109+ let layout : ParentNode | undefined ;
90110 if ( state . modals . length > 0 ) {
91- return _ . last < ParentNode > ( state . modals ) ! . getVisibleLayout ( ) ;
92- } else if ( ! _ . isEqual ( state . root , { } ) ) return state . root . getVisibleLayout ( ) ;
111+ layout = _ . last < ParentNode > ( state . modals ) ! ;
112+ } else if ( ! _ . isEqual ( state . root , { } ) ) {
113+ layout = state . root ;
114+ }
115+
116+ // Note: While this logic should be fair for all use cases (i.e. even multiple side-menus across tabs),
117+ // there is no current test case that justifies it. Nevertheless, it's required to pass the tests,
118+ // because otherwise getVisibleLayout() would not be revisited whenever side-menus are opened/closed.
119+ if ( layout && state . sideMenu && findNode ( state . sideMenu . nodeId , layout ! ) ) {
120+ layout = state . sideMenu . parentNode ;
121+ }
122+
123+ return layout ?. getVisibleLayout ( ) ;
93124 } ,
94125 isVisibleLayout ( layout : ParentNode ) {
95- return getters . getVisibleLayout ( ) && getters . getVisibleLayout ( ) . nodeId === layout . nodeId ;
126+ const nodeId = layout . nodeId ;
127+ const visibleLayout = getters . getVisibleLayout ( ) ;
128+ return visibleLayout ?. nodeId === nodeId ;
96129 } ,
97130 getModals ( ) {
98131 return state . modals ;
@@ -101,13 +134,12 @@ const getters = remx.getters({
101134 return state . overlays ;
102135 } ,
103136 getLayoutById ( layoutId : string ) {
104- if ( getters . getModalById ( layoutId ) )
105- return findParentNode ( layoutId , getters . getModalById ( layoutId ) ) ;
137+ if ( getters . getModalById ( layoutId ) ) return findNode ( layoutId , getters . getModalById ( layoutId ) ) ;
106138
107- return findParentNode ( layoutId , state . root ) ;
139+ return findNode ( layoutId , state . root ) ;
108140 } ,
109141 getModalById ( layoutId : string ) {
110- return _ . find ( state . modals , ( layout ) => findParentNode ( layoutId , layout ) ) ;
142+ return _ . find ( state . modals , ( layout ) => findNode ( layoutId , layout ) ) ;
111143 } ,
112144 getLayoutChildren ( layoutId : string ) {
113145 return getters . getLayoutById ( layoutId ) . children ;
@@ -120,13 +152,13 @@ const getters = remx.getters({
120152 } ,
121153} ) ;
122154
123- function findParentNode ( layoutId : string , layout : ParentNode ) : any | ParentNode {
155+ function findNode ( layoutId : string , layout : ParentNode ) : any | ParentNode {
124156 if ( layoutId === layout . nodeId ) {
125157 return layout ;
126158 } else if ( layout . children ) {
127159 for ( let i = 0 ; i < layout . children . length ; i += 1 ) {
128160 const child = layout . children [ i ] ;
129- const result = findParentNode ( layoutId , child ) ;
161+ const result = findNode ( layoutId , child ) ;
130162
131163 if ( result !== false ) {
132164 return result ;
0 commit comments