From 48332a4510616d5874d510a154131daa0c121362 Mon Sep 17 00:00:00 2001 From: Ezerous Date: Thu, 3 May 2018 16:11:42 +0300 Subject: [PATCH] userSaga init --- package.json | 3 +- src/containers/UsernameFormContainer.js | 1 - src/drizzleOptions.js | 8 ++- src/layouts/home/Home.js | 3 +- src/reducer.js | 6 +- src/rootSaga.js | 8 ++- src/userReducer.js | 26 +++++++++ src/userSaga.js | 74 +++++++++++++++++++++++++ 8 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 src/userReducer.js create mode 100644 src/userSaga.js diff --git a/package.json b/package.json index 159cbbf..0de2376 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,8 @@ "react-router": "^3.2.1", "react-router-redux": "^4.0.8", "redux": "^3.7.2", - "redux-auth-wrapper": "1.1.0", "redux-saga": "0.16.0", - "web3":"^1.0.0-beta.34" + "web3": "^1.0.0-beta.34" }, "scripts": { "start": "react-scripts start", diff --git a/src/containers/UsernameFormContainer.js b/src/containers/UsernameFormContainer.js index 469a47f..8b299cb 100644 --- a/src/containers/UsernameFormContainer.js +++ b/src/containers/UsernameFormContainer.js @@ -45,7 +45,6 @@ class UsernameFormContainer extends Component { } } - console.dir(initialState); this.state = initialState; } diff --git a/src/drizzleOptions.js b/src/drizzleOptions.js index e6889d8..88e4204 100644 --- a/src/drizzleOptions.js +++ b/src/drizzleOptions.js @@ -11,8 +11,12 @@ const drizzleOptions = { Forum ], events: { - Forum: ['UserSignedUp'] - } + Forum: ['UserSignedUp', 'UsernameUpdated'] + }, + polls: { + accounts: 3000, + blocks: 3000 + }, }; export default drizzleOptions \ No newline at end of file diff --git a/src/layouts/home/Home.js b/src/layouts/home/Home.js index 2b68cc5..974deae 100644 --- a/src/layouts/home/Home.js +++ b/src/layouts/home/Home.js @@ -1,5 +1,5 @@ import React, { Component } from 'react' -import { AccountData, ContractData } from 'drizzle-react-components' +import { ContractData } from 'drizzle-react-components' import UsernameFormContainer from '../../containers/UsernameFormContainer' class Home extends Component { @@ -13,7 +13,6 @@ class Home extends Component {

Account

-

Username:



diff --git a/src/reducer.js b/src/reducer.js index 9db9303..d49b26d 100644 --- a/src/reducer.js +++ b/src/reducer.js @@ -1,10 +1,12 @@ import { combineReducers } from 'redux' import { routerReducer } from 'react-router-redux' import { drizzleReducers } from 'drizzle' +import userReducer from "./userReducer"; const reducer = combineReducers({ - routing: routerReducer, - ...drizzleReducers + routing: routerReducer, + user: userReducer, + ...drizzleReducers }); export default reducer diff --git a/src/rootSaga.js b/src/rootSaga.js index d9f654b..8206b5a 100644 --- a/src/rootSaga.js +++ b/src/rootSaga.js @@ -1,8 +1,10 @@ import { all, fork } from 'redux-saga/effects' import { drizzleSagas } from 'drizzle' +import userSaga from "./userSaga"; export default function* root() { - yield all( - drizzleSagas.map(saga => fork(saga)) - ) + let sagas = [...drizzleSagas,userSaga]; + yield all( + sagas.map(saga => fork(saga)) + ) } \ No newline at end of file diff --git a/src/userReducer.js b/src/userReducer.js new file mode 100644 index 0000000..17b893d --- /dev/null +++ b/src/userReducer.js @@ -0,0 +1,26 @@ +const initialState = { + username: "Guest", + address: "0x0", + hasSignedUp: false +}; + +const userReducer = (state = initialState, action) => { + switch (action.type) { + case 'USER_HAS_SIGNED_UP': + return { + username: action.username, + address: action.address, + hasSignedUp: true + }; + case 'USER_IS_GUEST': + return { + username: "Guest", + address: action.address, + hasSignedUp: false + }; + default: + return state + } +}; + +export default userReducer diff --git a/src/userSaga.js b/src/userSaga.js new file mode 100644 index 0000000..9fd562c --- /dev/null +++ b/src/userSaga.js @@ -0,0 +1,74 @@ +import { call, put, select, takeLatest, takeEvery } from 'redux-saga/effects' + +const accounts = (state) => state.accounts; +let account; + +let initFlag = false; + +let forumContract; +let contractGrabbed = false; + + +function* initUser() { + if(!initFlag) + { + while(true) + if(contractGrabbed) + { + yield call(getUserData); + initFlag=true; + break; + } + } +} + +function grabContract({contract}) { + if(!contractGrabbed) + { + forumContract = contract; + contractGrabbed=true; + } +} + +function* updateUserData() { + if(initFlag) + yield call(getUserData); +} + + +function* getUserData() { + account = (yield select(accounts))[0]; + forumContract.methods["hasUserSignedUp"].cacheCall(...[account]); + const txObject = yield call(forumContract.methods["hasUserSignedUp"], ...[account]); + try { + const callResult = yield call(txObject.call, {address:account}); + if(callResult) + { + const username = yield call(forumContract.methods["getUsername"], ...[account]); + const dispatchArgs = { + address: account, + username: username + }; + yield put({type: 'USER_HAS_SIGNED_UP', ...dispatchArgs}); //TODO: only dispatch if needed + } + else{ + const dispatchArgs = { + address: account, + }; + yield put({type: 'USER_IS_GUEST', ...dispatchArgs}); //TODO: only dispatch if needed + } + } + catch (error) { + console.error(error); + yield put({type: 'USER_FETCHING_ERROR', ...[]}) + } +} + + +function* userSaga() { + yield takeLatest('LISTEN_FOR_EVENT', grabContract); + yield takeLatest("DRIZZLE_INITIALIZED", initUser); + yield takeEvery("ACCOUNTS_FETCHED", updateUserData); +} + +export default userSaga;