aboutsummaryrefslogtreecommitdiff
path: root/src/utils/users.ts
blob: 30b9d77b5144694802285742c932e6508765b364 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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;
};