import React, {Fragment, useEffect, useState} from 'react'; import {StyleSheet} from 'react-native'; import Animated from 'react-native-reanimated'; import {useSafeAreaInsets} from 'react-native-safe-area-context'; import {useDispatch, useSelector} from 'react-redux'; import { INTEGRATED_SOCIAL_LIST, PROFILE_CUTOUT_BOTTOM_Y, SOCIAL_LIST, } from '../../constants'; import {getLinkedSocials} from '../../services'; import {loadIndividualSocial, updateSocial} from '../../store/actions'; import {RootState} from '../../store/rootReducer'; import {ScreenType} from '../../types'; import Tagg from './Tagg'; const {View, ScrollView, interpolate, Extrapolate} = Animated; interface TaggsBarProps { y: Animated.Value; profileBodyHeight: number; userXId: string | undefined; screenType: ScreenType; whiteRing: boolean | undefined; linkedSocials?: string[]; } const TaggsBar: React.FC = ({ y, profileBodyHeight, userXId, screenType, whiteRing, linkedSocials, }) => { const dispatch = useDispatch(); let [taggs, setTaggs] = useState([]); let [taggsNeedUpdate, setTaggsNeedUpdate] = useState(true); const {user} = useSelector((state: RootState) => userXId ? state.userX[screenType][userXId] : state.user, ); /** * Updates the individual social that needs update * If username is empty, update nonintegrated socials like Snapchat and TikTok * @param socialType Type of the social that needs update */ const handleSocialUpdate = (socialType: string, username: string) => { if (username !== '') { dispatch(updateSocial(socialType, username)); } else { dispatch(loadIndividualSocial(user.userId, socialType)); } }; /** * This useEffect should be called evey time the user being viewed is changed OR * And update is triggered manually */ useEffect(() => { const loadData = async () => { const socials: string[] = linkedSocials ? linkedSocials : await getLinkedSocials(user.userId); const unlinkedSocials = SOCIAL_LIST.filter( (s) => socials.indexOf(s) === -1, ); let new_taggs = []; let i = 0; for (let social of socials) { new_taggs.push( , ); i++; } if (!userXId && !whiteRing) { for (let social of unlinkedSocials) { new_taggs.push( , ); i++; } } setTaggs(new_taggs); setTaggsNeedUpdate(false); }; if (user.userId) { loadData(); } }, [taggsNeedUpdate, user]); const shadowOpacity: Animated.Node = interpolate(y, { inputRange: [ PROFILE_CUTOUT_BOTTOM_Y + profileBodyHeight, PROFILE_CUTOUT_BOTTOM_Y + profileBodyHeight + 20, ], outputRange: [0, 0.2], extrapolate: Extrapolate.CLAMP, }); const paddingTop: Animated.Node = interpolate(y, { inputRange: [ PROFILE_CUTOUT_BOTTOM_Y + profileBodyHeight - (useSafeAreaInsets().top + 10), PROFILE_CUTOUT_BOTTOM_Y + profileBodyHeight, ], outputRange: [10, useSafeAreaInsets().top], extrapolate: Extrapolate.CLAMP, }); return taggs.length > 0 ? ( {taggs} ) : ( ); }; const styles = StyleSheet.create({ spContainer: { shadowColor: '#000', shadowRadius: 10, shadowOffset: {width: 0, height: 2}, zIndex: 1, marginBottom: 25, }, container: { backgroundColor: 'white', shadowColor: '#000', shadowRadius: 10, shadowOffset: {width: 0, height: 2}, zIndex: 1, paddingBottom: 5, }, contentContainer: { alignItems: 'center', paddingBottom: 5, }, }); export default TaggsBar;