import * as React from 'react'; import * as PropTypes from 'prop-types' import { extendXComponentClass, genXComponentClass, CONTEXT_TYPE } from './xclass' import { streamOps, Stream, Subject } from './xs' import { Plan, Xcomponent, XcomponentClass, Engine, ContextEngine, XREACT_ENGINE } from './interfaces' export { XREACT_ENGINE } export function isXcomponentClass( ComponentClass: any): ComponentClass is XcomponentClass { return (ComponentClass).contextTypes == CONTEXT_TYPE; } export type XOrReactComponent = XcomponentClass | React.ComponentClass | React.SFC export function x(main: Plan, opts = {}): (WrappedComponent: React.ComponentType | XcomponentClass) => XcomponentClass { return function(WrappedComponent: React.ComponentType | XcomponentClass) { if (isXcomponentClass(WrappedComponent)) { return extendXComponentClass(WrappedComponent, main) } else { return genXComponentClass(WrappedComponent, main, opts) } }; } export class X extends React.PureComponent<{}, {}> { static childContextTypes = CONTEXT_TYPE getChildContext(): ContextEngine { return { [XREACT_ENGINE]: { intent$: streamOps.subject() as Subject, history$: streamOps.subject() as Subject } } } render() { return React.Children.only(this.props.children); } }