@@ -8,7 +8,6 @@ import { IonRouterOutlet } from '../IonRouterOutlet';
88import  {  IonTabsInner  }  from  '../inner-proxies' ; 
99import  {  IonTab  }  from  '../proxies' ; 
1010
11- import  {  IonTabBar  }  from  './IonTabBar' ; 
1211import  type  {  IonTabsContextState  }  from  './IonTabsContext' ; 
1312import  {  IonTabsContext  }  from  './IonTabsContext' ; 
1413
@@ -43,36 +42,23 @@ interface Props extends LocalJSX.IonTabs {
4342  children : ChildFunction  |  React . ReactNode ; 
4443} 
4544
46- const  hostStyles : React . CSSProperties  =  { 
47-   display : 'flex' , 
48-   position : 'absolute' , 
49-   top : '0' , 
50-   left : '0' , 
51-   right : '0' , 
52-   bottom : '0' , 
53-   flexDirection : 'column' , 
54-   width : '100%' , 
55-   height : '100%' , 
56-   contain : 'layout size style' , 
57- } ; 
58- 
59- const  tabsInner : React . CSSProperties  =  { 
60-   position : 'relative' , 
61-   flex : 1 , 
62-   contain : 'layout size style' , 
63- } ; 
64- 
6545export  const  IonTabs  =  /*@__PURE__ */  ( ( )  => 
6646  class  extends  React . Component < Props >  { 
6747    context ! : React . ContextType < typeof  NavContext > ; 
68-     routerOutletRef : React . Ref < HTMLIonRouterOutletElement >  =  React . createRef ( ) ; 
6948    selectTabHandler ?: ( tag : string )  =>  boolean ; 
7049    tabBarRef  =  React . createRef < any > ( ) ; 
7150
7251    ionTabContextState : IonTabsContextState  =  { 
7352      activeTab : undefined , 
7453      selectTab : ( )  =>  false , 
7554      hasRouterOutlet : false , 
55+       /** 
56+        * Tab bar can be used as a standalone component, 
57+        * so the props can not be passed directly to the 
58+        * tab bar component. Instead, props will be 
59+        * passed through the context. 
60+        */ 
61+       tabBarProps : {  ref : this . tabBarRef  } , 
7662    } ; 
7763
7864    constructor ( props : Props )  { 
@@ -91,9 +77,32 @@ export const IonTabs = /*@__PURE__*/ (() =>
9177      } 
9278    } 
9379
80+     renderTabsInner ( children : React . ReactNode ,  outlet : React . ReactElement < { } >  |  undefined )  { 
81+       return  ( 
82+         < IonTabsInner  { ...this . props } > 
83+           { React . Children . map ( children ,  ( child : React . ReactNode )  =>  { 
84+             if  ( React . isValidElement ( child ) )  { 
85+               const  isRouterOutlet  = 
86+                 child . type  ===  IonRouterOutlet  || 
87+                 ( child . type  as  any ) . isRouterOutlet  || 
88+                 ( child . type  ===  Fragment  &&  child . props . children [ 0 ] . type  ===  IonRouterOutlet ) ; 
89+ 
90+               if  ( isRouterOutlet )  { 
91+                 /** 
92+                  * The modified outlet needs to be returned to include 
93+                  * the ref. 
94+                  */ 
95+                 return  outlet ; 
96+               } 
97+             } 
98+             return  child ; 
99+           } ) } 
100+         </ IonTabsInner > 
101+       ) ; 
102+     } 
103+ 
94104    render ( )  { 
95105      let  outlet : React . ReactElement < { } >  |  undefined ; 
96-       let  tabBar : React . ReactElement  |  undefined ; 
97106      // Check if IonTabs has any IonTab children 
98107      let  hasTab  =  false ; 
99108      const  {  className,  onIonTabsDidChange,  onIonTabsWillChange,  ...props  }  =  this . props ; 
@@ -103,19 +112,15 @@ export const IonTabs = /*@__PURE__*/ (() =>
103112          ? ( this . props . children  as  ChildFunction ) ( this . ionTabContextState ) 
104113          : this . props . children ; 
105114
106-       const  outletProps  =  { 
107-         ref : this . routerOutletRef , 
108-       } ; 
109- 
110115      React . Children . forEach ( children ,  ( child : any )  =>  { 
111116        // eslint-disable-next-line no-prototype-builtins 
112117        if  ( child  ==  null  ||  typeof  child  !==  'object'  ||  ! child . hasOwnProperty ( 'type' ) )  { 
113118          return ; 
114119        } 
115120        if  ( child . type  ===  IonRouterOutlet  ||  child . type . isRouterOutlet )  { 
116-           outlet  =  React . cloneElement ( child ,   outletProps ) ; 
121+           outlet  =  React . cloneElement ( child ) ; 
117122        }  else  if  ( child . type  ===  Fragment  &&  child . props . children [ 0 ] . type  ===  IonRouterOutlet )  { 
118-           outlet  =  React . cloneElement ( child . props . children [ 0 ] ,   outletProps ) ; 
123+           outlet  =  React . cloneElement ( child . props . children [ 0 ] ) ; 
119124        }  else  if  ( child . type  ===  IonTab )  { 
120125          /** 
121126           * This indicates that IonTabs will be using a basic tab-based navigation 
@@ -127,8 +132,7 @@ export const IonTabs = /*@__PURE__*/ (() =>
127132        this . ionTabContextState . hasRouterOutlet  =  ! ! outlet ; 
128133
129134        let  childProps : any  =  { 
130-           ref : this . tabBarRef , 
131-           routerOutletRef : this . routerOutletRef , 
135+           ...this . ionTabContextState . tabBarProps , 
132136        } ; 
133137
134138        /** 
@@ -152,14 +156,7 @@ export const IonTabs = /*@__PURE__*/ (() =>
152156          } ; 
153157        } 
154158
155-         if  ( child . type  ===  IonTabBar  ||  child . type . isTabBar )  { 
156-           tabBar  =  React . cloneElement ( child ,  childProps ) ; 
157-         }  else  if  ( 
158-           child . type  ===  Fragment  && 
159-           ( child . props . children [ 1 ] . type  ===  IonTabBar  ||  child . props . children [ 1 ] . type . isTabBar ) 
160-         )  { 
161-           tabBar  =  React . cloneElement ( child . props . children [ 1 ] ,  childProps ) ; 
162-         } 
159+         this . ionTabContextState . tabBarProps  =  childProps ; 
163160      } ) ; 
164161
165162      if  ( ! outlet  &&  ! hasTab )  { 
@@ -189,46 +186,10 @@ export const IonTabs = /*@__PURE__*/ (() =>
189186        < IonTabsContext . Provider  value = { this . ionTabContextState } > 
190187          { this . context . hasIonicRouter ( )  ? ( 
191188            < PageManager  className = { className  ? `${ className }   : '' }  routeInfo = { this . context . routeInfo }  { ...props } > 
192-               < IonTabsInner  { ...this . props } > 
193-                 { React . Children . map ( children ,  ( child : React . ReactNode )  =>  { 
194-                   if  ( React . isValidElement ( child ) )  { 
195-                     const  isTabBar  = 
196-                       child . type  ===  IonTabBar  || 
197-                       ( child . type  as  any ) . isTabBar  || 
198-                       ( child . type  ===  Fragment  && 
199-                         ( child . props . children [ 1 ] . type  ===  IonTabBar  ||  child . props . children [ 1 ] . type . isTabBar ) ) ; 
200-                     const  isRouterOutlet  = 
201-                       child . type  ===  IonRouterOutlet  || 
202-                       ( child . type  as  any ) . isRouterOutlet  || 
203-                       ( child . type  ===  Fragment  &&  child . props . children [ 0 ] . type  ===  IonRouterOutlet ) ; 
204- 
205-                     if  ( isTabBar )  { 
206-                       /** 
207-                        * The modified tabBar needs to be returned to include 
208-                        * the context and the overridden methods. 
209-                        */ 
210-                       return  tabBar ; 
211-                     } 
212-                     if  ( isRouterOutlet )  { 
213-                       /** 
214-                        * The modified outlet needs to be returned to include 
215-                        * the ref. 
216-                        */ 
217-                       return  outlet ; 
218-                     } 
219-                   } 
220-                   return  child ; 
221-                 } ) } 
222-               </ IonTabsInner > 
189+               { this . renderTabsInner ( children ,  outlet ) } 
223190            </ PageManager > 
224191          )  : ( 
225-             < div  className = { className  ? `${ className }   : 'ion-tabs' }  { ...props }  style = { hostStyles } > 
226-               { tabBar ?. props . slot  ===  'top'  ? tabBar  : null } 
227-               < div  style = { tabsInner }  className = "tabs-inner" > 
228-                 { outlet } 
229-               </ div > 
230-               { tabBar ?. props . slot  ===  'bottom'  ? tabBar  : null } 
231-             </ div > 
192+             this . renderTabsInner ( children ,  outlet ) 
232193          ) } 
233194        </ IonTabsContext . Provider > 
234195      ) ; 
0 commit comments