observe HOC
This commit is contained in:
parent
ff102b34b2
commit
d795abe5fd
|
@ -1,65 +1,56 @@
|
||||||
import React from 'react';
|
import React from "react";
|
||||||
import Phoenix from 'phoenix';
|
import Phoenix from "phoenix";
|
||||||
import { map, scan} from 'rxjs/operators';
|
import Web3 from "web3";
|
||||||
import Web3 from 'web3';
|
import EscrowObservator from "./EscrowObservator";
|
||||||
import withObservables from '@nozbe/with-observables'
|
|
||||||
|
|
||||||
const web3 = new Web3("ws://localhost:8545");
|
const web3 = new Web3("ws://localhost:8545");
|
||||||
|
|
||||||
const Escrow = ({escrow}) => {
|
|
||||||
console.log("Received new escrow property", escrow);
|
|
||||||
return <ul><li>{escrow.buyer} {escrow.seller} - <b>EscrowID:{escrow.escrowId}</b></li></ul>;
|
|
||||||
//return <ul>{props.escrows.map((el, i) => <li key={i}>{el.buyer} {el.seller} {el.escrowId}</li>)}</ul>
|
|
||||||
};
|
|
||||||
|
|
||||||
const enhance = withObservables(['escrow'], ({ escrow }) => ({ escrow }));
|
|
||||||
|
|
||||||
const EnhancedEscrow = enhance(Escrow)
|
|
||||||
|
|
||||||
class App extends React.Component {
|
class App extends React.Component {
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
escrow: null
|
escrowObservable: null
|
||||||
}
|
};
|
||||||
|
|
||||||
constructor(props){
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.EscrowContract = null;
|
this.EscrowContract = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount(){
|
componentDidMount() {
|
||||||
(async () => {
|
(async () => {
|
||||||
let accounts = await web3.eth.getAccounts();
|
let accounts = await web3.eth.getAccounts();
|
||||||
this.EscrowContract = await deployContract();
|
this.EscrowContract = await deployContract();
|
||||||
|
|
||||||
await this.EscrowContract.methods.createEscrow(1, accounts[0], accounts[1]).send({from: accounts[0]})
|
await this.EscrowContract.methods.createEscrow(1, accounts[0], accounts[1]).send({ from: accounts[0] });
|
||||||
await this.EscrowContract.methods.createEscrow(1, accounts[1], accounts[2]).send({from: accounts[0]})
|
await this.EscrowContract.methods.createEscrow(1, accounts[1], accounts[2]).send({ from: accounts[0] });
|
||||||
await this.EscrowContract.methods.createEscrow(1, accounts[1], accounts[0]).send({from: accounts[0]})
|
await this.EscrowContract.methods.createEscrow(1, accounts[1], accounts[0]).send({ from: accounts[0] });
|
||||||
await this.EscrowContract.methods.createEscrow(1, accounts[0], accounts[2]).send({from: accounts[0]})
|
await this.EscrowContract.methods.createEscrow(1, accounts[0], accounts[2]).send({ from: accounts[0] });
|
||||||
|
|
||||||
const eventSyncer = new Phoenix(web3.currentProvider);
|
const eventSyncer = new Phoenix(web3.currentProvider);
|
||||||
|
|
||||||
await eventSyncer.init();
|
await eventSyncer.init();
|
||||||
const replayObj = eventSyncer.trackEvent(this.EscrowContract, 'Created', {filter: {buyer: accounts[0]}, fromBlock: 1});
|
|
||||||
this.setState({
|
this.setState({
|
||||||
escrow: replayObj.asObservable()
|
escrowObservable: eventSyncer.trackEvent(this.EscrowContract, "Created", { filter: { buyer: accounts[0] }, fromBlock: 1 })
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
createTrx = async () => {
|
createTrx = async () => {
|
||||||
let accounts = await web3.eth.getAccounts();
|
let accounts = await web3.eth.getAccounts();
|
||||||
await this.EscrowContract.methods.createEscrow(Date.now(), accounts[0], accounts[1]).send({from: accounts[0]})
|
await this.EscrowContract.methods
|
||||||
|
.createEscrow(Date.now(), accounts[0], accounts[1])
|
||||||
|
.send({ from: accounts[0] });
|
||||||
|
};
|
||||||
|
|
||||||
}
|
render() {
|
||||||
|
const {escrowObservable} = this.state;
|
||||||
|
|
||||||
render(){
|
return (
|
||||||
if(!this.state.escrow) return null;
|
<div>
|
||||||
|
|
||||||
return <div>
|
|
||||||
<button onClick={this.createTrx}>Create Trx</button>
|
<button onClick={this.createTrx}>Create Trx</button>
|
||||||
{this.state.escrow && <EnhancedEscrow escrow={this.state.escrow} /> }
|
{escrowObservable && <EscrowObservator escrow={escrowObservable} myCustomProperty="Test" />}
|
||||||
</div>;
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
import React from "react";
|
||||||
|
import observe from "./observe";
|
||||||
|
|
||||||
|
const Escrow = props => {
|
||||||
|
const { escrow, myCustomProperty } = props;
|
||||||
|
return (
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
{escrow.buyer} {escrow.seller} - <b>EscrowID:{escrow.escrowId}</b>{" "}
|
||||||
|
<small>{myCustomProperty}</small>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const EscrowObservator = observe(Escrow);
|
||||||
|
|
||||||
|
export default EscrowObservator;
|
|
@ -0,0 +1,51 @@
|
||||||
|
import React, {Component} from 'react';
|
||||||
|
import { isObservable } from "rxjs";
|
||||||
|
|
||||||
|
function observe(WrappedComponent) {
|
||||||
|
return class extends Component {
|
||||||
|
state = {
|
||||||
|
observedValues: {},
|
||||||
|
subscriptions: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
Object.keys(this.props).forEach(prop => {
|
||||||
|
if(isObservable(this.props[prop])){
|
||||||
|
const subscription = this.props[prop].subscribe(
|
||||||
|
value => {
|
||||||
|
this.setState({
|
||||||
|
observedValues: {
|
||||||
|
...this.state.observedValues,
|
||||||
|
[prop]: value
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
err => {
|
||||||
|
// TODO: pass the error to the wrapped component
|
||||||
|
console.err(err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
subscriptions: {
|
||||||
|
...this.state.subscriptions,
|
||||||
|
[prop]: subscription
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.state.subscriptions.forEach(subscription => {
|
||||||
|
subscription.unsubscribe();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return <WrappedComponent {...this.props} {...this.state.observedValues} />;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default observe;
|
Loading…
Reference in New Issue