Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- interface IState {
- description: string;
- image_url: string;
- modalVisible: boolean;
- disabled: boolean;
- // не знаю, может тут | null и оправдан, но по-хорошему здесь иметь просто nullable value data?: {...}, и просто не прокидовать data, если ее значение null
- data: { id: string | null; title: string | null; image?: string } | null;
- type: string;
- loading: boolean;
- hide: boolean;
- }
- validate(description = this.state.description) {
- const { data, image_url } = this.state;
- // такую логику в ифе лучше разбить по функциям
- // const hasAdditionalInfo = (data && data.id) || (description && image_url);
- // this.setState({ disabled: !hasAdditionalInfo });
- if ((data && data.id) || (description && image_url)) {
- this.setState({ disabled: false });
- } else {
- this.setState({ disabled: true });
- }
- }
- // много схожей логики, по-сути, функции отличаются только сетом description. И функции не очень явно называются.
- // я даже хз)) сложно сообразить как setState влияет validate() в этом компоненте и нужно ли порядок сохранять
- // но если можно - в теории оставить clearState, а в clearStateWithDescrition написать так
- // clearStateWithDescription {
- // this.setState({ description: '' })
- // cleearState();
- // }
- clearExtra = () => {
- this.addExtra({ id: null, title: null }, '');
- this.setState({ type: '', data: null, image_url: '' });
- this.validate();
- };
- clearState = () => {
- this.addExtra({ id: null, title: null }, '');
- this.setState({ type: '', data: null, image_url: '', description: '' });
- this.validate();
- };
- componentDidUpdate(prevProps, prevState) {
- // тут интересно) ифы никогда не поощряются. в таких случаях, да и вообще, лучше разбивать код на составные функции
- // в type может быть union тип type: 'top' | 'event' | 'survey', а лучше не строки, а константы (наверное))
- // может, как-то так
- // const { data, type } = this.state;
- // const IMAGE_TYPES = {
- // [TOP]: config.DEFAULT_TOP_IMAGE,
- // [EVENT]: ...
- // }
- // const getNewImageByType = type => {
- // if (IMAGE_TYPES.hasOwnProperties(type)) {
- // return IMAGE_TYPES[type];
- // }
- // return ''; // DEFAULT
- // }
- // const setNewImage = (image, type) => {
- // if (image) {
- // this.setState({ image_url: image });
- // return;
- // }
- // const newImage = getNewImageByType(type);
- // this.setState({ image_url: newImage });
- // }
- // if (data !== prevState.data) {
- // setNewImage(data.image);
- // }
- // this.validate();
- if (this.state.data !== prevState.data) {
- let newImage = '';
- if (this.state.data) {
- if (this.state.data.image) {
- newImage = this.state.data.image;
- } else {
- switch (this.state.type) {
- case 'top':
- newImage = config.DEFAULT_TOP_IMAGE;
- break;
- case 'event':
- newImage = config.DEFAULT_EVENT_IMAGE;
- break;
- case 'survey':
- newImage = config.DEFAULT_SURVEY_IMAGE;
- }
- }
- }
- this.setState({ image_url: newImage });
- this.validate();
- }
- }
- <TouchableOpacity
- style={{ width: '50%', alignItems: 'flex-end' }}
- // анонимные функции лучше не передавать в качестве пропсов в чайлды - анонимки - это всегда новые ссылки на объект в памяти
- // и они будут провоцировать ре-рендер компонента всегда, лучше вынести в именованную функцию, пускай даже с таким же названием sendPost
- // ...this.state - деструктуризацию лучше всега делать в начале объекта, потому что в стейте в теории может быть тоже свойство id и оно перетрет твой id: uuid(),
- onPress={() => {
- this.props.sendPost({
- id: uuid(),
- ...this.state,
- extraTitle: data && data.title,
- extraLink: data && `/events/${data.id}`,
- extraType: type,
- extraData: data,
- user: { ...this.props.profileInfo }
- });
- this.clearState();
- navigation.navigate('Home');
- }}
- disabled={this.state.disabled}
- />
- // в моем сознании не укладывается наллбл значение ?: и | null
- // если оно null, то его лучше не инициализировать в объекте и оставить ?: (хотя хз... может, от ситуации зависит, но выглядит не оч)
- extraTitle?: string | null;
- extraLink?: string | null;
- extraData?: any;
- extraType: string;
- // по-минимуму используй let - это возлагает на код больше ответственности
- // типа переменная может мутироваться дальше, что должно быть в крайнем случае, когда выхода нет. const - наше все
- let date = new Date(createdAt || new Date());
- let newDate = getNewDateTime(date);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement