Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.87 KB | None | 0 0
  1. interface IState {
  2. description: string;
  3. image_url: string;
  4. modalVisible: boolean;
  5. disabled: boolean;
  6. // не знаю, может тут | null и оправдан, но по-хорошему здесь иметь просто nullable value data?: {...}, и просто не прокидовать data, если ее значение null
  7. data: { id: string | null; title: string | null; image?: string } | null;
  8. type: string;
  9. loading: boolean;
  10. hide: boolean;
  11. }
  12.  
  13.  
  14. validate(description = this.state.description) {
  15. const { data, image_url } = this.state;
  16. // такую логику в ифе лучше разбить по функциям
  17. // const hasAdditionalInfo = (data && data.id) || (description && image_url);
  18. // this.setState({ disabled: !hasAdditionalInfo });
  19. if ((data && data.id) || (description && image_url)) {
  20. this.setState({ disabled: false });
  21. } else {
  22. this.setState({ disabled: true });
  23. }
  24. }
  25.  
  26. // много схожей логики, по-сути, функции отличаются только сетом description. И функции не очень явно называются.
  27. // я даже хз)) сложно сообразить как setState влияет validate() в этом компоненте и нужно ли порядок сохранять
  28. // но если можно - в теории оставить clearState, а в clearStateWithDescrition написать так
  29. // clearStateWithDescription {
  30. // this.setState({ description: '' })
  31. // cleearState();
  32. // }
  33.  
  34.  
  35. clearExtra = () => {
  36. this.addExtra({ id: null, title: null }, '');
  37. this.setState({ type: '', data: null, image_url: '' });
  38. this.validate();
  39. };
  40.  
  41. clearState = () => {
  42. this.addExtra({ id: null, title: null }, '');
  43. this.setState({ type: '', data: null, image_url: '', description: '' });
  44. this.validate();
  45. };
  46.  
  47. componentDidUpdate(prevProps, prevState) {
  48. // тут интересно) ифы никогда не поощряются. в таких случаях, да и вообще, лучше разбивать код на составные функции
  49. // в type может быть union тип type: 'top' | 'event' | 'survey', а лучше не строки, а константы (наверное))
  50. // может, как-то так
  51.  
  52.  
  53. // const { data, type } = this.state;
  54. // const IMAGE_TYPES = {
  55. // [TOP]: config.DEFAULT_TOP_IMAGE,
  56. // [EVENT]: ...
  57. // }
  58. // const getNewImageByType = type => {
  59. // if (IMAGE_TYPES.hasOwnProperties(type)) {
  60. // return IMAGE_TYPES[type];
  61. // }
  62.  
  63. // return ''; // DEFAULT
  64. // }
  65. // const setNewImage = (image, type) => {
  66. // if (image) {
  67. // this.setState({ image_url: image });
  68. // return;
  69. // }
  70.  
  71. // const newImage = getNewImageByType(type);
  72. // this.setState({ image_url: newImage });
  73. // }
  74.  
  75. // if (data !== prevState.data) {
  76. // setNewImage(data.image);
  77. // }
  78.  
  79. // this.validate();
  80.  
  81.  
  82. if (this.state.data !== prevState.data) {
  83. let newImage = '';
  84. if (this.state.data) {
  85. if (this.state.data.image) {
  86. newImage = this.state.data.image;
  87. } else {
  88. switch (this.state.type) {
  89. case 'top':
  90. newImage = config.DEFAULT_TOP_IMAGE;
  91. break;
  92. case 'event':
  93. newImage = config.DEFAULT_EVENT_IMAGE;
  94. break;
  95. case 'survey':
  96. newImage = config.DEFAULT_SURVEY_IMAGE;
  97. }
  98. }
  99. }
  100. this.setState({ image_url: newImage });
  101. this.validate();
  102. }
  103. }
  104.  
  105. <TouchableOpacity
  106. style={{ width: '50%', alignItems: 'flex-end' }}
  107. // анонимные функции лучше не передавать в качестве пропсов в чайлды - анонимки - это всегда новые ссылки на объект в памяти
  108. // и они будут провоцировать ре-рендер компонента всегда, лучше вынести в именованную функцию, пускай даже с таким же названием sendPost
  109. // ...this.state - деструктуризацию лучше всега делать в начале объекта, потому что в стейте в теории может быть тоже свойство id и оно перетрет твой id: uuid(),
  110.  
  111. onPress={() => {
  112. this.props.sendPost({
  113. id: uuid(),
  114. ...this.state,
  115. extraTitle: data && data.title,
  116. extraLink: data && `/events/${data.id}`,
  117. extraType: type,
  118. extraData: data,
  119. user: { ...this.props.profileInfo }
  120. });
  121. this.clearState();
  122. navigation.navigate('Home');
  123. }}
  124. disabled={this.state.disabled}
  125. />
  126.  
  127. // в моем сознании не укладывается наллбл значение ?: и | null
  128. // если оно null, то его лучше не инициализировать в объекте и оставить ?: (хотя хз... может, от ситуации зависит, но выглядит не оч)
  129. extraTitle?: string | null;
  130. extraLink?: string | null;
  131. extraData?: any;
  132. extraType: string;
  133.  
  134. // по-минимуму используй let - это возлагает на код больше ответственности
  135. // типа переменная может мутироваться дальше, что должно быть в крайнем случае, когда выхода нет. const - наше все
  136.  
  137. let date = new Date(createdAt || new Date());
  138. let newDate = getNewDateTime(date);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement