login saga (incomplete)

This commit is contained in:
Guilherme Gazzo 2017-08-16 20:29:12 -03:00
parent 618d5450dc
commit 9553ecbcaf
No known key found for this signature in database
GPG Key ID: 1F85C9AD922D0829
11 changed files with 166 additions and 45 deletions

View File

@ -0,0 +1,17 @@
const REQUEST = 'REQUEST';
const SUCCESS = 'SUCCESS';
const FAILURE = 'FAILURE';
function createRequestTypes(base) {
const res = {};
[REQUEST, SUCCESS, FAILURE].forEach(type => res[type] = `${ base }_${ type }`);
return res;
}
// Login events
export const LOGIN = createRequestTypes('LOGIN');
export const LOGOUT = 'LOGOUT'; // logout is always success
export const INCREMENT = 'INCREMENT';
export const DECREMENT = 'DECREMENT';

View File

@ -13,6 +13,12 @@ export function setAllSettings(settings) {
payload: settings
};
}
export function login() {
return {
type: 'LOGIN'
};
}
// // GENRES
// export function retrieveMoviesGenresSuccess(res) {

30
app/actions/login.js Normal file
View File

@ -0,0 +1,30 @@
import * as types from './actionsTypes';
export function loginRequest(email, password) {
return {
type: types.LOGIN.REQUEST,
email,
password
};
}
export function loginSuccess({ token, user }) {
return {
type: types.LOGIN.SUCCESS,
token,
user
};
}
export function loginFailure(err) {
return {
type: types.LOGIN.FAILURE,
err
};
}
export function logout() {
return {
type: types.LOGOUT
};
}

View File

@ -109,15 +109,16 @@ const RocketChat = {
},
login(params, callback) {
Meteor._startLoggingIn();
Meteor.call('login', params, (err, result) => {
Meteor._endLoggingIn();
Meteor._handleLoginCallback(err, result);
if (typeof callback === 'function') {
callback(err);
}
return new Promise((resolve, reject) => {
Meteor._startLoggingIn();
Meteor.call('login', params, (err, result) => {
Meteor._endLoggingIn();
Meteor._handleLoginCallback(err, result);
err ? reject(err) : resolve(result);
if (typeof callback === 'function') {
callback(err, result);
}
});
});
},
@ -162,7 +163,7 @@ const RocketChat = {
};
}
this.login(params, callback);
return this.login(params, callback);
},
loadSubscriptions(cb) {

38
app/reducers/login.js Normal file
View File

@ -0,0 +1,38 @@
import * as types from '../actions/actionsTypes';
const initialState = {
isAuthenticated: false,
isFetching: false,
token: '',
user: {},
errorMessage: ''
};
export default function login(state = initialState, action) {
switch (action.type) {
case types.LOGIN.REQUEST:
return { ...state,
isFetching: true,
isAuthenticated: false
};
case types.LOGIN.SUCCESS:
return { ...state,
isFetching: false,
isAuthenticated: true,
token: action.token,
failure: false,
user: action.user
};
case types.LOGIN.FAILURE:
return { ...state,
isFetching: false,
isAuthenticated: false,
failure: true,
errorMessage: action.err
};
case types.LOGOUT:
return initialState;
default:
return state;
}
}

View File

@ -1,8 +1,9 @@
import { combineReducers } from 'redux';
import * as reducers from './reducers';
import * as login from './login';
const rootReducer = combineReducers({
...reducers
...reducers, ...login
});
export default rootReducer;

View File

@ -4,8 +4,8 @@ import 'regenerator-runtime/runtime';
const foreverAlone = function* foreverAlone() {
yield take('cagado');
console.log('foi cagado');
yield take('FOI');
console.log('FOIIIIIII');
yield take('voa');
console.log('o');
};

27
app/sagas/login.js Normal file
View File

@ -0,0 +1,27 @@
import React from 'react';
import { take, put, call, fork, select } from 'redux-saga/effects';
import * as types from '../actions/actionsTypes';
import { loginSuccess, loginFailure } from '../actions/login';
import RocketChat from '../lib/rocketchat';
function loginCall(...args) {
return RocketChat.loginWithPassword(...args);
}
function* watchLoginRequest() {
while (true) {
const payload = yield take(types.LOGIN.REQUEST);
try {
const response = yield call(loginCall, payload);
yield put(loginSuccess(response));
console.log('SAGA LOGIN SUCCESS: ', response);
} catch (err) {
console.log('SAGA LOGIN ERR: ', err);
yield put(loginFailure(err.status));
}
}
}
export default function* root() {
yield fork(watchLoginRequest);
}

View File

@ -40,6 +40,7 @@ const styles = StyleSheet.create({
}), dispatch => ({
actions: bindActionCreators(actions, dispatch)
}))
export default class LoginView extends React.Component {
static propTypes = {
navigator: PropTypes.object.isRequired,

View File

@ -8,7 +8,6 @@ import { Text, View, StyleSheet, TouchableOpacity, Platform, TextInput } from 'r
import Meteor from 'react-native-meteor';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import * as actions from '../actions';
import realm from '../lib/realm';
import RocketChat from '../lib/rocketchat';
@ -96,7 +95,8 @@ class RoomsListItem extends React.PureComponent {
server: state.server,
Site_Url: state.settings.Site_Url
}), dispatch => ({
actions: bindActionCreators(actions, dispatch)
actions: bindActionCreators(actions, dispatch),
login: () => dispatch(actions.login())
}))
export default class RoomsListView extends React.Component {
@ -382,7 +382,7 @@ export default class RoomsListView extends React.Component {
renderCreateButtons() {
return (
<ActionButton buttonColor='rgba(231,76,60,1)'>
<ActionButton.Item buttonColor='#9b59b6' title='Create Channel' onPress={() => { this._createChannel(); }} >
<ActionButton.Item buttonColor='#9b59b6' title='Create Channel' onPress={() => { this.props.login(); }} >
<Icon name='md-chatbubbles' style={styles.actionButtonIcon} />
</ActionButton.Item>
</ActionButton>);

58
package-lock.json generated
View File

@ -115,7 +115,7 @@
"anymatch": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
"integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
"integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
"requires": {
"micromatch": "2.3.11",
"normalize-path": "2.1.1"
@ -173,7 +173,7 @@
"arr-flatten": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
"integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE="
"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
},
"array-differ": {
"version": "1.0.0",
@ -265,7 +265,7 @@
"async": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz",
"integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=",
"integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==",
"requires": {
"lodash": "4.17.4"
}
@ -1086,7 +1086,7 @@
"babylon": {
"version": "6.17.4",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz",
"integrity": "sha1-Pot0AriNIsNCPhN6FXeIOxX/hpo="
"integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw=="
},
"balanced-match": {
"version": "1.0.0",
@ -1814,7 +1814,7 @@
"diff": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz",
"integrity": "sha1-BWaVFQ16qTI3yn43isOxaCt5Y7k=",
"integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==",
"dev": true
},
"doctrine": {
@ -2307,7 +2307,7 @@
"esprima": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
"integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
"integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
"dev": true
},
"esquery": {
@ -2869,7 +2869,7 @@
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"requires": {
"fs.realpath": "1.0.0",
"inflight": "1.0.6",
@ -2908,7 +2908,7 @@
"globals": {
"version": "9.18.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
"integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo="
"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
},
"globby": {
"version": "5.0.0",
@ -3094,7 +3094,7 @@
"hosted-git-info": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
"integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw="
"integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
},
"html-encoding-sniffer": {
"version": "1.0.1",
@ -3149,7 +3149,7 @@
"iconv-lite": {
"version": "0.4.18",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz",
"integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI="
"integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA=="
},
"ignore": {
"version": "3.3.3",
@ -3189,7 +3189,7 @@
"inquirer": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.1.tgz",
"integrity": "sha1-Bs6w9UD0XKVIwX1oQJWYeCZfoXU=",
"integrity": "sha512-QgW3eiPN8gpj/K5vVpHADJJgrrF0ho/dZGylikGX7iqAdRgC9FVKYKWFLx6hZDBFcOLEoSqINYrVPeFAeG/PdA==",
"requires": {
"ansi-escapes": "2.0.0",
"chalk": "2.0.1",
@ -3484,13 +3484,13 @@
"istanbul-lib-coverage": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz",
"integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=",
"integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==",
"dev": true
},
"istanbul-lib-hook": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz",
"integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=",
"integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==",
"dev": true,
"requires": {
"append-transform": "0.4.0"
@ -3514,7 +3514,7 @@
"istanbul-lib-report": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz",
"integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=",
"integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==",
"dev": true,
"requires": {
"istanbul-lib-coverage": "1.1.1",
@ -3543,7 +3543,7 @@
"istanbul-lib-source-maps": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz",
"integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=",
"integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==",
"dev": true,
"requires": {
"debug": "2.6.8",
@ -3556,7 +3556,7 @@
"istanbul-reports": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz",
"integrity": "sha1-BCvlyJ4XW8P4ZSPKqynAFOd/7k4=",
"integrity": "sha512-P8G873A0kW24XRlxHVGhMJBhQ8gWAec+dae7ZxOBzxT4w+a9ATSPvRVK3LB1RAJ9S8bg2tOyWHAGW40Zd2dKfw==",
"dev": true,
"requires": {
"handlebars": "4.0.10"
@ -4237,7 +4237,7 @@
"js-yaml": {
"version": "3.9.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz",
"integrity": "sha1-CHdc69/dNZIJ8NKs04PI+GppBKA=",
"integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==",
"dev": true,
"requires": {
"argparse": "1.0.9",
@ -4253,7 +4253,7 @@
"jschardet": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.0.tgz",
"integrity": "sha1-ph8xAwalpxGI4bGs0IrdPPuwix4="
"integrity": "sha512-+Q8JsoEQbrdE+a/gg1F9XO92gcKXgpE5UACqr0sIubjDmBEkd+OOWPGzQeMrWSLxd73r4dHxBeRW7edHu5LmJQ=="
},
"jsdom": {
"version": "9.12.0",
@ -4583,7 +4583,7 @@
"lru-cache": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
"integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=",
"integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
"requires": {
"pseudomap": "1.0.2",
"yallist": "2.1.2"
@ -4812,7 +4812,7 @@
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
"brace-expansion": "1.1.8"
}
@ -4960,7 +4960,7 @@
"node-fetch": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz",
"integrity": "sha1-iZyz0KPJL5UsR/G4dvTIrqvUANU=",
"integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==",
"requires": {
"encoding": "0.1.12",
"is-stream": "1.1.0"
@ -5057,7 +5057,7 @@
"normalize-package-data": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
"integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
"integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"requires": {
"hosted-git-info": "2.5.0",
"is-builtin-module": "1.0.0",
@ -5451,7 +5451,7 @@
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "2.0.6"
}
@ -5506,7 +5506,7 @@
"randomatic": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
"integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=",
"integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
"requires": {
"is-number": "3.0.0",
"kind-of": "4.0.0"
@ -5860,7 +5860,7 @@
"react-native-drawer-layout": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/react-native-drawer-layout/-/react-native-drawer-layout-1.3.2.tgz",
"integrity": "sha1-uXQNdmOh3E+IphucbZPS2UjqQm4=",
"integrity": "sha512-fjO0scqbJUfNu2wuEpvywL7DYLXuCXJ2W/zYhWz986rdLytidbys1QGVvkaszHrb4Y7OqO96mTkgpOcP8KWevw==",
"requires": {
"react-native-dismiss-keyboard": "1.0.0"
}
@ -5868,7 +5868,7 @@
"react-native-drawer-layout-polyfill": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/react-native-drawer-layout-polyfill/-/react-native-drawer-layout-polyfill-1.3.2.tgz",
"integrity": "sha1-GSyE16WmuKbSvix9ql5BZFGNDMc=",
"integrity": "sha512-XzPhfLDJrYHru+e8+dFwhf0FtTeAp7JXPpFYezYV6P1nTeA1Tia/kDpFT+O2DWTrBKBEI8FGhZnThrroZmHIxg==",
"requires": {
"react-native-drawer-layout": "1.3.2"
}
@ -6219,7 +6219,7 @@
"readable-stream": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
"integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=",
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
@ -6454,7 +6454,7 @@
"resolve": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
"integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=",
"integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
"dev": true,
"requires": {
"path-parse": "1.0.5"
@ -6934,7 +6934,7 @@
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
"is-fullwidth-code-point": "2.0.0",
"strip-ansi": "4.0.0"