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;
};
|