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

Improve documentation about how to implement modals #893

Closed
kennethlynne opened this issue Jul 2, 2016 · 38 comments
Closed

Improve documentation about how to implement modals #893

kennethlynne opened this issue Jul 2, 2016 · 38 comments

Comments

@kennethlynne
Copy link

The current documentation is kinda "go fuck your self" for newbies just exploring this great router.

@kennethlynne
Copy link
Author

Just to be clear: I'm a newbie, or else I would send a PR 👍

@CoderStav
Copy link

Agree. It also seems like the example is pretty outdated compared to the current API.

@sondremare
Copy link
Contributor

sondremare commented Jul 3, 2016

Trying to use modals as the example code shows. And it crashes the entire app (on API level 19) when used with a view with https://github.com/FaridSafi/react-native-gifted-messenger

@aksonov
Copy link
Owner

aksonov commented Jul 5, 2016

@sondremare Check Example project, does modal work for you?

@brien-crean
Copy link
Contributor

brien-crean commented Jul 11, 2016

Agree, also a bit confused about Modal usage.
If using a Modal as a way of reporting App status to the user e.g. "Network connection failed" etc.
displaying the Modal works fine I can show it on each screen as the user navigates.
However as Actions.pop() (or maybe ActionConst.BACK in latest version) is used to dismiss the Modal, if I push another route to the stack and then try to dismiss the Modal it instead pops the most recently added route from the stack and the Modal is stuck there

Is there a better way to implement or is it possible to override onNavigate on the Modal component for example? I tried adding it as a prop to the Scene but it prevented the component from rendering
E.g.

      <Router createReducer={this.reducerCreate.bind(this)} >
        <Scene key="modal" component={Modal} >
          <Scene key="root">
            <Scene key="loginScreen" hideNavBar={true} initial={this.state.needSignIn} 
              component={LoginScreen} type="reset" duration={200} />

          </Scene>
            <Scene key="statusModal" component={StatusModal} 
               onNavigate={ ()=> Actions.loginScreen()}/>
        </Scene>
      </Router>

EDIT: Instead of using Actions.pop() to dismiss the modal I set a boolean {hide: true} to the StatusModal to return an empty view or if there is an error pass 'Actions.statusModal({error: error, hide: false})' to display the Modal with the error.

@heat
Copy link

heat commented Jul 13, 2016

I have some trouble with Actions.pop() when switch tabs while modal is open.

Is there a action to close modal or what @charpeni is the best way

@brien-crean
Copy link
Contributor

brien-crean commented Jul 13, 2016

@heat @charpeni @cridenour I tried to submit a pull request, but got permission denied. Here is the example of Modal usage I was trying to submit:

import StatusModal from './components/StatusModal'

<Router>
  <Scene key="modal" component={Modal} >
    <Scene key="root">
      <Scene key="screen1" initial={true} component={Screen1} />
      <Scene key="screen2" component={Screen2} />
    </Scene>
      <Scene key="statusModal" component={StatusModal} />
  </Scene>
</Router>

Then in the StatusModal Component we can define what we want it to look like and what props can be passed to it:

class StatusModal extends Component {

  constructor(props) {
    super(props)
    // set state with passed in props
    this.state = {
      message: props.error,
      hide: props.hide,
    }
    // bind functions
    this.dismissModal = this.dismissModal.bind(this)
  }

  dismissModal() {
    this.setState({hide: true})
  }

  // show or hide Modal based on 'hide' prop
  render() {
    if(this.state.hide){
      return (
        <View>
        </View>
      )
    } else {
        return (
          <TouchableHighlight style={styles.mainContainer} onPress={this.dismissModal}>
            <Text style={styles.text}>{this.state.message}</Text>
          </TouchableHighlight>
        )
      }
  }
}

Lastly when calling the Modal pass the props defined in the component, for example an error message and a 'hide' prop of false to display the Modal:

Actions.statusModal({error: "Network failed...", hide: false})

When the Modal is pressed it will set hide to true and return an empty view.

brien-crean added a commit to brien-crean/react-native-router-flux that referenced this issue Jul 13, 2016
@dankremniov
Copy link

Hi,

I have exactly the same code as @brien-crean, but I am getting this kind of error: screenshot.

What I am doing wrong?

Thanks,
Daniel

@heat
Copy link

heat commented Jul 16, 2016

I'll try stack it again before pop. Actions.modalApp(); Actions.pop()

@omeid
Copy link

omeid commented Jul 25, 2016

I have the same problem. The hiding technique in ed28f7f works but it breaks the Action.pop behaviour, at least for the first call after presenting the modal anyways.

@omeid
Copy link

omeid commented Jul 25, 2016

One solution for this would be for Actions.ACTION_NAME to return a reference that can be passed on to Actions.pop($REF). Thoughts?

