Files
openethereum/js/src/dapps/gavcoin/Events/events.js
Jaco Greeff 7eacf07629 Align contract event log l&f with transactions (#2812)
* Event into own component, align with transactions

* Pass value & type through from event log params

* Reformat display columns
2016-10-25 16:02:12 +02:00

162 lines
4.1 KiB
JavaScript

// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import React, { Component, PropTypes } from 'react';
import { api } from '../parity';
import EventBuyin from './EventBuyin';
import EventNewTranch from './EventNewTranch';
import EventRefund from './EventRefund';
import EventTransfer from './EventTransfer';
import styles from './events.css';
export default class Events extends Component {
static childContextTypes = {
accounts: PropTypes.array
}
static contextTypes = {
contract: PropTypes.object.isRequired,
instance: PropTypes.object.isRequired
}
static propTypes = {
accounts: PropTypes.array
}
state = {
allEvents: [],
minedEvents: [],
pendingEvents: []
}
componentDidMount () {
this.setupFilters();
}
render () {
return (
<div className={ styles.events }>
<table className={ styles.list }>
<tbody>
{ this.renderEvents() }
</tbody>
</table>
</div>
);
}
renderEvents () {
const { allEvents } = this.state;
if (!allEvents.length) {
return null;
}
return allEvents
.map((event) => {
switch (event.type) {
case 'Buyin':
return <EventBuyin key={ event.key } event={ event } />;
case 'NewTranch':
return <EventNewTranch key={ event.key } event={ event } />;
case 'Refund':
return <EventRefund key={ event.key } event={ event } />;
case 'Transfer':
return <EventTransfer key={ event.key } event={ event } />;
}
});
}
getChildContext () {
const { accounts } = this.props;
return {
accounts
};
}
setupFilters () {
const { contract } = this.context;
const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex);
const logToEvent = (log) => {
const key = api.util.sha3(JSON.stringify(log));
const { blockNumber, logIndex, transactionHash, transactionIndex, params, type } = log;
return {
type: log.event,
state: type,
blockNumber,
logIndex,
transactionHash,
transactionIndex,
params: Object.keys(params).reduce((data, name) => {
data[name] = params[name].value;
return data;
}, {}),
key
};
};
const options = {
fromBlock: 0,
toBlock: 'pending',
limit: 50
};
contract.subscribe(null, options, (error, _logs) => {
if (error) {
console.error('setupFilters', error);
return;
}
if (!_logs.length) {
return;
}
const logs = _logs.map(logToEvent);
const minedEvents = logs
.filter((log) => log.state === 'mined')
.reverse()
.concat(this.state.minedEvents)
.sort(sortEvents);
const pendingEvents = logs
.filter((log) => log.state === 'pending')
.reverse()
.concat(this.state.pendingEvents.filter((event) => {
return !logs.find((log) => {
const isMined = (log.state === 'mined') && (log.transactionHash === event.transactionHash);
const isPending = (log.state === 'pending') && (log.key === event.key);
return isMined || isPending;
});
}))
.sort(sortEvents);
const allEvents = pendingEvents.concat(minedEvents);
this.setState({
allEvents,
minedEvents,
pendingEvents
});
});
}
}