mirror of
https://github.com/vale981/Vulcan
synced 2025-03-09 20:16:39 -04:00
46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
/*****************************************************************/
|
|
/* See https://github.com/studiointeract/tracker-component
|
|
/* This is essentially the same component made by studiointeract
|
|
/* but modified to work correctly with modern React.
|
|
/* Only change as of this writing is to remove setState() and let
|
|
/* super handle that.
|
|
/****************************************************************/
|
|
import React from 'react';
|
|
|
|
class TrackerComponent extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.__subs = {}, this.__comps = []; this.__live = false;
|
|
this.__subscribe = props && props.subscribe || Meteor.subscribe;
|
|
}
|
|
|
|
subscribe(name, ...options) {
|
|
return this.__subs[JSON.stringify(arguments)] =
|
|
this.__subscribe.apply(this, [name, ...options]);
|
|
}
|
|
|
|
autorun(fn) { return this.__comps.push(Tracker.autorun(c => {
|
|
this.__live = true; fn(c); this.__live = false;
|
|
}))}
|
|
|
|
componentDidUpdate() { !this.__live && this.__comps.forEach(c => {
|
|
c.invalidated = c.stopped = false; !c.invalidate();
|
|
})}
|
|
|
|
subscriptionsReady() {
|
|
return !Object.keys(this.__subs).some(id => !this.__subs[id].ready());
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
Object.keys(this.__subs).forEach(sub => this.__subs[sub].stop());
|
|
this.__comps.forEach(comp => comp.stop());
|
|
}
|
|
|
|
render() {
|
|
const { children } = this.props;
|
|
const comp = (children instanceof Array ? children : [children]).map(c => React.cloneElement(c, this.state));
|
|
return comp.length == 1 ? comp[0] : <div>{comp}</div>;
|
|
}
|
|
}
|
|
|
|
export default TrackerComponent;
|