import {RouteProp} from '@react-navigation/native'; import {StackNavigationProp} from '@react-navigation/stack'; import React, {useEffect, useRef, useState} from 'react'; import {FlatList, Keyboard, ViewToken} from 'react-native'; import {useSelector} from 'react-redux'; import {MomentPost, TabsGradient} from '../../components'; import {MainStackParams} from '../../routes'; import {RootState} from '../../store/rootreducer'; import {MomentPostType} from '../../types'; type MomentContextType = { keyboardVisible: boolean; currentVisibleMomentId: string | undefined; }; export const MomentContext = React.createContext({} as MomentContextType); type IndividualMomentRouteProp = RouteProp; type IndividualMomentNavigationProp = StackNavigationProp< MainStackParams, 'IndividualMoment' >; interface IndividualMomentProps { route: IndividualMomentRouteProp; navigation: IndividualMomentNavigationProp; } const IndividualMoment: React.FC = ({route}) => { const { userXId, screenType, moment: {moment_category, moment_id}, } = route.params; const {moments} = useSelector((state: RootState) => userXId ? state.userX[screenType][userXId] : state.moments, ); const scrollRef = useRef>(null); const momentData = moments.filter( (m) => m.moment_category === moment_category, ); const initialIndex = momentData.findIndex((m) => m.moment_id === moment_id); const [keyboardVisible, setKeyboardVisible] = useState(false); const [currentVisibleMomentId, setCurrentVisibleMomentId] = useState< string | undefined >(); // https://stackoverflow.com/a/57502343 const viewabilityConfigCallback = useRef( (info: {viewableItems: ViewToken[]; changed: ViewToken[]}) => { const index = info.viewableItems[0].index; if (index !== null) { setCurrentVisibleMomentId(momentData[index].moment_id); } }, ); useEffect(() => { const showKeyboard = () => setKeyboardVisible(true); const hideKeyboard = () => setKeyboardVisible(false); Keyboard.addListener('keyboardWillShow', showKeyboard); Keyboard.addListener('keyboardWillHide', hideKeyboard); return () => { Keyboard.removeListener('keyboardWillShow', showKeyboard); Keyboard.removeListener('keyboardWillHide', hideKeyboard); }; }, []); return ( ( )} keyExtractor={(item, _) => item.moment_id} showsVerticalScrollIndicator={false} initialScrollIndex={initialIndex} onViewableItemsChanged={viewabilityConfigCallback.current} onScrollToIndexFailed={(info) => { setTimeout(() => { scrollRef.current?.scrollToIndex({ index: info.index, }); }, 500); }} pagingEnabled /> ); }; export default IndividualMoment;