@flare216
Copy link

@brien-crean , i try to hide the modal by Actions. statusModal({hide: true}) but failed, the render of StatusModal indeed returns an empty view, but the modal still on the screen, so weired.

@brien-crean
Copy link
Contributor

@omeid @flare216 yes, unfortunately there is a flaw with my solution, the Modal never gets popped from the stack so will only appear once, other pushes of the Modal will result in error.

I have been trying to create another solution but have been unsuccessful so far.

Potential solutions could be the ability to remove a Scene from the stack by name, (after checking that it exists on the stack), as @aksonov proposed e.g. removeScene(ACTION_NAME) or the solution that @omeid proposed above, either would work. Unfortunately I don't know if I would be able to figure it out myself

@aksonov
Copy link
Owner

aksonov commented Jul 25, 2016

I've added Actions.get(ACTION_NAME) to receive scene props with ACTION_NAME. This way you could store everything during displaying of that scene including refs using Actions.refresh({key:ACTION_NAME, ref:this.refs.REF_NAME}) then use Actions.get(ACTION_NAME).ref from any other action

@brien-crean
Copy link
Contributor

Thanks @aksonov, I'll give that a shot and see if I can submit another PR for the docs

@sibelius
Copy link
Contributor

How can I have a transparent background on my Modal?

Should I use Modal from react-native ?

@danmatthews
Copy link

I'm still completely confused by modals with this Router.

The detailed example in the documentation shows modals acting like the Modal component of React Native - this is what i want. When i call Actions.login to open my login screen, i want it to pop up over the content of the current page - this means i can check if a user is authenticated, and if not, pop up the login screen to authenticate them in situ.

Is this possible? It looks easy in the example, but i can't get modals to be anything more than a little chunk of <View> that just appears at the bottom of the screen when triggered.

What am i missing? I would love to know so i can help contribute to the documentation.

@cridenour
Copy link
Collaborator

If the view is showing up then the router is doing its job, and that view just needs styling. Position absolute, top, left, right, bottom all at 0.

@sibelius
Copy link
Contributor

@cridenour position absolute shouldn't be the default?

what about transparent background, is it possible without using <Modal> from react-native?

@danmatthews
Copy link

danmatthews commented Sep 20, 2016

@cridenour the detailed example shows it appearing using a slide-in-from-bottom animation, and i can't see anything in the example that effects that transition - therefore i assumed that it was part of the router?

Fair enough if it's working, but i think the example makes it seem like you can route to native-looking modals.

@cridenour
Copy link
Collaborator

I believe a transparent background is possible, as I've done it accidentally. However I'm on mobile and can't provide an example. But regarding positioning, the default is fluxbox, but you can manually set it to absolute.

With the direction, on the modal view in your scene config, just set direction="vertical" and it should do the trick.

@danmatthews
Copy link

Beautiful, thank you :) i'll give that a try after i've walked the 🐶

@gkrinc
Copy link

gkrinc commented Sep 20, 2016

I tried adding the getSceneStyle prop to my RouterWithRedux, but I get the same problem that @Daniellt1 was getting: "Objects are not valid as a React child (found: object with keys {..."

So brutal that it's this difficult to get a Modal working :s

Here's the render method of my index.ios.js file

render() {
  return (
    <Provider store={store}>
      <AppDrawersContainer>
        <RouterWithRedux hideNavBar={true} getSceneStyle={getSceneStyle}>
          <Scene key="modal" component={Modal}>
            <Scene key="root" renderTitle={() => { return <AppLogo /> }}>
              ... other scenes ...
            </Scene>
            <Scene key="statusModal" component={StatusModal} />
          </Scene>
        </RouterWithRedux>
      </AppDrawersContainer>
    </Provider>);
}

The StatusModal is a direct copy of the one provided in the example.

If I take this scene out, I don't get the error, but of course the modal won't load

<Scene key="modal" component={Modal}>

Versions:
react-native: v0.34.0-rc.0
react-native-router-flux: v3.34.0 (downgraded from 3.35.0 because of another issue)

@cridenour
Copy link
Collaborator

Wait why do you have getSceneStyle on your router? I don't think it's valid on a router, only scenes.

@gkrinc
Copy link

gkrinc commented Sep 20, 2016

<Router createReducer={reducerCreate} getSceneStyle={getSceneStyle}>

@cridenour
Copy link
Collaborator

Ah, you're right - sorry. Maybe instead of nesting the scenes under the Router object, pass them using the scenes prop and Actions.create

@gkrinc
Copy link

gkrinc commented Sep 21, 2016

I ended up going with react-native-simple-modal. I liked how easy it was to implement and it handles a queue of modals quite effectively and doesn't cause any weird routing issues that people seem to have come across.

@robinweston
Copy link

