Rocket.Chat.ReactNative/app/sagas/login.js

159 lines
5.0 KiB
JavaScript

import { AsyncStorage } from 'react-native';
import { take, put, call, takeLatest, select, all } from 'redux-saga/effects';
import * as types from '../actions/actionsTypes';
import {
loginRequest,
loginSubmit,
registerRequest,
registerIncomplete,
loginSuccess,
loginFailure,
setToken,
registerSuccess,
setUsernameRequest,
setUsernameSuccess,
forgotPasswordSuccess,
forgotPasswordFailure
} from '../actions/login';
import RocketChat from '../lib/rocketchat';
import * as NavigationService from '../containers/routes/NavigationService';
const getUser = state => state.login;
const getServer = state => state.server.server;
const loginCall = args => (args.resume ? RocketChat.login(args) : RocketChat.loginWithPassword(args));
const registerCall = args => RocketChat.register(args);
const setUsernameCall = args => RocketChat.setUsername(args);
const logoutCall = args => RocketChat.logout(args);
const meCall = args => RocketChat.me(args);
const forgotPasswordCall = args => RocketChat.forgotPassword(args);
const getToken = function* getToken() {
const currentServer = yield select(getServer);
const user = yield call([AsyncStorage, 'getItem'], `${ RocketChat.TOKEN_KEY }-${ currentServer }`);
if (user) {
try {
yield put(setToken(JSON.parse(user)));
yield call([AsyncStorage, 'setItem'], RocketChat.TOKEN_KEY, JSON.parse(user).token || '');
return JSON.parse(user);
} catch (e) {
console.log('getTokenerr', e);
}
} else {
yield put(setToken());
}
};
const handleLoginWhenServerChanges = function* handleLoginWhenServerChanges() {
try {
yield take(types.METEOR.SUCCESS);
yield call(getToken);
const user = yield select(getUser);
if (user.token) {
yield put(loginRequest({ resume: user.token }));
}
} catch (e) {
console.log(e);
}
};
const saveToken = function* saveToken() {
const [server, user] = yield all([select(getServer), select(getUser)]);
yield AsyncStorage.setItem(RocketChat.TOKEN_KEY, user.token);
yield AsyncStorage.setItem(`${ RocketChat.TOKEN_KEY }-${ server }`, JSON.stringify(user));
const token = yield AsyncStorage.getItem('pushId');
yield token && RocketChat.registerPushToken(user.user.id, token);
};
const handleLoginRequest = function* handleLoginRequest({ credentials }) {
try {
const server = yield select(getServer);
const user = yield call(loginCall, credentials);
// GET /me from REST API
const me = yield call(meCall, { server, token: user.token, userId: user.id });
// if user has username
if (me.username) {
user.username = me.username;
} else {
yield put(registerIncomplete());
}
yield put(loginSuccess(user));
} catch (err) {
yield put(loginFailure(err));
}
};
const handleLoginSubmit = function* handleLoginSubmit({ credentials }) {
yield put(loginRequest(credentials));
};
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 }) {
yield put(loginSubmit({
username: credentials.email,
password: credentials.pass
}));
};
const handleSetUsernameSubmit = function* handleSetUsernameSubmit({ credentials }) {
yield put(setUsernameRequest(credentials));
};
const handleSetUsernameRequest = function* handleSetUsernameRequest({ credentials }) {
try {
yield call(setUsernameCall, { credentials });
yield put(setUsernameSuccess());
} catch (err) {
yield put(loginFailure(err));
}
};
const handleLogout = function* handleLogout() {
const server = yield select(getServer);
yield call(logoutCall, { server });
};
const handleRegisterIncomplete = function* handleRegisterIncomplete() {
yield call(NavigationService.navigate, 'Register');
};
const handleForgotPasswordRequest = function* handleForgotPasswordRequest({ email }) {
try {
yield call(forgotPasswordCall, email);
yield put(forgotPasswordSuccess());
} catch (err) {
yield put(forgotPasswordFailure(err));
}
};
const root = function* root() {
yield takeLatest(types.SERVER.CHANGED, handleLoginWhenServerChanges);
yield takeLatest(types.LOGIN.REQUEST, handleLoginRequest);
yield takeLatest(types.LOGIN.SUCCESS, saveToken);
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);
};
export default root;