Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to pop from cloned route to parent. #976

Closed
kristojorg opened this issue Jul 26, 2016 · 18 comments
Closed

How to pop from cloned route to parent. #976

kristojorg opened this issue Jul 26, 2016 · 18 comments
Labels

Comments

@kristojorg
Copy link

kristojorg commented Jul 26, 2016

Version

Tell us which versions you are using:

  • react-native-router-flux v3.32.0
  • react-native v0.29.0

Expected behaviour

Routes set up like this:

<Scene clone key="composer" component={Composer} hideNavBar hideTabBar />

<Scene
  key="myAccount"
  initial
  tabs
  hideNavBar
  hideTabBar={false}
  tabBarStyle={styles.tabBar}
  tabBarIconContainerStyle={styles.tabBarIconStyle}
  type={ActionConst.REPLACE}
>
  <Scene key="dashboard" component={Dashboard} tabTitle="Dashboard" initial icon={TabIcon} hideNavBar hideTabBar={false} />
  <Scene key="myStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
    <Scene key="myStream" component={Stream} hideNavBar hideTabBar={false} />
    {/* <Scene key="myComposer" component={Composer} hideNavBar hideTabBar />*/}
  </Scene>
  <Scene key="recorder" tabTitle="Record" icon={TabIcon} hideNavBar hideTabBar={false} >
    <Scene key="activityChooserView" component={ActivityChooserView} hideTabBar={false} initial hideNavBar />
    <Scene key="recorderView" component={Recorder} title="recorder" hideTabBar hideNavBar unmountScenes />
    <Scene key="userResponseView" component={UserResponseView} title="Response" hideTabBar hideNavBar unmountScenes />
  </Scene>
</Scene>

<Scene
  key="traineeAccount"
  tabs
  hideNavBar
  tabBarStyle={styles.tabBar}
  tabBarIconContainerStyle={styles.tabBarIconStyle}
  type={ActionConst.REPLACE}
>
  <Scene key="traineeStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
    <Scene key="traineeStream" component={Stream} hideNavBar hideTabBar={false} type={ActionConst.PUSH} />
    {/* <Scene key="traineeComposer" component={Composer} hideNavBar hideTabBar type={ActionConst.PUSH} />*/}
  </Scene>
</Scene>

I want to be able to push the composer into the stack from within either myAccount > myStreamContainer or from within traineeAccount > traineeStreamContainer. I will push from within either myStream or traineeStream. I call Actions.pop() from within Composer, and want to return to either myStream or traineeStream.

Actual behaviour

I call Actions.pop() and nothing happens from within Composer.

Steps to reproduce

From within myStream: Actions.composer({type:ActionConst.PUSH}). From within the following Composer: Actions.pop()

@kristojorg
Copy link
Author

kristojorg commented Jul 26, 2016

FYI all of these scenes are wrapped in a Switch to determine which of traineeAccount and myAccount will be displayed. I don't know if that is influencing this, or if there is a better way to show/hide tabs based on some state...

@kristojorg
Copy link
Author

I know @joenoon was working on something related to this. Maybe he has an idea of the problem I am facing?

@joenoon
Copy link
Collaborator

joenoon commented Jul 27, 2016

@kristojorg this sounds to me like it should work as you expect. I'm on the road now but will be back to check this in more detail in about 24h. One thought in case you want to experiment: You mentioned this is all wrapped in a Switch. You might need to move that clone scene "up" - directly inside the root scene. They should be defined as early as possible.

@joenoon
Copy link
Collaborator

joenoon commented Jul 30, 2016

@kristojorg I reviewed my app and do something very similar to what you described, and it works fine. I think the issue is what I mentioned before with the clone scenes needing to be defined directly inside the root scene. If that still doesn't work, I have one other idea that you could test that modifies Switch, but lets not go there unless we have to because its a bit of a hack. Let me know.

@kristojorg
Copy link
Author

Hi @joenoon thanks so much for the feedback here. Really appreciate it.

I tried moving the Scene directly inside my top level Switch, but am still seeing the same behavior. I can push it into the stack from within a nested scene lower down, but calling Actions.pop() isn't triggering anything.

It would be helpful to debug this if I could see the actual navigation stack. I use Redux, is there a way to plug your reducer and implementation into my store so that I can see the state in my devtools / logger?

Thanks again!

@kristojorg
Copy link
Author

@joenoon I found an issue that describes how to user createReducer to connect with Redux. Hopefully this will let me see the internal navigationState as it changes and debug this. Right now I just am subscribed to RNRF Actions, which is useful but doesn't allow me to see the actual navigationState.

Let me know if you think of anything else that might be causing this. It's getting pretty tough to workaround! Thanks!

@joenoon
Copy link
Collaborator

joenoon commented Jul 31, 2016

@kristojorg can you import this Switch instead of the Switch that comes with rnrf?

import { Actions, DefaultRenderer } from 'react-native-router-flux';

import React, { Component, PropTypes } from 'react';

export let Switch = class extends Component {

  static propTypes = {
    onNavigate: PropTypes.func,
  };

  constructor(props,context) {
    super(props,context);
    this.updateState = this.updateState.bind(this);
    this.state = {};
  }

  componentDidMount() {
    this.updateState(this.props);
  }

  componentWillReceiveProps(props) {
    this.updateState(props);
  }

  updateState(props) {
    const navState = props.navigationState;

    const selector = props.selector;
    if (!selector) console.error('Selector should be defined.');

    const selectedKey = selector(props);
    if (!selectedKey) console.error('Selector should return key.');

    const selected = navState.children.filter(el => el.sceneKey === selectedKey);
    if (!selected) console.error(`A scene for key “${selectedKey}” does not exist.`);

    const navigationState = selected[0];
    if (!navigationState) console.error(`Cannot find a scene with key “${selectedKey}”`);

    if (navigationState.key !== navState.children[navState.index].key) {
      Actions[selectedKey]();
    }

    this.setState({ navigationState });
  }

  render() {
    if (this.state.navigationState) {
      return (
        <DefaultRenderer
          onNavigate={this.props.onNavigate}
          navigationState={this.state.navigationState}
        />
      );
    }

    return null;
  }
};

That is basically an older version of the Switch component that I still use, because for some reason the one that now comes with rnrf doesn't work for me. I wonder if we have the same issue.

Just import this Switch i.e. import {Switch} from './mySwitch'; instead of the one from react-native-router-flux. Look forward to hearing if that solves your issue.

@kristojorg
Copy link
Author

I just tried importing that Switch and it didn't seem to solve the issue. I can confirm that I'm seeing a BACK ACTION when I pop the route, but nothing else happens... :(

For reference, here is my entire router component. You will see I have started defining new scenes for the same screen in many places since clone isn't working for me. This is getting more and more complex, and the current scene I'm trying to clone is key="activity" there near the top after the first switch.




const RouterWithRedux = connect()(Router);

class Root extends React.Component {


  isLoggedIn(props) {
    const token = props.me.get('token');
    const myId = props.me.get('myId');
    const gu = props.route.get('gu');
    const guid = props.route.get('guid');
    const rehydrated = props.route.get('rehydrated');

    if (!rehydrated) return 'splash';

    if (token && token !== '' && token !== constants.FETCHING) {
      if (gu && guid && myId) {
        return 'drawer';
      }
      return 'login';
    }
    return 'login';
  }

  tabSceneSelector(props) {
    const myId = props.me.get('myId');
    const gu = props.route.get('gu');
    const guid = props.route.get('guid');

    if (gu === 'user') {
      if (guid === myId) {
        return 'myAccount';
      }
      if (!_.isNil(guid)) return 'traineeAccount';
    }
    if (gu === 'group') return 'groupAccount';
    return 'splash';
  }

  render() {
    return (
      <RouterWithRedux >
        <Scene
          key="root"
          // component={connect(state => state.get('me').toJS())(Switch)}
          component={connect(state => ({
            route: state.get('router'),
            me: state.get('me'),
          }))(Switch)}
          tabs
          unmountScenes
          type={ActionConst.REPLACE}
          selector={props => this.isLoggedIn(props)}
        >
          <Scene key="activity" clone component={Activity} hideNavBar hideTabBar type={ActionConst.PUSH} />

          <Scene key="login" component={Login} title="Login" passProps hideNavBar />
          <Scene key="splash" component={Splash} title="Splash" hideNavBar hideTabBar />
          <Scene key="drawer" component={Drawer} open={false} >
            <Scene
              key="tabSwitch"
              component={connect(state => ({
                route: state.get('router'),
                me: state.get('me'),
              }))(Switch)}
              tabs
              unmountScenes
              selector={props => this.tabSceneSelector(props)}
              type={ActionConst.RESET}
            >
              <Scene
                key="myAccount"
                tabs
                hideNavBar
                hideTabBar={false}
                tabBarStyle={styles.tabBar}
                tabBarIconContainerStyle={styles.tabBarIconStyle}
                type={ActionConst.RESET}
              >
                <Scene key="dashboard" component={Dashboard} tabTitle="Dashboard" initial icon={TabIcon} hideNavBar hideTabBar={false} />
                <Scene key="myStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
                  <Scene key="myStream" component={Stream} hideNavBar hideTabBar={false} />
                  <Scene key="myComposer" component={Composer} hideNavBar hideTabBar type={ActionConst.PUSH} />
                </Scene>
                <Scene key="myCalendarContainer" tabTitle="Calendar" icon={TabIcon} hideNavBar hideTabBar={false} >
                  <Scene key="myCalendar" component={Calendar} hideNavBar hideTabBar={false} />
                  <Scene key="myActivity" component={Activity} hideNavBar hideTabBar type={ActionConst.PUSH} />
                  <Scene key="actUserResponse" component={UserResponseView} title="Response" hideTabBar hideNavBar unmountScenes />
                </Scene>
                <Scene key="recorder" tabTitle="Record" icon={TabIcon} hideNavBar hideTabBar={false} >
                  <Scene key="activityChooserView" component={ActivityChooserView} hideTabBar={false} initial hideNavBar />
                  <Scene key="recorderView" component={Recorder} title="recorder" hideTabBar hideNavBar unmountScenes />
                  <Scene key="userResponseView" component={UserResponseView} title="Response" hideTabBar hideNavBar unmountScenes />
                </Scene>
              </Scene>

              <Scene
                key="traineeAccount"
                tabs
                hideNavBar
                tabBarStyle={styles.tabBar}
                tabBarIconContainerStyle={styles.tabBarIconStyle}
                type={ActionConst.REPLACE}
              >
                <Scene key="traineeStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
                  <Scene key="traineeStream" component={Stream} hideNavBar hideTabBar={false} type={ActionConst.PUSH} />
                  <Scene key="traineeComposer" component={Composer} hideNavBar hideTabBar type={ActionConst.PUSH} />
                </Scene>
                <Scene key="traineeCalendar" component={Calendar} tabTitle="Calendar" icon={TabIcon} hideNavBar hideTabBar={false} />

              </Scene>

              <Scene
                key="groupAccount"
                tabs
                hideNavBar
                tabBarStyle={styles.tabBar}
                tabBarIconContainerStyle={styles.tabBarIconStyle}
                type={ActionConst.REPLACE}
              >
                <Scene key="groupStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
                  <Scene key="groupStream" component={Stream} hideNavBar hideTabBar={false} type={ActionConst.PUSH} />
                  <Scene key="groupComposer" component={Composer} hideNavBar hideTabBar type={ActionConst.PUSH} />
                </Scene>
                <Scene key="groupCalendar" component={Calendar} tabTitle="Calendar" icon={TabIcon} hideNavBar hideTabBar={false} />
              </Scene>

            </Scene>
          </Scene>
        </Scene>
      </RouterWithRedux>
    );
  }
}

function mapStateToProps(state) {
  return {
    // userName: selectors.getMyName(state),
    route: selectors.getRoute(state),
    myId: selectors.getMyId(state),
  };
}

const RootContainer = connect(
  mapStateToProps,
  // mapDispatchToProps
)(Root);

export default Root;

@joenoon
Copy link
Collaborator

joenoon commented Jul 31, 2016

I took a shot at making some modifications:

const RouterWithRedux = connect()(Router);

function isLoggedIn (props) {
  const token = props.me.get('token');
  const myId = props.me.get('myId');
  const gu = props.route.get('gu');
  const guid = props.route.get('guid');
  const rehydrated = props.route.get('rehydrated');

  if (!rehydrated) return 'splash';

  if (token && token !== '' && token !== constants.FETCHING) {
    if (gu && guid && myId) {
      return 'drawer';
    }
    return 'login';
  }
  return 'login';
}

function tabSceneSelector (props) {
  const myId = props.me.get('myId');
  const gu = props.route.get('gu');
  const guid = props.route.get('guid');

  if (gu === 'user') {
    if (guid === myId) {
      return 'myAccount';
    }
    if (!_.isNil(guid)) return 'traineeAccount';
  }
  if (gu === 'group') return 'groupAccount';
  return 'splash';
}

const scenes = Actions.create(
  <Scene key="root" hideNavBar hideTabBar>
    <Scene key="activity" clone component={Activity} hideNavBar hideTabBar type={ActionConst.PUSH} />
    <Scene
      key="switcher"
      // component={connect(state => state.get('me').toJS())(Switch)}
      component={connect(state => ({
        route: state.get('router'),
        me: state.get('me'),
      }))(Switch)}
      tabs
      initial
      unmountScenes
      type={ActionConst.REPLACE}
      selector={props => isLoggedIn(props)}
    >
      <Scene key="login" component={Login} title="Login" passProps hideNavBar />
      <Scene key="splash" component={Splash} title="Splash" hideNavBar hideTabBar />
      <Scene key="drawer" component={Drawer} open={false}>
        <Scene
          key="tabSwitch"
          component={connect(state => ({
            route: state.get('router'),
            me: state.get('me'),
          }))(Switch)}
          tabs
          unmountScenes
          selector={props => tabSceneSelector(props)}
          type={ActionConst.RESET}
        >
          <Scene
            key="myAccount"
            tabs
            hideNavBar
            hideTabBar={false}
            tabBarStyle={styles.tabBar}
            tabBarIconContainerStyle={styles.tabBarIconStyle}
            type={ActionConst.RESET}
          >
            <Scene key="dashboard" component={Dashboard} tabTitle="Dashboard" initial icon={TabIcon} hideNavBar hideTabBar={false} />
            <Scene key="myStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
              <Scene key="myStream" component={Stream} hideNavBar hideTabBar={false} />
              <Scene key="myComposer" component={Composer} hideNavBar hideTabBar type={ActionConst.PUSH} />
            </Scene>
            <Scene key="myCalendarContainer" tabTitle="Calendar" icon={TabIcon} hideNavBar hideTabBar={false} >
              <Scene key="myCalendar" component={Calendar} hideNavBar hideTabBar={false} />
              <Scene key="myActivity" component={Activity} hideNavBar hideTabBar type={ActionConst.PUSH} />
              <Scene key="actUserResponse" component={UserResponseView} title="Response" hideTabBar hideNavBar unmountScenes />
            </Scene>
            <Scene key="recorder" tabTitle="Record" icon={TabIcon} hideNavBar hideTabBar={false} >
              <Scene key="activityChooserView" component={ActivityChooserView} hideTabBar={false} initial hideNavBar />
              <Scene key="recorderView" component={Recorder} title="recorder" hideTabBar hideNavBar unmountScenes />
              <Scene key="userResponseView" component={UserResponseView} title="Response" hideTabBar hideNavBar unmountScenes />
            </Scene>
          </Scene>

          <Scene
            key="traineeAccount"
            tabs
            hideNavBar
            tabBarStyle={styles.tabBar}
            tabBarIconContainerStyle={styles.tabBarIconStyle}
            type={ActionConst.REPLACE}
          >
            <Scene key="traineeStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
              <Scene key="traineeStream" component={Stream} hideNavBar hideTabBar={false} type={ActionConst.PUSH} />
              <Scene key="traineeComposer" component={Composer} hideNavBar hideTabBar type={ActionConst.PUSH} />
            </Scene>
            <Scene key="traineeCalendar" component={Calendar} tabTitle="Calendar" icon={TabIcon} hideNavBar hideTabBar={false} />

          </Scene>

          <Scene
            key="groupAccount"
            tabs
            hideNavBar
            tabBarStyle={styles.tabBar}
            tabBarIconContainerStyle={styles.tabBarIconStyle}
            type={ActionConst.REPLACE}
          >
            <Scene key="groupStreamContainer" tabTitle="Stream" icon={TabIcon} hideNavBar hideTabBar={false}>
              <Scene key="groupStream" component={Stream} hideNavBar hideTabBar={false} type={ActionConst.PUSH} />
              <Scene key="groupComposer" component={Composer} hideNavBar hideTabBar type={ActionConst.PUSH} />
            </Scene>
            <Scene key="groupCalendar" component={Calendar} tabTitle="Calendar" icon={TabIcon} hideNavBar hideTabBar={false} />
          </Scene>

        </Scene>
      </Scene>
    </Scene>
  </Scene>
);

class Root extends React.Component {

  render() {
    return <RouterWithRedux scenes={scenes} />;
  }
}

function mapStateToProps(state) {
  return {
    // userName: selectors.getMyName(state),
    route: selectors.getRoute(state),
    myId: selectors.getMyId(state),
  };
}

const RootContainer = connect(
  mapStateToProps,
  // mapDispatchToProps
)(Root);

export default Root;
  1. Added a base "root" scene, and made the "activity" clone scene a direct child. Made "switcher" initial.
  2. Moved scene creation into Actions.create to ensure they only get created once.
  3. I'm not too sure about the need for type={ActionConst...} in so many places. I dont have any type= in my scenes so I would think you probably just want the defaults, unless you know you have to set them explicitly for your use case.

@kristojorg
Copy link
Author

THANK YOU SO MUCH!! It worked!

This was really quite kind of you. I now see that the problem was not declaring it high enough... when I tried it at the root earlier it kept rendering initially - and obviously I should have added initial to my switcher.

Thanks for the advice on the type props. I have been sort of passively debugging performance problems and tried that in a few places but never took them out. My app gets very slow as you use it. I think it must have to do with my redux selectors being expensive, or with not unmounting scenes when they are navigated away from. My battle plan there is

  1. Memoize redux selectors.
  2. Add shouldComponentUpdate short-circuits to scenes
  3. Try adding requestAnimationFrames to delay js work until after animations (especially drawer open/close).

If you have any experience with performance and have any suggestions what to look at I would appreciate the advice! I tried getting react-addons-perf to work so I could measure selector cost but it didn't seem to do much. Anyways, just thought I'd ask if you have any experience there.

Thank you again, owe you one.

@kristojorg
Copy link
Author

It seems I'm having a related issue now, however. Trying to push from one cloned scene to another cloned scene. The second scene renders according to my logs but is never actually displayed.... Any thoughts? I tried importing your Switch again but it wasn't that. Should I open a new issue?

@aksonov
Copy link
Owner

aksonov commented Aug 1, 2016

Could you submit PR for it? Any other custom code you use?

On 31 Jul 2016, at 19:44, Joe Noon [email protected] wrote:

@kristojorg https://github.com/kristojorg can you import this Switch instead of the Switch that comes with rnrf?

import { Actions, DefaultRenderer } from 'react-native-router-flux';

import React, { Component, PropTypes } from 'react';

export let Switch = class extends Component {

static propTypes = {
onNavigate: PropTypes.func,
};

constructor(props,context) {
super(props,context);
this.updateState = this.updateState.bind(this);
this.state = {};
}

componentDidMount() {
this.updateState(this.props);
}

componentWillReceiveProps(props) {
this.updateState(props);
}

updateState(props) {
const navState = props.navigationState;

const selector = props.selector;
if (!selector) console.error('Selector should be defined.');

const selectedKey = selector(props);
if (!selectedKey) console.error('Selector should return key.');

const selected = navState.children.filter(el => el.sceneKey === selectedKey);
if (!selected) console.error(`A scene for key “${selectedKey}” does not exist.`);

const navigationState = selected[0];
if (!navigationState) console.error(`Cannot find a scene with key “${selectedKey}”`);

if (navigationState.key !== navState.children[navState.index].key) {
  Actions[selectedKey]();
}

this.setState({ navigationState });

}

render() {
if (this.state.navigationState) {
return (

);
}

return null;

}
};
That is basically an older version of the Switch component that I still use, because for some reason the one that now comes with rnrf doesn't work for me. I wonder if we have the same issue.

Just import this Switch i.e. import {Switch} from './mySwitch'; instead of the one from react-native-router-flux. Look forward to hearing if that solves your issue.


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub #976 (comment), or mute the thread https://github.com/notifications/unsubscribe-auth/ABQpcXH7NHMBzlgK1mTDTSIzwk1ttj_Bks5qbN71gaJpZM4JVs92.

@joenoon
Copy link
Collaborator

joenoon commented Aug 1, 2016

Could you submit PR for it? Any other custom code you use?

@aksonov that old Switch is the only custom code I use on top of 3.31. I tried to figure it out once but never solved it.

From memory: On initial app load with a typical logged in / logged out Switch scene setup, my app would be on the "home" screen. I would then try to push a clone scene, and nothing would appear to happen.

The farthest I tracked it down to was: the state that was being seen by the failing push action was not correct (maybe wrong indexes and/or parent).

If I switch tabs first, THEN push my clone scene, it works fine. This makes me think I'm landing in a corrupt state, but by clicking a tab the reducer runs again the state is somehow corrected.

So I started looking into Switch for changes. What stuck out to me was it used to call Actions[key](), and now it doesn't. So my best guess was to just use the old Switch in my app, and that solved my issue.

I tried to figure out why state was incorrect on landing but correct after switching tabs back and forth, and never found a fix. I was thinking this was only related to clone scenes but its possibly other scenarios too.

ref #952

@aksonov
Copy link
Owner

aksonov commented Aug 1, 2016

Let's revert to old Switch. I thought calling Actions[key] was redundant and slows things down (and such version works well for me), but it (new version) seems don't work for some people.

@joenoon
Copy link
Collaborator

joenoon commented Aug 1, 2016

I can create a PR for the old-style Switch, but the current one has some stuff in there that would be lost:

  • the non-selector statem way
  • unmountScenes

I've never used either of those so I'd need to figure out how they work if they need to be migrated back into Switch.

Are both of those necessary going forward?

@aksonov
Copy link
Owner

aksonov commented Aug 1, 2016

statem is moved to mobx, so it is not need (it is not documented anyway), but unmountScenes looks very useful, so we need to merge it...

@joenoon
Copy link
Collaborator

joenoon commented Aug 1, 2016

Ok ill take a look now

@kristojorg
Copy link
Author

I figured out my question regarding pushing a second cloned route. Thanks for your help with all this.

I do have a question about cloning tabs however. In the snippet below, I would like to not have to redeclare the nested Scenes within the tabs, but I have to declare something inside of them so the tab knows what to render initially.

You can see in this snippet that I have one tab which is only displayed in the myAccount scene (the key="dashboard" tab). In order to make this happen, I had to duplicate the Calendar and Stream tab scenes and their initial children. I can then push my cloned routes into those tabs, but I can't clone an entire tab because there is no way to define the initial scene for it.

<Scene key="root">
  <Scene key="activity" clone component={Activity} />
  <Scene key="userResponse" clone component={UserResponse} />
  <Scene key="composer" clone component={Composer} />

  <Scene
    key="tabSwitch"
    component={connect(state => ({
      route: state.get('router'),
      me: state.get('me'),
    }))(Switch)}
    tabs
    initial
    selector={properties => this.tabSceneSelector(properties)}
  >

    <Scene key="myAccount" tabs >
      <Scene key="dashboard" component={Dashboard} />
      <Scene key="myStreamContainer" icon={TabIcon} >
        <Scene key="traineeStream" component={Stream} />
      </Scene>
      <Scene key="myCalendarContainer" component={Calendar} icon={TabIcon} >
        <Scene key="myCalendar" component={Calendar} />
      </Scene>
    </Scene>

    <Scene key="traineeAccount" tabs >
      <Scene key="traineeStreamContainer" icon={TabIcon} >
        <Scene key="traineeStream" component={Stream} />
      </Scene>
      <Scene key="traineeCalendarContainer" component={Calendar} icon={TabIcon} >
        <Scene key="traineeCalendar" component={Calendar} />
      </Scene>
    </Scene>

  </Scene> 
</Scene>

My solution to this would be one of two approaches:

  1. A mechanism to show/hide tab scenes based on some redux state (instead of Switch, which requires me to redefine each tab scene for each case)
  2. A mechanism to declare cloned scene groups outside of the Root and then use them within Root... that would look something like:
const ClonedStreamTab = (
  <Scene key="streamContainer" icon={TabIcon} >
    <Scene key="Stream" component={Stream} />
  </Scene>
);

const ClonedCalendarTab =(
  <Scene key="calendarContainer" component={Calendar} icon={TabIcon} >
    <Scene key="calendar" component={Calendar} />
  </Scene>
);

<Scene key="root">
  <Scene key="activity" clone component={Activity} />
  <Scene key="userResponse" clone component={UserResponse} />
  <Scene key="composer" clone component={Composer} />

  <Scene
    key="tabSwitch"
    component={connect(state => ({
      route: state.get('router'),
      me: state.get('me'),
    }))(Switch)}
    tabs
    initial
    selector={properties => this.tabSceneSelector(properties)}
  >

    <Scene key="myAccount" tabs >
      <Scene key="dashboard" component={Dashboard} />
      <ClonedStreamTab />
      <ClonedCalendarTab />
    </Scene>

    <Scene key="traineeAccount" tabs >
      <ClonedStreamTab />
      <ClonedCalendarTab />
    </Scene>

  </Scene> 
</Scene>

Am curious to hear your thoughts about the best way to handle this type of logic/nesting.

aksonov added a commit that referenced this issue Jul 8, 2017
…#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,#32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,#48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,#64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,#80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,#96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,#112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,#128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#138,#139,#140,#141,#142,#143,#144,#145,#146,#147,#148,#149,#150,#151,#152,#153,#154,#155,#156,#157,#158,#159,#160,#161,#162,#163,#164,#165,#166,#167,#168,#169,#170,#171,#172,#173,#174,#175,#176,#177,#178,#179,#180,#181,#182,#183,#184,#185,#186,#187,#188,#189,#190,#191,#192,#193,#194,#195,#196,#197,#198,#199,#200,#201,#202,#203,#204,#205,#206,#207,#208,#209,#210,#211,#212,#213,#214,#215,#216,#217,#218,#219,#220,#221,#222,#223,#224,#225,#226,#227,#228,#229,#230,#231,#232,#233,#234,#235,#236,#237,#238,#239,#240,#241,#242,#243,#244,#245,#246,#247,#248,#249,#250,#251,#252,#253,#254,#255,#256,#257,#258,#259,#260,#261,#262,#263,#264,#265,#266,#267,#268,#269,#270,#271,#272,#273,#274,#275,#276,#277,#278,#279,#280,#281,#282,#283,#284,#285,#286,#287,#288,#289,#290,#291,#292,#293,#294,#295,#296,#297,#298,#299,#300,#301,#302,#303,#304,#305,#306,#307,#308,#309,#310,#311,#312,#313,#314,#315,#316,#317,#318,#319,#320,#321,#322,#323,#324,#325,#326,#327,#328,#329,#330,#331,#332,#333,#334,#335,#336,#337,#338,#339,#340,#341,#342,#343,#344,#345,#346,#347,#348,#349,#350,#351,#352,#353,#354,#355,#356,#357,#358,#359,#360,#361,#362,#363,#364,#365,#366,#367,#368,#369,#370,#371,#372,#373,#374,#375,#376,#377,#378,#379,#380,#381,#382,#383,#384,#385,#386,#387,#388,#389,#390,#391,#392,#393,#394,#395,#396,#397,#398,#399,#400,#401,#402,#403,#404,#405,#406,#407,#408,#409,#410,#411,#412,#413,#414,#415,#416,#417,#418,#419,#420,#421,#422,#423,#424,#425,#426,#427,#428,#429,#430,#431,#432,#433,#434,#435,#436,#437,#438,#439,#440,#441,#442,#443,#444,#445,#446,#447,#448,#449,#450,#451,#452,#453,#454,#455,#456,#457,#458,#459,#460,#461,#462,#463,#464,#465,#466,#467,#468,#469,#470,#471,#472,#473,#474,#475,#476,#477,#478,#479,#480,#481,#482,#483,#484,#485,#486,#487,#488,#489,#490,#491,#492,#493,#494,#495,#496,#497,#498,#499,#500,#501,#502,#503,#504,#505,#506,#507,#508,#509,#510,#511,#512,#513,#514,#515,#516,#517,#518,#519,#520,#521,#522,#523,#524,#525,#526,#527,#528,#529,#530,#531,#532,#533,#534,#535,#536,#537,#538,#539,#540,#541,#542,#543,#544,#545,#546,#547,#548,#549,#550,#551,#552,#553,#554,#555,#556,#557,#558,#559,#560,#561,#562,#563,#564,#565,#566,#567,#568,#569,#570,#571,#572,#573,#574,#575,#576,#577,#578,#579,#580,#581,#582,#583,#584,#585,#586,#587,#588,#589,#590,#591,#592,#593,#594,#595,#596,#597,#598,#599,#600,#601,#602,#603,#604,#605,#606,#607,#608,#609,#610,#611,#612,#613,#614,#615,#616,#617,#618,#619,#620,#621,#622,#623,#624,#625,#626,#627,#628,#629,#630,#631,#632,#633,#634,#635,#636,#637,#638,#639,#640,#641,#642,#643,#644,#645,#646,#647,#648,#649,#650,#651,#652,#653,#654,#655,#656,#657,#658,#659,#660,#661,#662,#663,#664,#665,#666,#667,#668,#669,#670,#671,#672,#673,#674,#675,#676,#677,#678,#679,#680,#681,#682,#683,#684,#685,#686,#687,#688,#689,#690,#691,#692,#693,#694,#695,#696,#697,#698,#699,#700,#701,#702,#703,#704,#705,#706,#707,#708,#709,#710,#711,#712,#713,#714,#715,#716,#717,#718,#719,#720,#721,#722,#723,#724,#725,#726,#727,#728,#729,#730,#731,#732,#733,#734,#735,#736,#737,#738,#739,#740,#741,#742,#743,#744,#745,#746,#747,#748,#749,#750,#751,#752,#753,#754,#755,#756,#757,#758,#759,#760,#761,#762,#763,#764,#765,#766,#767,#768,#769,#770,#771,#772,#773,#774,#775,#776,#777,#778,#779,#780,#781,#782,#783,#784,#785,#786,#787,#788,#789,#790,#791,#792,#793,#794,#795,#796,#797,#798,#799,#800,#801,#802,#803,#804,#805,#806,#807,#808,#809,#810,#811,#812,#813,#814,#815,#816,#817,#818,#819,#820,#821,#822,#823,#824,#825,#826,#827,#828,#829,#830,#831,#832,#833,#834,#835,#836,#837,#838,#839,#840,#841,#842,#843,#844,#845,#846,#847,#848,#849,#850,#851,#852,#853,#854,#855,#856,#857,#858,#859,#860,#861,#862,#863,#864,#865,#866,#867,#868,#869,#870,#871,#872,#873,#874,#875,#876,#877,#878,#879,#880,#881,#882,#883,#884,#885,#886,#887,#888,#889,#890,#891,#892,#893,#894,#895,#896,#897,#898,#899,#900,#901,#902,#903,#904,#905,#906,#907,#908,#909,#910,#911,#912,#913,#914,#915,#916,#917,#918,#919,#920,#921,#922,#923,#924,#925,#926,#927,#928,#929,#930,#931,#932,#933,#934,#935,#936,#937,#938,#939,#940,#941,#942,#943,#944,#945,#946,#947,#948,#949,#950,#951,#952,#953,#954,#955,#956,#957,#958,#959,#960,#961,#962,#963,#964,#965,#966,#967,#968,#969,#970,#971,#972,#973,#974,#975,#976,#977,#978,#979,#980,#981,#982,#983,#984,#985,#986,#987,#988,#989,#990,#991,#992,#993,#994,#995,#996,#997,#998,#999,#1000,#1001,#1002,#1003,#1004,#1005,#1006,#1007,#1008,#1009,#1010,#1011,#1012,#1013,#1014,#1015,#1016,#1017,#1018,#1019,#1020,#1021,#1022,#1023,#1024,#1025,#1026,#1027,#1028,#1029,#1030,#1031,#1032,#1033,#1034,#1035,#1036,#1037,#1038,#1039,#1040,#1041,#1042,#1043,#1044,#1045,#1046,#1047,#1048,#1049,#1050,#1051,#1052,#1053,#1054,#1055,#1056,#1057,#1058,#1059,#1060,#1061,#1062,#1063,#1064,#1065,#1066,#1067,#1068,#1069,#1070,#1071,#1072,#1073,#1074,#1075,#1076,#1077,#1078,#1079,#1080,#1081,#1082,#1083,#1084,#1085,#1086,#1087,#1088,#1089,#1090,#1091,#1092,#1093,#1094,#1095,#1096,#1097,#1098,#1099,#1100,#1101,#1102,#1103,#1104,#1105,#1106,#1107,#1108,#1109,#1110,#1111,#1112,#1113,#1114,#1115,#1116,#1117,#1118,#1119,#1120,#1121,#1122,#1123,#1124,#1125,#1126,#1127,#1128,#1129,#1130,#1131,#1132,#1133,#1134,#1135,#1136,#1137,#1138,#1139,#1140,#1141,#1142,#1143,#1144,#1145,#1146,#1147,#1148,#1149,#1150,#1151,#1152,#1153,#1154,#1155,#1156,#1157,#1158,#1159,#1160,#1161,#1162,#1163,#1164,#1165,#1166,#1167,#1168,#1169,#1170,#1171,#1172,#1173,#1174,#1175,#1176,#1177,#1178,#1179,#1180,#1181,#1182,#1183,#1184,#1185,#1186,#1187,#1188,#1189,#1190,#1191,#1192,#1193,#1194,#1195,#1196,#1197,#1198,#1199,#1200,#1201,#1202,#1203,#1204,#1205,#1206,#1207,#1208,#1209,#1210,#1211,#1212,#1213,#1214,#1215,#1216,#1217,#1218,#1219,#1220,#1221,#1222,#1223,#1224,#1225,#1226,#1227,#1228,#1229,#1230,#1231,#1232,#1233,#1234,#1235,#1236,#1237,#1238,#1239,#1240,#1241,#1242,#1243,#1244,#1245,#1246,#1247,#1248,#1249,#1250,#1251,#1252,#1253,#1254,#1255,#1256,#1257,#1258,#1259,#1260,#1261,#1262,#1263,#1264,#1265,#1266,#1267,#1268,#1269,#1270,#1271,#1272,#1273,#1274,#1275,#1276,#1277,#1278,#1279,#1280,#1281,#1282,#1283,#1284,#1285,#1286,#1287,#1288,#1289,#1290,#1291,#1292,#1293,#1294,#1295,#1296,#1297,#1298,#1299,#1300,#1301,#1302,#1303,#1304,#1305,#1306,#1307,#1308,#1309,#1310,#1311,#1312,#1313,#1314,#1315,#1316,#1317,#1318,#1319,#1320,#1321,#1322,#1323,#1324,#1325,#1326,#1327,#1328,#1329,#1330,#1331,#1332,#1333,#1334,#1335,#1336,#1337,#1338,#1339,#1340,#1341,#1342,#1343,#1344,#1345,#1346,#1347,#1348,#1349,#1350,#1351,#1352,#1353,#1354,#1355,#1356,#1357,#1358,#1359,#1360,#1361,#1362,#1363,#1364,#1365,#1366,#1367,#1368,#1369,#1370,#1371,#1372,#1373,#1374,#1375,#1376,#1377,#1378,#1379,#1380,#1381,#1382,#1383,#1384,#1385,#1386,#1387,#1388,#1389,#1390,#1391,#1392,#1393,#1394,#1395,#1396,#1397,#1398,#1399,#1400,#1401,#1402,#1403,#1404,#1405,#1406,#1407,#1408,#1409,#1410,#1411,#1412,#1413,#1414,#1415,#1416,#1417,#1418,#1419,#1420,#1421,#1422,#1423,#1424,#1425,#1426,#1427,#1428,#1429,#1430,#1431,#1432,#1433,#1434,#1435,#1436,#1437,#1438,#1439,#1440,#1441,#1442,#1443,#1444,#1445,#1446,#1447,#1448,#1449,#1450,#1451,#1452,#1453,#1454,#1455,#1456,#1457,#1458,#1459,#1460,#1461,#1462,#1463,#1464,#1465,#1466,#1467,#1468,#1469,#1470,#1471,#1472,#1473,#1474,#1475,#1476,#1477,#1478,#1479,#1480,#1481,#1482,#1483,#1484,#1485,#1486,#1487,#1488,#1489,#1490,#1491,#1492,#1493,#1494,#1495,#1496,#1497,#1498,#1499,#1500,#1501,#1502,#1503,#1504,#1505,#1506,#1507,#1508,#1509,#1510,#1511,#1512,#1513,#1514,#1515,#1516,#1517,#1518,#1519,#1520,#1521,#1522,#1523,#1524,#1525,#1526,#1527,#1528,#1529,#1530,#1531,#1532,#1533,#1534,#1535,#1536,#1537,#1538,#1539,#1540,#1541,#1542,#1543,#1544,#1545,#1546,#1547,#1548,#1549,#1550,#1551,#1552,#1553,#1554,#1555,#1556,#1557,#1558,#1559,#1560,#1561,#1562,#1563,#1564,#1565,#1566,#1567,#1568,#1569,#1570,#1571,#1572,#1573,#1574,#1575,#1576,#1577,#1578,#1579,#1580,#1581,#1582,#1583,#1584,#1585,#1586,#1587,#1588,#1589,#1590,#1591,#1592,#1593,#1594,#1595,#1596,#1597,#1598,#1599,#1600,#1601,#1602,#1603,#1604,#1605,#1606,#1607,#1608,#1609,#1610,#1611,#1612,#1613,#1614,#1615,#1616,#1617,#1618,#1619,#1620,#1621,#1622,#1623,#1624,#1625,#1626,#1627,#1628,#1629,#1630,#1631,#1632,#1633,#1634,#1635,#1636,#1637,#1638,#1639,#1640,#1641,#1642,#1643,#1644,#1645,#1646,#1647,#1648,#1649,#1650,#1651,#1652,#1653,#1654,#1655,#1656,#1657,#1658,#1659,#1660,#1661,#1662,#1663,#1664,#1665,#1666,#1667,#1668,#1669,#1670,#1671,#1672,#1673,#1674,#1675,#1676,#1677,#1678,#1679,#1680,#1681,#1682,#1683,#1684,#1685,#1686,#1687,#1688,#1689,#1690,#1691,#1692,#1693,#1694,#1695,#1696,#1697,#1698,#1699,#1700,#1701,#1702,#1703,#1704,#1705,#1706,#1707,#1708,#1709,#1710,#1711,#1712,#1713,#1714,#1715,#1716,#1717,#1718,#1719,#1720,#1721,#1722,#1723,#1724,#1725,#1726,#1727,#1728,#1729,#1730,#1731,#1732,#1733,#1734,#1735,#1736,#1737,#1738,#1739,#1740,#1741,#1742,#1743,#1744,#1745,#1746,#1747,#1748,#1749,#1750,#1751,#1752,#1753,#1754,#1755,#1756,#1757,#1758,#1759,#1760,#1761,#1762,#1763,#1764,#1765,#1766,#1767,#1768,#1769,#1770,#1771,#1772,#1773,#1774,#1775,#1776,#1777,#1778,#1779,#1780,#1781,#1782,#1783,#1784,#1785,#1786,#1787,#1788,#1789,#1790,#1791,#1792,#1793,#1794,#1795,#1796,#1797,#1798,#1799,#1800,#1801,#1802,#1803,#1804,#1805,#1806,#1807,#1808,#1809,#1810,#1811,#1812,#1813,#1814,#1815,#1816,#1817,#1818,#1819,#1820,#1821,#1822,#1823,#1824,#1825,#1826,#1827,#1828,#1829,#1830,#1831,#1832,#1833,#1834,#1835,#1836,#1837,#1838,#1839,#1840,#1841,#1842,#1843,#1844,#1845,#1846,#1847,#1848,#1849,#1850,#1851,#1852,#1853,#1854,#1855,#1856,#1857,#1858,#1859,#1860,#1861,#1862,#1863,#1864,#1865,#1866,#1867,#1868,#1869,#1870,#1871,#1872,#1873,#1874,#1875,#1876,#1877,#1878,#1879,#1880,#1881,#1882,#1883,#1884,#1885,#1886,#1887,#1888,#1889,#1890,#1891,#1892,#1893,#1894,#1895,#1896,#1897,#1898,#1899,#1900,#1901,#1902,#1903,#1904,#1905,#1906,#1907,#1908,#1909,#1910,#1911,#1912,#1913,#1914,#1915,#1916,#1917,#1918,#1919,#1920,#1921,#1922,#1923,#1924,#1925,#1926,#1927,#1928,#1929,#1930,#1931,#1932,#1933,#1934,#1935,#1936,#1937,#1938,#1939,#1940,#1941,#1942,#1943,#1944,#1945,#1946,#1947,#1948,#1949,#1950,#1951,#1952,#1953,#1954,#1955,#1956,#1957,#1958,#1959,#1960,#1961,#1962,#1963,#1964,#1965,#1966,#1967,#1968,#1969,#1970,#1971,#1972,#1973

V4 announcement, v3 is obsolete now.
aksonov added a commit that referenced this issue Jul 8, 2017
…loses #7,closes #8,closes #9,closes #10,closes #11,closes #12,closes #13,closes #14,closes #15,closes #16,closes #17,closes #18,closes #19,closes #20,closes #21,closes #22,closes #23,closes #24,closes #25,closes #26,closes #27,closes #28,closes #29,closes #30,closes #31,closes #32,closes #33,closes #34,closes #35,closes #36,closes #37,closes #38,closes #39,closes #40,closes #41,closes #42,closes #43,closes #44,closes #45,closes #46,closes #47,closes #48,closes #49,closes #50,closes #51,closes #52,closes #53,closes #54,closes #55,closes #56,closes #57,closes #58,closes #59,closes #60,closes #61,closes #62,closes #63,closes #64,closes #65,closes #66,closes #67,closes #68,closes #69,closes #70,closes #71,closes #72,closes #73,closes #74,closes #75,closes #76,closes #77,closes #78,closes #79,closes #80,closes #81,closes #82,closes #83,closes #84,closes #85,closes #86,closes #87,closes #88,closes #89,closes #90,closes #91,closes #92,closes #93,closes #94,closes #95,closes #96,closes #97,closes #98,closes #99,closes #100,closes #101,closes #102,closes #103,closes #104,closes #105,closes #106,closes #107,closes #108,closes #109,closes #110,closes #111,closes #112,closes #113,closes #114,closes #115,closes #116,closes #117,closes #118,closes #119,closes #120,closes #121,closes #122,closes #123,closes #124,closes #125,closes #126,closes #127,closes #128,closes #129,closes #130,closes #131,closes #132,closes #133,closes #134,closes #135,closes #136,closes #137,closes #138,closes #139,closes #140,closes #141,closes #142,closes #143,closes #144,closes #145,closes #146,closes #147,closes #148,closes #149,closes #150,closes #151,closes #152,closes #153,closes #154,closes #155,closes #156,closes #157,closes #158,closes #159,closes #160,closes #161,closes #162,closes #163,closes #164,closes #165,closes #166,closes #167,closes #168,closes #169,closes #170,closes #171,closes #172,closes #173,closes #174,closes #175,closes #176,closes #177,closes #178,closes #179,closes #180,closes #181,closes #182,closes #183,closes #184,closes #185,closes #186,closes #187,closes #188,closes #189,closes #190,closes #191,closes #192,closes #193,closes #194,closes #195,closes #196,closes #197,closes #198,closes #199,closes #200,closes #201,closes #202,closes #203,closes #204,closes #205,closes #206,closes #207,closes #208,closes #209,closes #210,closes #211,closes #212,closes #213,closes #214,closes #215,closes #216,closes #217,closes #218,closes #219,closes #220,closes #221,closes #222,closes #223,closes #224,closes #225,closes #226,closes #227,closes #228,closes #229,closes #230,closes #231,closes #232,closes #233,closes #234,closes #235,closes #236,closes #237,closes #238,closes #239,closes #240,closes #241,closes #242,closes #243,closes #244,closes #245,closes #246,closes #247,closes #248,closes #249,closes #250,closes #251,closes #252,closes #253,closes #254,closes #255,closes #256,closes #257,closes #258,closes #259,closes #260,closes #261,closes #262,closes #263,closes #264,closes #265,closes #266,closes #267,closes #268,closes #269,closes #270,closes #271,closes #272,closes #273,closes #274,closes #275,closes #276,closes #277,closes #278,closes #279,closes #280,closes #281,closes #282,closes #283,closes #284,closes #285,closes #286,closes #287,closes #288,closes #289,closes #290,closes #291,closes #292,closes #293,closes #294,closes #295,closes #296,closes #297,closes #298,closes #299,closes #300,closes #301,closes #302,closes #303,closes #304,closes #305,closes #306,closes #307,closes #308,closes #309,closes #310,closes #311,closes #312,closes #313,closes #314,closes #315,closes #316,closes #317,closes #318,closes #319,closes #320,closes #321,closes #322,closes #323,closes #324,closes #325,closes #326,closes #327,closes #328,closes #329,closes #330,closes #331,closes #332,closes #333,closes #334,closes #335,closes #336,closes #337,closes #338,closes #339,closes #340,closes #341,closes #342,closes #343,closes #344,closes #345,closes #346,closes #347,closes #348,closes #349,closes #350,closes #351,closes #352,closes #353,closes #354,closes #355,closes #356,closes #357,closes #358,closes #359,closes #360,closes #361,closes #362,closes #363,closes #364,closes #365,closes #366,closes #367,closes #368,closes #369,closes #370,closes #371,closes #372,closes #373,closes #374,closes #375,closes #376,closes #377,closes #378,closes #379,closes #380,closes #381,closes #382,closes #383,closes #384,closes #385,closes #386,closes #387,closes #388,closes #389,closes #390,closes #391,closes #392,closes #393,closes #394,closes #395,closes #396,closes #397,closes #398,closes #399,closes #400,closes #401,closes #402,closes #403,closes #404,closes #405,closes #406,closes #407,closes #408,closes #409,closes #410,closes #411,closes #412,closes #413,closes #414,closes #415,closes #416,closes #417,closes #418,closes #419,closes #420,closes #421,closes #422,closes #423,closes #424,closes #425,closes #426,closes #427,closes #428,closes #429,closes #430,closes #431,closes #432,closes #433,closes #434,closes #435,closes #436,closes #437,closes #438,closes #439,closes #440,closes #441,closes #442,closes #443,closes #444,closes #445,closes #446,closes #447,closes #448,closes #449,closes #450,closes #451,closes #452,closes #453,closes #454,closes #455,closes #456,closes #457,closes #458,closes #459,closes #460,closes #461,closes #462,closes #463,closes #464,closes #465,closes #466,closes #467,closes #468,closes #469,closes #470,closes #471,closes #472,closes #473,closes #474,closes #475,closes #476,closes #477,closes #478,closes #479,closes #480,closes #481,closes #482,closes #483,closes #484,closes #485,closes #486,closes #487,closes #488,closes #489,closes #490,closes #491,closes #492,closes #493,closes #494,closes #495,closes #496,closes #497,closes #498,closes #499,closes #500,closes #501,closes #502,closes #503,closes #504,closes #505,closes #506,closes #507,closes #508,closes #509,closes #510,closes #511,closes #512,closes #513,closes #514,closes #515,closes #516,closes #517,closes #518,closes #519,closes #520,closes #521,closes #522,closes #523,closes #524,closes #525,closes #526,closes #527,closes #528,closes #529,closes #530,closes #531,closes #532,closes #533,closes #534,closes #535,closes #536,closes #537,closes #538,closes #539,closes #540,closes #541,closes #542,closes #543,closes #544,closes #545,closes #546,closes #547,closes #548,closes #549,closes #550,closes #551,closes #552,closes #553,closes #554,closes #555,closes #556,closes #557,closes #558,closes #559,closes #560,closes #561,closes #562,closes #563,closes #564,closes #565,closes #566,closes #567,closes #568,closes #569,closes #570,closes #571,closes #572,closes #573,closes #574,closes #575,closes #576,closes #577,closes #578,closes #579,closes #580,closes #581,closes #582,closes #583,closes #584,closes #585,closes #586,closes #587,closes #588,closes #589,closes #590,closes #591,closes #592,closes #593,closes #594,closes #595,closes #596,closes #597,closes #598,closes #599,closes #600,closes #601,closes #602,closes #603,closes #604,closes #605,closes #606,closes #607,closes #608,closes #609,closes #610,closes #611,closes #612,closes #613,closes #614,closes #615,closes #616,closes #617,closes #618,closes #619,closes #620,closes #621,closes #622,closes #623,closes #624,closes #625,closes #626,closes #627,closes #628,closes #629,closes #630,closes #631,closes #632,closes #633,closes #634,closes #635,closes #636,closes #637,closes #638,closes #639,closes #640,closes #641,closes #642,closes #643,closes #644,closes #645,closes #646,closes #647,closes #648,closes #649,closes #650,closes #651,closes #652,closes #653,closes #654,closes #655,closes #656,closes #657,closes #658,closes #659,closes #660,closes #661,closes #662,closes #663,closes #664,closes #665,closes #666,closes #667,closes #668,closes #669,closes #670,closes #671,closes #672,closes #673,closes #674,closes #675,closes #676,closes #677,closes #678,closes #679,closes #680,closes #681,closes #682,closes #683,closes #684,closes #685,closes #686,closes #687,closes #688,closes #689,closes #690,closes #691,closes #692,closes #693,closes #694,closes #695,closes #696,closes #697,closes #698,closes #699,closes #700,closes #701,closes #702,closes #703,closes #704,closes #705,closes #706,closes #707,closes #708,closes #709,closes #710,closes #711,closes #712,closes #713,closes #714,closes #715,closes #716,closes #717,closes #718,closes #719,closes #720,closes #721,closes #722,closes #723,closes #724,closes #725,closes #726,closes #727,closes #728,closes #729,closes #730,closes #731,closes #732,closes #733,closes #734,closes #735,closes #736,closes #737,closes #738,closes #739,closes #740,closes #741,closes #742,closes #743,closes #744,closes #745,closes #746,closes #747,closes #748,closes #749,closes #750,closes #751,closes #752,closes #753,closes #754,closes #755,closes #756,closes #757,closes #758,closes #759,closes #760,closes #761,closes #762,closes #763,closes #764,closes #765,closes #766,closes #767,closes #768,closes #769,closes #770,closes #771,closes #772,closes #773,closes #774,closes #775,closes #776,closes #777,closes #778,closes #779,closes #780,closes #781,closes #782,closes #783,closes #784,closes #785,closes #786,closes #787,closes #788,closes #789,closes #790,closes #791,closes #792,closes #793,closes #794,closes #795,closes #796,closes #797,closes #798,closes #799,closes #800,closes #801,closes #802,closes #803,closes #804,closes #805,closes #806,closes #807,closes #808,closes #809,closes #810,closes #811,closes #812,closes #813,closes #814,closes #815,closes #816,closes #817,closes #818,closes #819,closes #820,closes #821,closes #822,closes #823,closes #824,closes #825,closes #826,closes #827,closes #828,closes #829,closes #830,closes #831,closes #832,closes #833,closes #834,closes #835,closes #836,closes #837,closes #838,closes #839,closes #840,closes #841,closes #842,closes #843,closes #844,closes #845,closes #846,closes #847,closes #848,closes #849,closes #850,closes #851,closes #852,closes #853,closes #854,closes #855,closes #856,closes #857,closes #858,closes #859,closes #860,closes #861,closes #862,closes #863,closes #864,closes #865,closes #866,closes #867,closes #868,closes #869,closes #870,closes #871,closes #872,closes #873,closes #874,closes #875,closes #876,closes #877,closes #878,closes #879,closes #880,closes #881,closes #882,closes #883,closes #884,closes #885,closes #886,closes #887,closes #888,closes #889,closes #890,closes #891,closes #892,closes #893,closes #894,closes #895,closes #896,closes #897,closes #898,closes #899,closes #900,closes #901,closes #902,closes #903,closes #904,closes #905,closes #906,closes #907,closes #908,closes #909,closes #910,closes #911,closes #912,closes #913,closes #914,closes #915,closes #916,closes #917,closes #918,closes #919,closes #920,closes #921,closes #922,closes #923,closes #924,closes #925,closes #926,closes #927,closes #928,closes #929,closes #930,closes #931,closes #932,closes #933,closes #934,closes #935,closes #936,closes #937,closes #938,closes #939,closes #940,closes #941,closes #942,closes #943,closes #944,closes #945,closes #946,closes #947,closes #948,closes #949,closes #950,closes #951,closes #952,closes #953,closes #954,closes #955,closes #956,closes #957,closes #958,closes #959,closes #960,closes #961,closes #962,closes #963,closes #964,closes #965,closes #966,closes #967,closes #968,closes #969,closes #970,closes #971,closes #972,closes #973,closes #974,closes #975,closes #976,closes #977,closes #978,closes #979,closes #980,closes #981,closes #982,closes #983,closes #984,closes #985,closes #986,closes #987,closes #988,closes #989,closes #990,closes #991,closes #992,closes #993,closes #994,closes #995,closes #996,closes #997,closes #998,closes #999,closes #1000,closes #1001,closes #1002,closes #1003,closes #1004,closes #1005,closes #1006,closes #1007,closes #1008,closes #1009,closes #1010,closes #1011,closes #1012,closes #1013,closes #1014,closes #1015,closes #1016,closes #1017,closes #1018,closes #1019,closes #1020,closes #1021,closes #1022,closes #1023,closes #1024,closes #1025,closes #1026,closes #1027,closes #1028,closes #1029,closes #1030,closes #1031,closes #1032,closes #1033,closes #1034,closes #1035,closes #1036,closes #1037,closes #1038,closes #1039,closes #1040,closes #1041,closes #1042,closes #1043,closes #1044,closes #1045,closes #1046,closes #1047,closes #1048,closes #1049,closes #1050,closes #1051,closes #1052,closes #1053,closes #1054,closes #1055,closes #1056,closes #1057,closes #1058,closes #1059,closes #1060,closes #1061,closes #1062,closes #1063,closes #1064,closes #1065,closes #1066,closes #1067,closes #1068,closes #1069,closes #1070,closes #1071,closes #1072,closes #1073,closes #1074,closes #1075,closes #1076,closes #1077,closes #1078,closes #1079,closes #1080,closes #1081,closes #1082,closes #1083,closes #1084,closes #1085,closes #1086,closes #1087,closes #1088,closes #1089,closes #1090,closes #1091,closes #1092,closes #1093,closes #1094,closes #1095,closes #1096,closes #1097,closes #1098,closes #1099,closes #1100,closes #1101,closes #1102,closes #1103,closes #1104,closes #1105,closes #1106,closes #1107,closes #1108,closes #1109,closes #1110,closes #1111,closes #1112,closes #1113,closes #1114,closes #1115,closes #1116,closes #1117,closes #1118,closes #1119,closes #1120,closes #1121,closes #1122,closes #1123,closes #1124,closes #1125,closes #1126,closes #1127,closes #1128,closes #1129,closes #1130,closes #1131,closes #1132,closes #1133,closes #1134,closes #1135,closes #1136,closes #1137,closes #1138,closes #1139,closes #1140,closes #1141,closes #1142,closes #1143,closes #1144,closes #1145,closes #1146,closes #1147,closes #1148,closes #1149,closes #1150,closes #1151,closes #1152,closes #1153,closes #1154,closes #1155,closes #1156,closes #1157,closes #1158,closes #1159,closes #1160,closes #1161,closes #1162,closes #1163,closes #1164,closes #1165,closes #1166,closes #1167,closes #1168,closes #1169,closes #1170,closes #1171,closes #1172,closes #1173,closes #1174,closes #1175,closes #1176,closes #1177,closes #1178,closes #1179,closes #1180,closes #1181,closes #1182,closes #1183,closes #1184,closes #1185,closes #1186,closes #1187,closes #1188,closes #1189,closes #1190,closes #1191,closes #1192,closes #1193,closes #1194,closes #1195,closes #1196,closes #1197,closes #1198,closes #1199,closes #1200,closes #1201,closes #1202,closes #1203,closes #1204,closes #1205,closes #1206,closes #1207,closes #1208,closes #1209,closes #1210,closes #1211,closes #1212,closes #1213,closes #1214,closes #1215,closes #1216,closes #1217,closes #1218,closes #1219,closes #1220,closes #1221,closes #1222,closes #1223,closes #1224,closes #1225,closes #1226,closes #1227,closes #1228,closes #1229,closes #1230,closes #1231,closes #1232,closes #1233,closes #1234,closes #1235,closes #1236,closes #1237,closes #1238,closes #1239,closes #1240,closes #1241,closes #1242,closes #1243,closes #1244,closes #1245,closes #1246,closes #1247,closes #1248,closes #1249,closes #1250,closes #1251,closes #1252,closes #1253,closes #1254,closes #1255,closes #1256,closes #1257,closes #1258,closes #1259,closes #1260,closes #1261,closes #1262,closes #1263,closes #1264,closes #1265,closes #1266,closes #1267,closes #1268,closes #1269,closes #1270,closes #1271,closes #1272,closes #1273,closes #1274,closes #1275,closes #1276,closes #1277,closes #1278,closes #1279,closes #1280,closes #1281,closes #1282,closes #1283,closes #1284,closes #1285,closes #1286,closes #1287,closes #1288,closes #1289,closes #1290,closes #1291,closes #1292,closes #1293,closes #1294,closes #1295,closes #1296,closes #1297,closes #1298,closes #1299,closes #1300,closes #1301,closes #1302,closes #1303,closes #1304,closes #1305,closes #1306,closes #1307,closes #1308,closes #1309,closes #1310,closes #1311,closes #1312,closes #1313,closes #1314,closes #1315,closes #1316,closes #1317,closes #1318,closes #1319,closes #1320,closes #1321,closes #1322,closes #1323,closes #1324,closes #1325,closes #1326,closes #1327,closes #1328,closes #1329,closes #1330,closes #1331,closes #1332,closes #1333,closes #1334,closes #1335,closes #1336,closes #1337,closes #1338,closes #1339,closes #1340,closes #1341,closes #1342,closes #1343,closes #1344,closes #1345,closes #1346,closes #1347,closes #1348,closes #1349,closes #1350,closes #1351,closes #1352,closes #1353,closes #1354,closes #1355,closes #1356,closes #1357,closes #1358,closes #1359,closes #1360,closes #1361,closes #1362,closes #1363,closes #1364,closes #1365,closes #1366,closes #1367,closes #1368,closes #1369,closes #1370,closes #1371,closes #1372,closes #1373,closes #1374,closes #1375,closes #1376,closes #1377,closes #1378,closes #1379,closes #1380,closes #1381,closes #1382,closes #1383,closes #1384,closes #1385,closes #1386,closes #1387,closes #1388,closes #1389,closes #1390,closes #1391,closes #1392,closes #1393,closes #1394,closes #1395,closes #1396,closes #1397,closes #1398,closes #1399,closes #1400,closes #1401,closes #1402,closes #1403,closes #1404,closes #1405,closes #1406,closes #1407,closes #1408,closes #1409,closes #1410,closes #1411,closes #1412,closes #1413,closes #1414,closes #1415,closes #1416,closes #1417,closes #1418,closes #1419,closes #1420,closes #1421,closes #1422,closes #1423,closes #1424,closes #1425,closes #1426,closes #1427,closes #1428,closes #1429,closes #1430,closes #1431,closes #1432,closes #1433,closes #1434,closes #1435,closes #1436,closes #1437,closes #1438,closes #1439,closes #1440,closes #1441,closes #1442,closes #1443,closes #1444,closes #1445,closes #1446,closes #1447,closes #1448,closes #1449,closes #1450,closes #1451,closes #1452,closes #1453,closes #1454,closes #1455,closes #1456,closes #1457,closes #1458,closes #1459,closes #1460,closes #1461,closes #1462,closes #1463,closes #1464,closes #1465,closes #1466,closes #1467,closes #1468,closes #1469,closes #1470,closes #1471,closes #1472,closes #1473,closes #1474,closes #1475,closes #1476,closes #1477,closes #1478,closes #1479,closes #1480,closes #1481,closes #1482,closes #1483,closes #1484,closes #1485,closes #1486,closes #1487,closes #1488,closes #1489,closes #1490,closes #1491,closes #1492,closes #1493,closes #1494,closes #1495,closes #1496,closes #1497,closes #1498,closes #1499,closes #1500,closes #1501,closes #1502,closes #1503,closes #1504,closes #1505,closes #1506,closes #1507,closes #1508,closes #1509,closes #1510,closes #1511,closes #1512,closes #1513,closes #1514,closes #1515,closes #1516,closes #1517,closes #1518,closes #1519,closes #1520,closes #1521,closes #1522,closes #1523,closes #1524,closes #1525,closes #1526,closes #1527,closes #1528,closes #1529,closes #1530,closes #1531,closes #1532,closes #1533,closes #1534,closes #1535,closes #1536,closes #1537,closes #1538,closes #1539,closes #1540,closes #1541,closes #1542,closes #1543,closes #1544,closes #1545,closes #1546,closes #1547,closes #1548,closes #1549,closes #1550,closes #1551,closes #1552,closes #1553,closes #1554,closes #1555,closes #1556,closes #1557,closes #1558,closes #1559,closes #1560,closes #1561,closes #1562,closes #1563,closes #1564,closes #1565,closes #1566,closes #1567,closes #1568,closes #1569,closes #1570,closes #1571,closes #1572,closes #1573,closes #1574,closes #1575,closes #1576,closes #1577,closes #1578,closes #1579,closes #1580,closes #1581,closes #1582,closes #1583,closes #1584,closes #1585,closes #1586,closes #1587,closes #1588,closes #1589,closes #1590,closes #1591,closes #1592,closes #1593,closes #1594,closes #1595,closes #1596,closes #1597,closes #1598,closes #1599,closes #1600,closes #1601,closes #1602,closes #1603,closes #1604,closes #1605,closes #1606,closes #1607,closes #1608,closes #1609,closes #1610,closes #1611,closes #1612,closes #1613,closes #1614,closes #1615,closes #1616,closes #1617,closes #1618,closes #1619,closes #1620,closes #1621,closes #1622,closes #1623,closes #1624,closes #1625,closes #1626,closes #1627,closes #1628,closes #1629,closes #1630,closes #1631,closes #1632,closes #1633,closes #1634,closes #1635,closes #1636,closes #1637,closes #1638,closes #1639,closes #1640,closes #1641,closes #1642,closes #1643,closes #1644,closes #1645,closes #1646,closes #1647,closes #1648,closes #1649,closes #1650,closes #1651,closes #1652,closes #1653,closes #1654,closes #1655,closes #1656,closes #1657,closes #1658,closes #1659,closes #1660,closes #1661,closes #1662,closes #1663,closes #1664,closes #1665,closes #1666,closes #1667,closes #1668,closes #1669,closes #1670,closes #1671,closes #1672,closes #1673,closes #1674,closes #1675,closes #1676,closes #1677,closes #1678,closes #1679,closes #1680,closes #1681,closes #1682,closes #1683,closes #1684,closes #1685,closes #1686,closes #1687,closes #1688,closes #1689,closes #1690,closes #1691,closes #1692,closes #1693,closes #1694,closes #1695,closes #1696,closes #1697,closes #1698,closes #1699,closes #1700,closes #1701,closes #1702,closes #1703,closes #1704,closes #1705,closes #1706,closes #1707,closes #1708,closes #1709,closes #1710,closes #1711,closes #1712,closes #1713,closes #1714,closes #1715,closes #1716,closes #1717,closes #1718,closes #1719,closes #1720,closes #1721,closes #1722,closes #1723,closes #1724,closes #1725,closes #1726,closes #1727,closes #1728,closes #1729,closes #1730,closes #1731,closes #1732,closes #1733,closes #1734,closes #1735,closes #1736,closes #1737,closes #1738,closes #1739,closes #1740,closes #1741,closes #1742,closes #1743,closes #1744,closes #1745,closes #1746,closes #1747,closes #1748,closes #1749,closes #1750,closes #1751,closes #1752,closes #1753,closes #1754,closes #1755,closes #1756,closes #1757,closes #1758,closes #1759,closes #1760,closes #1761,closes #1762,closes #1763,closes #1764,closes #1765,closes #1766,closes #1767,closes #1768,closes #1769,closes #1770,closes #1771,closes #1772,closes #1773,closes #1774,closes #1775,closes #1776,closes #1777,closes #1778,closes #1779,closes #1780,closes #1781,closes #1782,closes #1783,closes #1784,closes #1785,closes #1786,closes #1787,closes #1788,closes #1789,closes #1790,closes #1791,closes #1792,closes #1793,closes #1794,closes #1795,closes #1796,closes #1797,closes #1798,closes #1799,closes #1800,closes #1801,closes #1802,closes #1803,closes #1804,closes #1805,closes #1806,closes #1807,closes #1808,closes #1809,closes #1810,closes #1811,closes #1812,closes #1813,closes #1814,closes #1815,closes #1816,closes #1817,closes #1818,closes #1819,closes #1820,closes #1821,closes #1822,closes #1823,closes #1824,closes #1825,closes #1826,closes #1827,closes #1828,closes #1829,closes #1830,closes #1831,closes #1832,closes #1833,closes #1834,closes #1835,closes #1836,closes #1837,closes #1838,closes #1839,closes #1840,closes #1841,closes #1842,closes #1843,closes #1844,closes #1845,closes #1846,closes #1847,closes #1848,closes #1849,closes #1850,closes #1851,closes #1852,closes #1853,closes #1854,closes #1855,closes #1856,closes #1857,closes #1858,closes #1859,closes #1860,closes #1861,closes #1862,closes #1863,closes #1864,closes #1865,closes #1866,closes #1867,closes #1868,closes #1869,closes #1870,closes #1871,closes #1872,closes #1873,closes #1874,closes #1875,closes #1876,closes #1877,closes #1878,closes #1879,closes #1880,closes #1881,closes #1882,closes #1883,closes #1884,closes #1885,closes #1886,closes #1887,closes #1888,closes #1889,closes #1890,closes #1891,closes #1892,closes #1893,closes #1894,closes #1895,closes #1896,closes #1897,closes #1898,closes #1899,closes #1900,closes #1901,closes #1902,closes #1903,closes #1904,closes #1905,closes #1906,closes #1907,closes #1908,closes #1909,closes #1910,closes #1911,closes #1912,closes #1913,closes #1914,closes #1915,closes #1916,closes #1917,closes #1918,closes #1919,closes #1920,closes #1921,closes #1922,closes #1923,closes #1924,closes #1925,closes #1926,closes #1927,closes #1928,closes #1929,closes #1930,closes #1931,closes #1932,closes #1933,closes #1934,closes #1935,closes #1936,closes #1937,closes #1938,closes #1939,closes #1940,closes #1941,closes #1942,closes #1943,closes #1944,closes #1945,closes #1946,closes #1947,closes #1948,closes #1949,closes #1950,closes #1951,closes #1952,closes #1953,closes #1954,closes #1955,closes #1956,closes #1957,closes #1958,closes #1959,closes #1960,closes #1961,closes #1962,closes #1963,closes #1964,closes #1965,closes #1966,closes #1967,closes #1968,closes #1969,closes #1970,closes #1971,closes #1972,closes #1973
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants