import * as React from 'react'; import classnames from 'classnames'; import omit from 'omit.js'; import { Store } from './createStore'; interface BodyRowProps { store: Store; className?: string; rowKey: string; prefixCls: string; } interface BodyRowState { selected: boolean; } export interface BodyRowClass extends React.ComponentClass {} export default function createBodyRow(Component: React.ReactType = 'tr') { class BodyRow extends React.Component { private store: Store; private unsubscribe: () => void; constructor(props: BodyRowProps) { super(props); this.store = props.store; const { selectedRowKeys } = this.store.getState(); this.state = { selected: selectedRowKeys.indexOf(props.rowKey) >= 0, }; } componentDidMount() { this.subscribe(); } componentWillUnmount() { if (this.unsubscribe) { this.unsubscribe(); } } subscribe() { const { store, rowKey } = this.props; this.unsubscribe = store.subscribe(() => { const { selectedRowKeys } = this.store.getState(); const selected = selectedRowKeys.indexOf(rowKey) >= 0; if (selected !== this.state.selected) { this.setState({ selected }); } }); } render() { const rowProps = omit(this.props, ['prefixCls', 'rowKey', 'store']); const className = classnames(this.props.className, { [`${this.props.prefixCls}-row-selected`]: this.state.selected, }); return React.createElement( Component, { ...rowProps, className, }, this.props.children, ); } } return BodyRow as BodyRowClass; }