Merge pull request #44 from status-im/misc_improvements
tolerate single param as arg, add `map` functionality
This commit is contained in:
commit
d67bbd41b7
|
@ -18,17 +18,17 @@ class App extends React.Component {
|
||||||
};
|
};
|
||||||
|
|
||||||
async componentDidMount() {
|
async componentDidMount() {
|
||||||
const subspace = new Subspace(web3.currentProvider);
|
const subspace = new Subspace(web3.currentProvider);
|
||||||
await subspace.init();
|
await subspace.init();
|
||||||
|
|
||||||
Product = await ProductContract.getInstance();
|
Product = await ProductContract.getInstance();
|
||||||
const rating$ = subspace.trackEvent(Product, "Rating").pipe(map(x => parseInt(x.rating)));
|
const rating$ = subspace.trackEvent(Product, "Rating").map("rating").pipe(map(x => parseInt(x)));
|
||||||
|
|
||||||
window.Product = Product;
|
window.Product = Product;
|
||||||
window.web3 = web3;
|
window.web3 = web3;
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
title: subspace.trackProperty(Product, "products", [0]).pipe(map(x => x.title)),
|
title: subspace.trackProperty(Product, "products", 0).map('title'),
|
||||||
averageRating: rating$.pipe($average()),
|
averageRating: rating$.pipe($average()),
|
||||||
minRating: rating$.pipe($min()),
|
minRating: rating$.pipe($min()),
|
||||||
maxRating: rating$.pipe($max()),
|
maxRating: rating$.pipe($max()),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { ReplaySubject } from 'rxjs';
|
import { ReplaySubject } from 'rxjs';
|
||||||
import { distinctUntilChanged } from 'rxjs/operators';
|
import { distinctUntilChanged, map } from 'rxjs/operators';
|
||||||
import equal from 'fast-deep-equal';
|
import equal from 'fast-deep-equal';
|
||||||
import Database from './database.js';
|
import Database from './database.js';
|
||||||
import Events from 'events';
|
import Events from 'events';
|
||||||
|
@ -51,7 +51,24 @@ export default class Subspace {
|
||||||
|
|
||||||
// TODO: get contract abi/address instead
|
// TODO: get contract abi/address instead
|
||||||
trackEvent(contractInstance, eventName, filterConditionsOrCb) {
|
trackEvent(contractInstance, eventName, filterConditionsOrCb) {
|
||||||
return this.eventSyncer.track(contractInstance, eventName, filterConditionsOrCb, this.latestBlockNumber - this.options.refreshLastNBlocks);
|
let returnSub = this.eventSyncer.track(contractInstance, eventName, filterConditionsOrCb, this.latestBlockNumber - this.options.refreshLastNBlocks);
|
||||||
|
|
||||||
|
returnSub.map = (prop) => {
|
||||||
|
return returnSub.pipe(map((x) => {
|
||||||
|
if (typeof(prop) === "string") {
|
||||||
|
return x[prop];
|
||||||
|
}
|
||||||
|
if (Array.isArray(prop)) {
|
||||||
|
let newValues = {}
|
||||||
|
prop.forEach((p) => {
|
||||||
|
newValues[p] = x[p]
|
||||||
|
})
|
||||||
|
return newValues
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnSub;
|
||||||
}
|
}
|
||||||
|
|
||||||
clearDB(collection) {
|
clearDB(collection) {
|
||||||
|
@ -95,6 +112,10 @@ export default class Subspace {
|
||||||
trackProperty(contractInstance, propName, methodArgs = [], callArgs = {}) {
|
trackProperty(contractInstance, propName, methodArgs = [], callArgs = {}) {
|
||||||
const sub = new ReplaySubject();
|
const sub = new ReplaySubject();
|
||||||
|
|
||||||
|
if (!Array.isArray(methodArgs)) {
|
||||||
|
methodArgs = [methodArgs]
|
||||||
|
}
|
||||||
|
|
||||||
const method = contractInstance.methods[propName].apply(contractInstance.methods[propName], methodArgs)
|
const method = contractInstance.methods[propName].apply(contractInstance.methods[propName], methodArgs)
|
||||||
const callContractMethod = () => {
|
const callContractMethod = () => {
|
||||||
method.call.apply(method.call, [callArgs, (err, result) => {
|
method.call.apply(method.call, [callArgs, (err, result) => {
|
||||||
|
@ -110,7 +131,24 @@ export default class Subspace {
|
||||||
|
|
||||||
this.callables.push(callContractMethod);
|
this.callables.push(callContractMethod);
|
||||||
|
|
||||||
return sub.pipe(distinctUntilChanged((a, b) => equal(a, b)));
|
let returnSub = sub.pipe(distinctUntilChanged((a, b) => equal(a, b)));
|
||||||
|
|
||||||
|
returnSub.map = (prop) => {
|
||||||
|
return returnSub.pipe(map((x) => {
|
||||||
|
if (typeof(prop) === "string") {
|
||||||
|
return x[prop];
|
||||||
|
}
|
||||||
|
if (Array.isArray(prop)) {
|
||||||
|
let newValues = {}
|
||||||
|
prop.forEach((p) => {
|
||||||
|
newValues[p] = x[p]
|
||||||
|
})
|
||||||
|
return newValues
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnSub;
|
||||||
}
|
}
|
||||||
|
|
||||||
trackBalance(address, erc20Address) {
|
trackBalance(address, erc20Address) {
|
||||||
|
|
Loading…
Reference in New Issue