import { AsyncStorage } from 'react-native'; import { take, put, call, takeEvery, fork, select, all, race } from 'redux-saga/effects'; import * as types from '../actions/actionsTypes'; import { loginRequest, loginSuccess, loginFailure, setToken } from '../actions/login'; import RocketChat from '../lib/rocketchat'; const TOKEN_KEY = 'reactnativemeteor_usertoken'; const getUser = state => state.login; const getServer = state => state.server; const loginCall = args => (args.resume ? RocketChat.login(args) : RocketChat.loginWithPassword(args)); const getToken = function* getToken() { const currentServer = yield select(getServer); const user = yield call([AsyncStorage, 'getItem'], `${ TOKEN_KEY }-${ currentServer }`); if (user) { try { yield put(setToken(JSON.parse(user))); yield call([AsyncStorage, 'setItem'], TOKEN_KEY, JSON.parse(user).token || ''); return JSON.parse(user); } catch (e) { console.log('getTokenerr', e); } } }; const handleLoginWhenServerChanges = function* handleLoginWhenServerChanges() { // do { try { yield take(types.METEOR.SUCCESS); const { navigator } = yield select(state => state); navigator.resetTo({ screen: 'Rooms' }); const user = yield select(getUser); if (user.token) { yield put(loginRequest({ resume: user.token })); // console.log('AEEEEEEEEOOOOO'); // // wait for a response // const { error } = yield race({ // success: take(types.LOGIN.SUCCESS), // error: take(types.LOGIN.FAILURE) // }); // console.log('AEEEEEEEEOOOOO', error); // if (!error) { // navigator.resetTo({ // screen: 'Rooms' // }); // } } } catch (e) { console.log(e); } // } while (true); }; const saveToken = function* saveToken() { const [server, user] = yield all([select(getServer), select(getUser)]); yield AsyncStorage.setItem(TOKEN_KEY, user.token); yield AsyncStorage.setItem(`${ TOKEN_KEY }-${ server }`, JSON.stringify(user)); }; const handleLoginRequest = function* handleLoginRequest() { while (true) { const { credentials } = yield take(types.LOGIN.REQUEST); try { const response = yield call(loginCall, credentials); yield put(loginSuccess(response)); } catch (err) { // console.log('login failed'); yield put(loginFailure(err)); } } }; const handleLoginSubmit = function* handleLoginSubmit() { while (true) { const { credentials } = yield take(types.LOGIN.SUBMIT); // put a login request yield put(loginRequest(credentials)); // wait for a response const { error } = yield race({ success: take(types.LOGIN.SUCCESS), error: take(types.LOGIN.FAILURE) }); if (!error) { const { navigator } = yield select(state => state); navigator.resetTo({ screen: 'Rooms' }); } } }; const root = function* root() { yield takeEvery(types.SERVER.CHANGED, getToken); yield takeEvery(types.SERVER.CHANGED, handleLoginWhenServerChanges); yield fork(handleLoginRequest); yield takeEvery(types.LOGIN.SUCCESS, saveToken); yield fork(handleLoginSubmit); }; export default root;