import {useNavigation} from '@react-navigation/native'; import React, {useContext, useEffect, useRef, useState} from 'react'; import {Image, StyleSheet, Text, View, ViewProps} from 'react-native'; import {TouchableWithoutFeedback} from 'react-native-gesture-handler'; import Animated, {EasingNode} from 'react-native-reanimated'; import {useDispatch, useStore} from 'react-redux'; import {MomentContext} from '../../screens/profile/IndividualMoment'; import {RootState} from '../../store/rootReducer'; import { MomentCommentPreviewType, MomentPostType, MomentTagType, ScreenType, UserType, } from '../../types'; import { getLoggedInUserAsProfilePreview, getTimePosted, navigateToProfile, normalize, SCREEN_WIDTH, } from '../../utils'; import {mentionPartTypes, renderTextWithMentions} from '../../utils/comments'; import {AddComment} from '../comments'; import {MomentTags} from '../common'; import MomentCommentPreview from './MomentCommentPreview'; interface MomentPostContentProps extends ViewProps { screenType: ScreenType; moment: MomentPostType; momentTags: MomentTagType[]; index: number; } const MomentPostContent: React.FC = ({ screenType, moment, style, momentTags, index, }) => { const state: RootState = useStore().getState(); const navigation = useNavigation(); const dispatch = useDispatch(); const [tags, setTags] = useState(momentTags); const imageRef = useRef(null); const [visible, setVisible] = useState(false); const [fadeValue, setFadeValue] = useState>( new Animated.Value(0), ); const [commentPreview, setCommentPreview] = useState(moment.comment_preview); const {keyboardVisible, currentScrollToIndex, scrollTo} = useContext(MomentContext); useEffect(() => { setTags(momentTags); }, [momentTags]); useEffect(() => { const fade = async () => { Animated.timing(fadeValue, { toValue: 1, duration: 250, easing: EasingNode.linear, }).start(); }; fade(); }, [fadeValue]); return ( { setVisible(!visible); setFadeValue(new Animated.Value(0)); }}> {tags.length > 0 && ( )} {visible && ( null} imageRef={imageRef} /> )} {(!keyboardVisible || currentScrollToIndex !== index) && ( <> {moment.caption !== '' && renderTextWithMentions({ value: moment.caption, styles: styles.captionText, partTypes: mentionPartTypes('momentCaption'), onPress: (user: UserType) => navigateToProfile( state, dispatch, navigation, screenType, user, ), })} )} setCommentPreview({ commenter: getLoggedInUserAsProfilePreview(state), comment: message, }) } onFocus={() => scrollTo(index)} theme={'dark'} /> {getTimePosted(moment.date_created)} ); }; const styles = StyleSheet.create({ container: {}, image: { width: SCREEN_WIDTH, aspectRatio: 1, marginBottom: '3%', }, text: { marginHorizontal: '5%', color: 'white', fontWeight: '500', textAlign: 'right', marginTop: 5, }, captionText: { position: 'relative', marginHorizontal: '5%', color: '#ffffff', fontWeight: '500', fontSize: normalize(13), lineHeight: normalize(15.51), letterSpacing: normalize(0.6), marginBottom: normalize(18), }, tapTag: { position: 'absolute', }, tagIcon: { width: normalize(30), height: normalize(30), position: 'absolute', bottom: '7%', left: normalize(20), }, }); export default MomentPostContent;