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

Custom NavBar with custom TabBar #885

Closed
lifehackett opened this issue Jun 30, 2016 · 11 comments
Closed

Custom NavBar with custom TabBar #885

lifehackett opened this issue Jun 30, 2016 · 11 comments

Comments

@lifehackett
Copy link

lifehackett commented Jun 30, 2016

Version

Tell us which versions you are using:

  • react-native-router-flux v3.30.3
  • react-native v0.28.0

Expected behaviour

Displays my custom navBar

Actual behaviour

Displays the default navBar

Steps to reproduce

I am going through the process of upgrading RN from 22-28. First, thanks for all your hard work around their moving target of a Navigation API. Using your TabView and TabBar as a template I have gotten the tab bar working again, but my custom NavBar has been replaced with the default one. I have tried applying hideNavBar={ true } at the tab bar level (nothing happens) and at the individual tab level (tab bar is hidden). I have also tried applying the navBar again at these same levels and the correct one gets displayed, but it doesn't have the correct navigation state presumably because it is a separate instance.

export default class App extends Component {
  render() {
    return (
      <Provider store={ store }>
        <Router>
          <Scene key="root" hideNavBar={ true } >
            <Scene key="login" component={ Login } />
            <Scene key="drawer" component={ Menu }>
              <Scene key="nav" navBar={ NavBar }>
                <Scene key="projects" title="Projects" component={ ProjectPicker } />
                <Scene key="collections" component={ CollectionPicker } getTitle={ () => currentProject(store.getState()).name } />
                <Scene key="moderation" tabs={ true } component={ ModerationTabs } getTitle={ () => activeCollection(store.getState()).name } >
                  <Scene key={ DENIED.toLowerCase() } component={ ModerationList } getTitle={ () => activeCollection(store.getState()).name }  />
                  <Scene key={ UNMODERATED.toLowerCase() } initial={ true } component={ ModerationList } getTitle={ () => activeCollection(store.getState()).name } />
                  <Scene key={ APPROVED.toLowerCase() } component={ ModerationList } getTitle={ () => activeCollection(store.getState()).name } />
                  <Scene key="filters" title="Filters" component={ Filters } />
                </Scene>
                <Scene key="moderation_detail" getTitle={ () => activeCollection(store.getState()).name } component={ ModerationDetail } />
              </Scene>

            </Scene>
          </Scene>
        </Router>
      </Provider>
    )
  }
}

UPDATE: NavBar implementation

export default create({
  displayName: 'NavBar',
  contextTypes: {
    drawer: PropTypes.object,
  },
  render(p, s, c) {
    const { drawer } = c;
    const { height, width } = Dimensions.get('window');

    return (
      <View style={ styles.container }>
        <StatusBar barStyle="light-content" />
        <TouchableOpacity onPress={ Actions.pop }>
          <View style={ styles.backButton }>
            <If condition={ p.navigationState.index > 0 }>
              <MDIcon name="arrow-back" size={ 20 } color={ colors.gray.one } />
            </If>
          </View>
        </TouchableOpacity>
        <View>
          <Text style={[ styles.title ]} numberOfLines={ 1 }>{ p.getTitle(p) }</Text>
        </View>
        <TouchableOpacity onPress={ drawer.open }>
          <View style={ styles.menuButton }>
            <If condition={ !!drawer }>
              <MDIcon name="menu" size={ 20 } color={ colors.gray.one } />
            </If>
          </View>
        </TouchableOpacity>
      </View>
    )
  }
})
@cridenour
Copy link
Collaborator

What does your NavBar code look like?

@lifehackett
Copy link
Author

Original post updated with NavBar

@cridenour
Copy link
Collaborator

Hm, even if your navbars are separate instances, they should have the correct state.

Make sure you're reading the navigationState correctly, maybe compare to the original one and see how they are reading the new state.

https://github.com/aksonov/react-native-router-flux/blob/master/src/NavBar.js

@lifehackett
Copy link
Author

lifehackett commented Jul 13, 2016

Ok, so I went ahead and tried to use the provided prop interface supplied by RNRF and am getting the same result. It doesn't seem to matter whether I remove tabs={ true } component={ ModerationTabs } or not.

To recap my question:

  1. Why is it necessary to redefine my navbar styles in the 3 scenes (Denied, Unmoderated, Approved) nested under the tabbar?

UPDATE: I'm guessing this line from the docs is the answer to this question though sort of seems odd. The second question is the one that is holding me up.

All child scenes are wrapped into own navbar.

  1. Why in the scenes nested under the tab bar is the back button not rendering? The issue seems to be that the navigationState is being reset to 0 when passed in to those scenes, but I don't understand why.

Here is the updated navigation

export default class App extends Component {
  render() {
    return (
      <Provider store={ store }>
        <Router>
          <Scene key="root" hideNavBar={ true } panHandlers={ null }>
            <Scene key="login" component={ Login } panHandlers={ null }/>
            <Scene key="drawer" component={ Menu } panHandlers={ null }>
              <Scene key="nav" { ...navBar } panHandlers={ null }>
                <Scene key="projects" title="Projects" component={ ProjectPicker } sceneStyle={{ marginTop: NAV_BAR_HEIGHT }} panHandlers={ null } { ...navBarButtons }/>
                <Scene key="collections" component={ CollectionPicker } getTitle={ () => ProjectSelectors.activeProject(store.getState()).name } sceneStyle={{ marginTop: NAV_BAR_HEIGHT }} panHandlers={ null } { ...navBarButtons }/>
                <Scene key="moderation" tabs={ true } component={ ModerationTabs } getTitle={ () => CollectionSelectors.activeCollection(store.getState()).name } panHandlers={ null } >
                  <Scene key={ DENIED.toLowerCase() } component={ ModerationList } getTitle={ () => CollectionSelectors.activeCollection(store.getState()).name } sceneStyle={{ marginTop: 100 }} { ...navBarButtons } { ...navBar }/>
                  <Scene key={ UNMODERATED.toLowerCase() } initial={ true } component={ ModerationList } getTitle={ () => CollectionSelectors.activeCollection(store.getState()).name } sceneStyle={{ marginTop: 100 }} { ...navBarButtons } { ...navBar }/>
                  <Scene key={ APPROVED.toLowerCase() } component={ ModerationList } getTitle={ () => CollectionSelectors.activeCollection(store.getState()).name } sceneStyle={{ marginTop: 100 }} { ...navBarButtons } { ...navBar }/>
                </Scene>
                <Scene key="filters" title="Filters" component={ Filters } panHandlers={ null }/>
                <Scene key="moderation_detail" getTitle={ () => CollectionSelectors.activeCollection(store.getState()).name } component={ ModerationDetail } panHandlers={ null }/>
              </Scene>

            </Scene>
          </Scene>
        </Router>
      </Provider>
    )
  }
}

const navBar = {
  navigationBarStyle: styles.container,
  titleStyle: styles.title,
}

const navBarButtons = {
  renderBackButton(p) {
    return (
      <TouchableOpacity onPress={ Actions.pop }>
        <View style={ styles.backButton }>
          <If condition={ p.navigationState.index > 0 }>
            <MDIcon name="arrow-back" size={ 20 } color={ colors.gray.one } />
          </If>
        </View>
      </TouchableOpacity>
    )
  },
  renderRightButton(p) {
    return (
      <View style={ styles.menuButton }>
        <MDIcon name="menu" size={ 20 } color={ colors.gray.one } />
      </View>
    )
  },
}

@cridenour
Copy link
Collaborator

I would believe that you wouldn't want a back button on a child tab scene. Navigation at that point should be between tabs. If you navigate to a scene from a tab, you will then want to go back - but only as far as the tabs.

This is a "sane" default as most tab based navigators are root scenes - but obviously you have a use case for otherwise. I'll have to take a deeper dive or get @joenoon in here to find a next step.

@joenoon
Copy link
Collaborator

joenoon commented Jul 14, 2016

@lifehackett in my app I use a custom navBar and I set it in the jsx on every immediate child of a tabs={true} scene, as well as the top root. So it looks sort of close to what you are doing, except I don't know that {...navBar} is correct. I think you need navBar={navBar}.

And since these are the tab root scenes (index: 0), it makes sense to me that no back button is appearing... but you are using a custom NavBar that doesn't handle renderRightButton or renderBackButton from your navBarButtons, so I'm really not sure what is going on there? By the logic in your custom NavBar the back button would only be displayed if index > 0, and none of denied, unmoderated, or approved would meet that criteria.

@lifehackett
Copy link
Author

Thank you for the responses. Prior to upgrading RN and then RNRF my custom nav bar worked as I've described I would like it to work, so either it seems like a bug that it changed or there was a conscious decision to "re-root" navigation when tabs are introduced.

@joenoon the {...navBar} in my third post was a refactored attempt to use the provided NavBar API as opposed to a custom NavBar (which is the first example I provided). The {...navBar} is just destructuring the props (included it the snippet) to interact with the provided NavBar.

IMO it would make sense that tabs occupy a place in the state stack similar to any other scene. So in my case if you navigated projects > collections > moderation > filters then {index: 0 } = projects, { index: 1 } = collections, and { index: 2 } = moderation[denied, unmoderated, approved] and { index: 3 } = filters. Clicking a tab would replace the state at index 2 with the tab you selected. As you navigate the tabs it does not add and index, but replaces the existing one.

@joenoon
Copy link
Collaborator

joenoon commented Jul 14, 2016

@lifehackett I missed that navBar variable but now that you point it out I understand.

The state tree from your code as I understand it would be something like this:

const state = {
  index: 0, // will be 1 when drawer is active
  key: 'root',
  children: [
    {
      index: 0,
      key: 'login',
    },
    {
      index: 0,
      key: 'drawer',
      children: [
        {
          index: 0, // will be 2 when moderation is active
          key: 'nav',
          children: [
            {
              index: 0,
              key: 'projects',
            },
            {
              index: 0,
              key: 'collections',
            },
            {
              index: 0, // will be 1 when unmoderated is active
              key: 'moderation',
              tabs: true,
              children: [
                {
                  index: 0,
                  key: 'denied', // the default NavBar will never show a back button here because index === 0,
                                 // and doesn't have any children so it will always be 0.
                                 // if you wanted to take into account the FULL state tree, you would need to
                                 // supply your own leftButton.
                },
                {
                  index: 0,
                  key: 'unmoderated',
                },
                {
                  index: 0,
                  key: 'approved',
                },
              ],
            },
            {
              index: 0,
              key: 'filters',
            },
            {
              index: 0,
              key: 'moderation_detail',
            },
          ],
        },
      ],
    },
  ],
};

You might want to try console.log'ing the state to make sure or see what is changing. This is just a best guess but hopefully will get you started.

@lifehackett
Copy link
Author

@joenoon Sorry about that sort of being buried. I was trying out the approach to see if it would work and didn't put enough effort into readability. Admittedly, I don't have a great grasp on the RN navigation stuff yet so really appreciate your time and effort; the diagram is most helpful.

I am heading out of town shortly, but will do this exercise Tuesday and if everything seems to check out will close this thread then it if you don't mind waiting until then.

@rohitgoyal
Copy link

Has there been any solution to this?
I am using a drawer and under that i have multiple scenes. I need back button even on the first scene of that drawer's child scenes.

@satishmane
Copy link

satishmane commented Jun 15, 2017

Hi,
Can you please share working example of custom navigation bar? Currently I am using drawer integrated with router-flux. And I want to add few more button on navigation bar. Hence I want to create custom navigation bar with drawer menu icon on left and other buttons on right side of bar. One of the button is refresh to reload same scene again
thanks
Satish

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 aksonov closed this as completed in 97e89ae Jul 8, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants