Skip to content

Instantly share code, notes, and snippets.

@markshust
Created August 5, 2016 06:29
Show Gist options
  • Select an option

  • Save markshust/c5d8d3b35d3ffd7f056cd723dfed346c to your computer and use it in GitHub Desktop.

Select an option

Save markshust/c5d8d3b35d3ffd7f056cd723dfed346c to your computer and use it in GitHub Desktop.
WIP: custom automagic composer for mobx + meteor
import React, { createElement, Component, PropTypes } from 'react';
import { observer } from 'mobx-react';
import { _ } from 'meteor/underscore';
class Container extends Component {
componentWillMount() {
const { onMount } = this.props;
if (typeof onMount === 'function') onMount();
}
componentWillUnmount() {
const { onUnmount } = this.props;
if (typeof onUnmount === 'function') onUnmount();
}
render() {
const { renderChild, renderProps } = this.props;
let { loadingComponent: result } = this.props;
if (renderProps.isReady) {
const cleanedProps = {};
Object.keys(renderProps).forEach(renderProp => {
if (renderProps[renderProp]
&& renderProps[renderProp].$mobx
&& renderProps[renderProp].$mobx.array
) {
cleanedProps[renderProp] = renderProps[renderProp] ? renderProps[renderProp].peek() : [];
} else {
cleanedProps[renderProp] = renderProps[renderProp];
}
});
const props = Object.assign(
{},
_.omit(this.props, 'renderChild', 'renderProps'),
cleanedProps,
);
result = createElement(renderChild, props);
}
return result;
}
}
Container.propTypes = {
loadingComponent: PropTypes.any,
onMount: PropTypes.func,
onUnmount: PropTypes.func,
renderChild: PropTypes.any.isRequired,
renderProps: PropTypes.object.isRequired,
};
Container.defaultProps = {
loadingComponent: <div>Loading...</div>,
};
const mobxComposer = observer(Container);
export { mobxComposer };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment