import {RootState} from './../store/rootReducer'; import AsyncStorage from '@react-native-community/async-storage'; import {AppDispatch} from './../store/configureStore'; import {UserType, ScreenType} from './../types/types'; import {INTEGRATED_SOCIAL_LIST} from '../constants'; import { loadAllSocials, loadBlockedList, loadFollowData, loadRecentlySearched, loadUserData, loadUserMoments, } from '../store/actions'; import {NO_SOCIAL_ACCOUNTS} from '../store/initialStates'; import {loadSocialPosts} from '../services'; import {userLoggedIn} from '../store/reducers'; const loadData = async (dispatch: AppDispatch, user: UserType) => { await Promise.all([ dispatch(loadUserData(user)), dispatch(loadFollowData(user.userId)), dispatch(loadUserMoments(user.userId)), dispatch(loadAllSocials(user.userId)), dispatch(loadBlockedList(user.userId)), dispatch(loadRecentlySearched()), ]); }; /** * This tries to log the user in present with the AsyncStorage if user.userId is empty * Else it tries to login the user passed in * @param dispatch This is the dispatch object from the redux store * @param user The user if at all any */ export const userLogin = async (dispatch: AppDispatch, user: UserType) => { try { let localUser = {...user}; if (!user.userId) { const [id, username, token] = await Promise.all([ AsyncStorage.getItem('userId'), AsyncStorage.getItem('username'), AsyncStorage.getItem('token'), ]); if (id && username && token) { localUser = {...localUser, userId: id, username: username}; } else { return; } } await loadData(dispatch, localUser); } catch (error) { console.log(error); } }; /** * This function checks if the userX slice of our store contains the given user for the provided Screen */ export const userXInStore = ( state: RootState, screen: ScreenType, userId: string, ) => { const userX = state.userX[screen]; return userId in userX && userX[userId].user.userId; }; /** * Abstracted the code to laod all socials out. * @param userId userId for whom socials should be fetched */ export const loadAllSocialsForUser = async (userId: string) => { let socials = NO_SOCIAL_ACCOUNTS; try { let socialNeedsUpdate = INTEGRATED_SOCIAL_LIST; for (let socialType of socialNeedsUpdate) { const social = await loadSocialPosts(userId, socialType); socials = {...socials, [socialType]: social}; } return socials; } catch (error) { console.log(error); } }; /** * Push the user out of system if token is not present in async storage * @param dispatch */ export const getTokenOrLogout = async (dispatch: Function): Promise => { const token = await AsyncStorage.getItem('token'); if (!token) { dispatch({type: userLoggedIn.type, payload: {userId: '', username: ''}}); return ''; } return token; };