diff options
Diffstat (limited to 'src/utils/users.ts')
-rw-r--r-- | src/utils/users.ts | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/utils/users.ts b/src/utils/users.ts new file mode 100644 index 00000000..30b9d77b --- /dev/null +++ b/src/utils/users.ts @@ -0,0 +1,97 @@ +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<string> => { + const token = await AsyncStorage.getItem('token'); + if (!token) { + dispatch({type: userLoggedIn.type, payload: {userId: '', username: ''}}); + return ''; + } + return token; +}; |