I am trying to implement FB login functionality within my app using react native. One of the issues I am facing is that when I check to see if i have fb token stored, the initialization of the react navigator does not wait for the function to complete. I know this because I see in my debugger statements appearing for navigation initialization before my isLoggedIntoFB() returning a result. I am confused because I thought I was calling my functions in a synchronous way.
auth/index.js:
const FBSDK = require('react-native-fbsdk');
const {
AccessToken,
LoginManager,
} = FBSDK;
export const isLoggedIn = () => {
if(isLoggedIntoFB()) {
return true;
} else {
// returning false even though isLoggedIntoFB() prints "tokenFound"
// statement later
return false;
}
}
export const OnLogout = () => {
alert("Logging out");
logoutFB();
}
function isLoggedIntoFB() {
alert("isLoggedIn");
AccessToken.getCurrentAccessToken().then(
(data) => {
console.log(data);
if(data.accessToken != null){
console.log("Token Found")
return true;
} else {
console.log("No previous token found")
return false;
}
}
);
}
logoutFB = () => {
LoginManager.logOut();
//AccessToken.setCurrentAccessToken(null);
}
reducer/index.js:
import { combineReducers } from 'redux';
import { NavigationActions } from 'react-navigation';
import { AppNavigator } from '../navigators/AppNavigator';
import { isLoggedIn } from "../auth";
var initialNavState = (function() {
if(isLoggedIn() ) { // immediately evaluates to false
console.log("LoggedIn!!!");
return AppNavigator.router.getStateForAction(NavigationActions.reset({
index: 0,
actions: [
NavigationActions.navigate({
routeName: 'LoggedIn',
}),
],
}));
} else {
console.log("not Logged In");
return AppNavigator.router.getStateForAction(NavigationActions.reset({
index: 1,
actions: [
NavigationActions.navigate({ routeName: 'LoggedIn'}),
NavigationActions.navigate({ routeName: 'LoggedOut'})
]
}));
}
}
) ();
function nav(state = initialNavState, action) {
let nextState;
switch (action.type) {
case 'LOGIN':
nextState = AppNavigator.router.getStateForAction(
NavigationActions.back(),
state
);
break;
case 'LOGOUT':
nextState = AppNavigator.router.getStateForAction(
NavigationActions.navigate({ routeName: 'LoggedOut' }),
state
);
break;
default:
nextState = AppNavigator.router.getStateForAction(action, state);
break;
}
// Simply return the original `state` if `nextState` is null or undefined.
return nextState || state;
}