I had the same issues, but realised I was importing Modal from react-native instead of react-native-router-flux

@liamfd
Copy link

liamfd commented Oct 2, 2016

@robinweston that was the issue for me as well, thank you for posting that.

I attempted to make a PR to update the docs to be a bit more informative, not sure if I did it right but I didn't seem to have permission. I suggested that the first code block in the modal example be changed to the following:

import React, { Component } from 'react';
import { Text, View, TouchableHighlight } from 'react-native';
import {
  Actions,
  Router,
  Scene,
  Modal // Note that this needs to be our implementation of modal, not React-Native's
} from 'react-native-router-flux';
import StatusModal from './components/StatusModal'

export default class App extends Component {
  render() {
    return (
      <Router>
        <Scene key="modal" component={Modal} >
          <Scene key="root">
            <Scene key="screen1" initial={true} component={Screen1} />
            <Scene key="screen2" component={Screen2} />
          </Scene>
          <Scene key="statusModal" component={StatusModal} />
        </Scene>
      </Router>
    );
  }
}

class Screen1 extends Component {
  render() {
    return (
      <View style={{margin: 128}}>
        <Text onPress={() => Actions.statusModal({error: "Network failed...", hide: false})}>This is Screen1!</Text>
      </View>
    )
  }
}

class Screen2 extends Component {
  render() {
    return (
      <View style={{margin: 128}}>
        <Text onPress={() => Actions.statusModal({error: "Network failed...", hide: false})}>This is Screen2!</Text>
      </View>
    )
  }
}

That file should be good for a user to copy paste, as long as StatusModal is present and valid. If that is too verbose I think even something as simple as the following would be a big improvement, because I didn't know that this project had a Modal component until I got to this thread.

import { Modal } from 'react-native-router-flux';
import StatusModal from './components/StatusModal'

export default class App extends Component {
  render() {
    return (
      <Router>
        <Scene key="modal" component={Modal} >
          <Scene key="root">
            <Scene key="screen1" initial={true} component={Screen1} />
            <Scene key="screen2" component={Screen2} />
          </Scene>
          <Scene key="statusModal" component={StatusModal} />
        </Scene>
      </Router>
    );
  }
}

By the way, I couldn't find the styles that are referenced in the StatusModal component, it might be nice to either remove the references to them or define them in the example, as right now it crashes.

@DiegoGallegos4
Copy link

@sibelius Did you find a way to style a transparent background?

@sibelius
Copy link
Contributor

I'm using Modal component from react-native core

@fostertime
Copy link

fostertime commented Nov 30, 2016

Based on this note from @aksonov from July:

I've added Actions.get(ACTION_NAME) to receive scene props with ACTION_NAME. This way you could store everything during displaying of that scene including refs using Actions.refresh({key:ACTION_NAME, ref:this.refs.REF_NAME}) then use Actions.get(ACTION_NAME).ref from any other action

Is this a solution to resolve the issue of not being able to pop() the modal? I am having the same issue as described above, where the first view of the modal works, but any other attempts to load the modal causes a duplicate key error. Trying to figure out how to pop the modal, when hiding it.

@ryancoughlin
Copy link

Is the goal of this modal to be treated like a native modal respective to the device it's running on? I can't seem to get anything more than a view talking up 50% of it's container view. Is that accurate out of the box functionality?

@danmatthews Were you able to get past that?

@ryancoughlin
Copy link

If the view is showing up then the router is doing its job, and that view just needs styling. Position absolute, top, left, right, bottom all at 0.

@cridenour If that applies styling, could that be proposed to default functionality since that is how modals behave natively? Including a navigation bar.

@cridenour
Copy link
Collaborator

@ryancoughlin That suggestion was for their particular case. If you check out the Example app, the modal example (Login) does not require such styling.

@ryancoughlin
Copy link

ryancoughlin commented Mar 5, 2017 via email

@highbass
Copy link

@ryancoughlin i am going through figuring out the exact same problem... could you kindly provide how you went about solving it.

@highbass
Copy link

highbass commented Mar 12, 2017

ok I seem to figured it out also.... basically modified styling to be something as such...

  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    position: 'absolute',
    top: 0,
    bottom: 0,
    right: 0,
    left: 0,
    backgroundColor: 'rgba(0,0,0,0)',
  },

which (from the example) is attached to TouchableHighlight

<TouchableHighlight style={styles.container} onPress={this.dismissModal}>
        <Text style={styles.text}>{this.state.message}</Text>
</TouchableHighlight>

I also modified the dismissModal to have an Action.pop() .. since after hiding it doesn't come back up.

  dismissModal() {
    Actions.pop();
    this.setState({ hide: true });
  }

... setState is not needed at all here.

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
Projects
None yet
Development

No branches or pull requests