Skip to content

Commit

Permalink
using ipc for "server" side requests
Browse files Browse the repository at this point in the history
  • Loading branch information
walexnelson committed Jun 23, 2017
1 parent 13a7f76 commit 58ca20f
Show file tree
Hide file tree
Showing 17 changed files with 241 additions and 33 deletions.
3 changes: 2 additions & 1 deletion app/components/Header/header.component.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import IconAdd from 'material-ui/svg-icons/content/add';
import styles from './header.component.scss';
import DomoLogo from '../../../resources/icons/domo-logo.png';
Expand All @@ -9,7 +10,7 @@ export default class Header extends Component {
return (
<header className={styles.header}>
<div className={styles.brand}>
<img alt="Domo" src={DomoLogo} className={styles.brandImg} />
<Link to="/"><img alt="Domo" src={DomoLogo} className={styles.brandImg} /></Link>
<IconAdd className={styles.brandIcon} />
<img alt="Electron" src={ElectronLogo} className={styles.brandImg} />
</div>
Expand Down
12 changes: 11 additions & 1 deletion app/containers/App/app.container.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,18 @@ class App extends Component {
}

render() {
const listItems = this.props.logins.map(login =>
<li key={login}>{login}</li>
);

const content = this.props.isLoading
? <h2>Loading...</h2>
: <main className={styles.content}>{this.props.children}</main>;
: (
<main className={styles.content}>
<ul>{listItems}</ul>
{this.props.children}
</main>
);

return (
<div className={styles.appContainer}>
Expand All @@ -28,6 +37,7 @@ class App extends Component {
App.propTypes = {
children: PropTypes.node.isRequired,
isLoading: PropTypes.bool.isRequired,
logins: PropTypes.arrayOf(PropTypes.string).isRequired,
dispatch: PropTypes.func.isRequired
};

Expand Down
40 changes: 40 additions & 0 deletions app/containers/Data/data.container.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import styles from './data.container.scss';

import { getDatasetList } from '../../store/actions/data.actions';

class Data extends Component {
componentDidMount() {
const { dispatch } = this.props;
dispatch(getDatasetList('name', 50, 0));
}

render() {
return (
<div className={styles.dataContainer}>
<h1>Datacenter</h1>
{
this.props.isLoading
? 'Loading...'
: <ul>{ this.props.datasets.map(ds => <li key={ds.id}>{ds.name}</li>)}</ul>
}
</div>
);
}
}

Data.propTypes = {
isLoading: PropTypes.bool.isRequired,
datasets: PropTypes.arrayOf(PropTypes.shape).isRequired,
dispatch: PropTypes.func.isRequired,
};

const mapStateToProps = (state) => {
const { data } = state;

return data;
};

export default connect(mapStateToProps)(Data);
14 changes: 14 additions & 0 deletions app/containers/Data/data.container.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
.container {
position: absolute;
top: 30%;
left: 10px;
text-align: center;
}

.container h2 {
font-size: 5rem;
}

.container a {
font-size: 1.4rem;
}
19 changes: 19 additions & 0 deletions app/containers/Data/data.container.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import React from 'react';
import { expect } from 'chai';
import { shallow } from 'enzyme';
import Container from './home.container';


function setup() {
const component = shallow(<Container />);
return {
component
};
}

describe('(Container): Home', () => {
it('should render', () => {
const { component } = setup();
expect(component.first().type()).to.equal('h1');
});
});
3 changes: 3 additions & 0 deletions app/containers/Data/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import Data from './data.container';

export default Data;
9 changes: 8 additions & 1 deletion app/containers/Home/home.container.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
import styles from './home.container.scss';

export default class Home extends Component {
render() {
return (
<h1>Hello World</h1>
<div className={styles.homeContainer}>
<h1>Hello World</h1>
<ul>
<li><NavLink to="/datasets">Datasets</NavLink></li>
</ul>
</div>
);
}
}
3 changes: 2 additions & 1 deletion app/main.dev.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,5 @@ app.on('ready', async () => {
});

// Register IPC Event Listeners
ipcMain.on('get-logins', Events.getLogins);
ipcMain.on('LOGINS:LIST', Events.getLoginHistory);
ipcMain.on('DATASETS:LIST', Events.listDatasets);
2 changes: 2 additions & 0 deletions app/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ import { Switch, Route } from 'react-router';

import AppContainer from './containers/App';
import HomeContainer from './containers/Home';
import DataContainer from './containers/Data';

export default () => (
<AppContainer>
<Switch>
<Route path="/datasets" component={DataContainer} />
<Route path="/" component={HomeContainer} />
</Switch>
</AppContainer>
Expand Down
33 changes: 33 additions & 0 deletions app/store/actions/data.actions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { ipcRenderer } from 'electron';

export const actions = {
DATASET_LIST_REQUESTED: 'DATASETS:LIST',
DATASET_LIST_RETRIEVED: 'DATASETS:LIST:SUCCESS',
DATASET_LIST_FAILED: 'DATASETS:LIST:FAILED'
};

export function listRequested() {
return { type: actions.DATASET_LIST_REQUESTED };
}

export function listRetrieved(res) {
return {
type: actions.DATASET_LIST_RETRIEVED,
datasets: res.data ? res.data : res
};
}

export function listFailed(error) {
return {
type: actions.DATASET_LIST_FAILED,
error,
};
}

export const getDatasetList = (sort, limit, offset) => (dispatch) => {
dispatch(listRequested());

ipcRenderer.send(actions.DATASET_LIST_REQUESTED, { sort, limit, offset });
ipcRenderer.on(actions.DATASET_LIST_RETRIEVED, (event, args) => dispatch(listRetrieved(args)));
ipcRenderer.on(actions.DATASET_LIST_FAILED, (event, err) => dispatch(listFailed(err)));
};
16 changes: 7 additions & 9 deletions app/store/actions/login.actions.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { IOService } from '../services';

const io = new IOService();
import { ipcRenderer } from 'electron';

export const actions = {
LOGIN_REQUESTED: 'LOGIN_REQUESTED',
LOGIN_RETRIEVED: 'LOGIN_RETRIEVED',
LOGIN_FAILED: 'LOGIN_FAILED'
LOGIN_REQUESTED: 'LOGINS:LIST',
LOGIN_RETRIEVED: 'LOGINS:LIST:SUCCESS',
LOGIN_FAILED: 'LOGINS:LIST:FAILED'
};

export function loginsRequested() {
Expand All @@ -29,7 +27,7 @@ export function loginsFailed(error) {
export const getLogins = () => (dispatch) => {
dispatch(loginsRequested());

return io.getLogins()
.then(res => dispatch(loginsRetrieved(res)))
.catch(err => dispatch(loginsFailed(err)));
ipcRenderer.send(actions.LOGIN_REQUESTED);
ipcRenderer.on(actions.LOGIN_RETRIEVED, (event, args) => dispatch(loginsRetrieved(args)));
ipcRenderer.on(actions.LOGIN_FAILED, (event, args) => dispatch(loginsFailed(args)));
};
41 changes: 41 additions & 0 deletions app/store/reducers/data/data.reducer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { actions } from '../../actions/data.actions';

const { DATASET_LIST_REQUESTED, DATASET_LIST_RETRIEVED, DATASET_LIST_FAILED } = actions;

function handleListFailed(state, action) {
return {
...state,
isLoading: false,
error: action.error,
};
}

function handleListRequested(state) {
return {
...state,
isLoading: true,
};
}

function handleListRetrieved(state, action) {
return {
...state,
isLoading: false,
datasets: action.datasets,
};
}

const actionHandlers = new Map([
[DATASET_LIST_REQUESTED, handleListRequested],
[DATASET_LIST_RETRIEVED, handleListRetrieved],
[DATASET_LIST_FAILED, handleListFailed],
]);

export const INITIAL_STATE = {
datasets: [],
isLoading: false,
};

export function dataReducer(state = INITIAL_STATE, action) {
return (actionHandlers.has(action.type) ? actionHandlers.get(action.type)(state, action) : state);
}
File renamed without changes.
3 changes: 3 additions & 0 deletions app/store/reducers/index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { combineReducers } from 'redux';
import { loginReducer, INITIAL_STATE as loginState } from './login/login.reducer';
import { dataReducer, INITIAL_STATE as dataState } from './data/data.reducer';

export default combineReducers({
login: loginReducer,
data: dataReducer,
});

export const INITIAL_STATE = {
...loginState,
...dataState,
};
6 changes: 1 addition & 5 deletions app/store/services/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
import IOService from './io/io.service';

export default {
IOService,
};
export default {};
8 changes: 0 additions & 8 deletions app/store/services/io/io.service.js

This file was deleted.

62 changes: 55 additions & 7 deletions app/utils/events.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,59 @@
/* eslint no-param-reassign: ["error", { "props": false }] */
const Domo = require('domo-sdk');

module.exports = {
getLogins: (event) => {
event.returnValue = [
{ type: 'basic', user: '[email protected]', instance: 'anthem.domo.com', sid: '', token: '' },
{ type: 'basic', user: '[email protected]', instance: 'anthem.domo.com', sid: '', token: '' },
{ type: 'oauth', token: '', secret: '' }
];
const logins = [
{ type: 'basic', user: '[email protected]', instance: 'anthem', sid: '', token: '' },
{ type: 'basic', user: '[email protected]', instance: 'domo', sid: '', token: '' },
{ type: 'oauth', token: '', secret: '', instance: 'domo-sentinel.beta' }
];


const service = {
getLogins: () => logins,

getActiveSession: () => new Domo(process.env.DOMO_CLIENT_ID, process.env.DOMO_CLIENT_SECRET, 'api.domo.com'),

storeLogin: (login) => {
// todo
logins.push(login);
},

getLoginHistory: (event) => {
try {
const history = service.getLogins().map(i => i.instance);
event.sender.send('LOGINS:LIST:SUCCESS', history);
} catch (e) {
event.sender.send('LOGINS:LIST:FAILED', e);
}
},

loginWithAPI: ({ instance, token, secret }) => {
service.storeLogin({ type: 'oauth', instance, token, secret });
service.setActiveSession(instance);
},

loginWithUsername: ({ instance, username, password }) => {
// todo
service.storeLogin({ type: 'basic', instance, username, sid: '' });
service.setActiveSession(instance);
},

loginWithDevToken: ({ instance, token }) => {
// todo
service.storeLogin({ type: 'basic', instance, token });
service.setActiveSession(instance);
},

listDatasets: (event, { sort, limit, offset }) => {
service.getActiveSession().datasets
.list(sort, limit, offset)
.then(res => {
console.log('ListDataset', res);
event.sender.send('DATASETS:LIST:SUCCESS', res);
return res;
})
.catch(err => event.sender.send('DATASETS:LIST:FAILED', err));
}
};

module.exports = service;

0 comments on commit 58ca20f

Please sign in to comment.