vn-verdnaturachat/app/sagas/login.js

174 lines
5.1 KiB
JavaScript

import { AsyncStorage } from 'react-native';
import { delay } from 'redux-saga';
import {
put, call, take, takeLatest, select, all
} from 'redux-saga/effects';
import { Navigation } from 'react-native-navigation';
import * as types from '../actions/actionsTypes';
import { appStart } from '../actions';
import { serverFinishAdd } from '../actions/server';
import {
// loginRequest,
// loginSubmit,
registerRequest,
registerIncomplete,
// loginSuccess,
loginFailure,
// logout,
// setToken,
registerSuccess,
setUsernameRequest,
setUsernameSuccess,
forgotPasswordSuccess,
forgotPasswordFailure
} from '../actions/login';
import RocketChat from '../lib/rocketchat';
import log from '../utils/log';
import I18n from '../i18n';
const getUser = state => state.login.user;
const getServer = state => state.server.server;
const getIsConnected = state => state.meteor.connected;
const loginCall = args => RocketChat.loginWithPassword(args);
const registerCall = args => RocketChat.register(args);
const setUsernameCall = args => RocketChat.setUsername(args);
const loginSuccessCall = () => RocketChat.loginSuccess();
const logoutCall = args => RocketChat.logout(args);
const forgotPasswordCall = args => RocketChat.forgotPassword(args);
const handleLoginSuccess = function* handleLoginSuccess() {
try {
const user = yield select(getUser);
const adding = yield select(state => state.server.adding);
yield AsyncStorage.setItem(RocketChat.TOKEN_KEY, user.token);
if (!user.username || user.isRegistering) {
yield put(registerIncomplete());
} else {
yield delay(300);
if (adding) {
yield put(serverFinishAdd());
yield Navigation.dismissAllModals();
} else {
yield put(appStart('inside'));
}
}
} catch (e) {
log('handleLoginSuccess', e);
}
};
const handleRegisterSubmit = function* handleRegisterSubmit({ credentials }) {
yield put(registerRequest(credentials));
};
const handleRegisterRequest = function* handleRegisterRequest({ credentials }) {
try {
yield call(registerCall, { credentials });
yield put(registerSuccess(credentials));
} catch (err) {
yield put(loginFailure(err));
}
};
const handleRegisterSuccess = function* handleRegisterSuccess({ credentials }) {
try {
yield call(loginCall, {
username: credentials.email,
password: credentials.pass
});
} catch (err) {
yield put(loginFailure(err));
}
};
const handleSetUsernameSubmit = function* handleSetUsernameSubmit({ credentials }) {
yield put(setUsernameRequest(credentials));
};
const handleSetUsernameRequest = function* handleSetUsernameRequest({ credentials }) {
try {
yield call(setUsernameCall, { credentials });
yield put(setUsernameSuccess());
yield call(loginSuccessCall);
} catch (err) {
yield put(loginFailure(err));
}
};
const handleLogout = function* handleLogout() {
const server = yield select(getServer);
if (server) {
try {
yield put(appStart('outside'));
yield call(logoutCall, { server });
} catch (e) {
log('handleLogout', e);
}
}
};
const handleRegisterIncomplete = function* handleRegisterIncomplete() {
const server = yield select(state => state.server);
if (!server.adding) {
yield put(appStart('outside'));
}
};
const handleForgotPasswordRequest = function* handleForgotPasswordRequest({ email }) {
try {
yield call(forgotPasswordCall, email);
yield put(forgotPasswordSuccess());
} catch (err) {
yield put(forgotPasswordFailure(err));
}
};
const watchLoginOpen = function* watchLoginOpen() {
try {
const isConnected = yield select(getIsConnected);
if (!isConnected) {
yield take(types.METEOR.SUCCESS);
}
const sub = yield RocketChat.subscribe('meteor.loginServiceConfiguration');
yield take(types.LOGIN.CLOSE);
if (sub) {
yield sub.unsubscribe().catch(err => console.warn(err));
}
} catch (e) {
log('watchLoginOpen', e);
}
};
const handleSetUser = function* handleSetUser() {
yield delay(2000);
const [server, user] = yield all([select(getServer), select(getUser)]);
if (user) {
// TODO: temporary... remove in future releases
// delete user.user;
if (user.language) {
I18n.locale = user.language;
}
}
yield AsyncStorage.setItem(`${ RocketChat.TOKEN_KEY }-${ server }`, JSON.stringify(user));
};
const root = function* root() {
// yield takeLatest(types.METEOR.SUCCESS, handleLoginWhenServerChanges);
// yield takeLatest(types.LOGIN.REQUEST, handleLoginRequest);
yield takeLatest(types.LOGIN.SUCCESS, handleLoginSuccess);
// yield takeLatest(types.LOGIN.SUBMIT, handleLoginSubmit);
yield takeLatest(types.LOGIN.REGISTER_REQUEST, handleRegisterRequest);
yield takeLatest(types.LOGIN.REGISTER_SUBMIT, handleRegisterSubmit);
yield takeLatest(types.LOGIN.REGISTER_SUCCESS, handleRegisterSuccess);
yield takeLatest(types.LOGIN.REGISTER_INCOMPLETE, handleRegisterIncomplete);
yield takeLatest(types.LOGIN.SET_USERNAME_SUBMIT, handleSetUsernameSubmit);
yield takeLatest(types.LOGIN.SET_USERNAME_REQUEST, handleSetUsernameRequest);
yield takeLatest(types.LOGOUT, handleLogout);
yield takeLatest(types.FORGOT_PASSWORD.REQUEST, handleForgotPasswordRequest);
yield takeLatest(types.LOGIN.OPEN, watchLoginOpen);
yield takeLatest(types.USER.SET, handleSetUser);
};
export default root;