DefinitelyTyped/types/react-lifecycle-component/react-lifecycle-component-tests.tsx
Alexander Fisher 8a155514f4 Add types for react-lifecycle-component (#28635)
Please fill in this template.

- [x] Use a meaningful title for the pull request. Include the name of the package modified.
- [x] Test the change in your own code. (Compile and run.)
- [x] Add or edit tests to reflect the change. (Run with `npm test`.)
- [x] Follow the advice from the [readme](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.md#make-a-pull-request).
- [x] Avoid [common mistakes](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.md#common-mistakes).
- [x] Run `npm run lint package-name` (or `tsc` if no `tslint.json` is present).

Select one of these and delete the others:

If adding a new definition:
- [x] The package does not already provide its own types, or cannot have its `.d.ts` files generated via `--declaration`
- [x] If this is for an NPM package, match the name. If not, do not conflict with the name of an NPM package.
- [x] Create it with `dts-gen --dt`, not by basing it on an existing project.
- [x] `tslint.json` should be present, and `tsconfig.json` should have `noImplicitAny`, `noImplicitThis`, `strictNullChecks`, and `strictFunctionTypes` set to `true`.
2018-09-10 17:04:18 -07:00

99 lines
3.0 KiB
TypeScript

import * as React from 'react';
import { Dispatch } from 'redux';
import { connect } from 'react-redux';
import {
connectWithLifecycle,
LifecycleDispatchProps,
applyLifecycle,
LifecycleStateProps,
LifecycleComponent,
} from 'react-lifecycle-component';
interface State {
stateFoo: number;
}
interface Props extends StateProps, DispatchProps {
}
interface StateProps {
propsFoo: number;
}
interface DispatchProps {
bar(): void;
}
class ComponentFoo extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
stateFoo: 0,
};
}
render() {
return (
<div>
<div>Props Foo: {this.props.propsFoo}</div>
<div>State Foo: {this.state.stateFoo}</div>
<button onClick={this.props.bar}>Bar</button>
</div>
);
}
}
type MapStateProps = StateProps & LifecycleStateProps<Props>;
function mapStateToProps(): MapStateProps {
return {
component: ComponentFoo,
propsFoo: 8675309,
};
}
type MapDispatchProps = DispatchProps & LifecycleDispatchProps<Props, State>;
function mapDispatchToProps(dispatch: Dispatch): MapDispatchProps {
return {
bar() {
dispatch({ type: 'Bar'});
},
componentWillMount() {
dispatch({ type: 'ComponentWillMount'});
},
componentDidMount() {
dispatch({ type: 'ComponentDidMount'});
},
componentWillUpdate(nextProps, nextState, nextContext) {
const fooIsEqual: boolean = nextProps.propsFoo === nextState.stateFoo;
const hasNextContext: boolean = !!nextContext;
dispatch({ type: 'ComponentWillUpdate'});
},
componentDidUpdate(nextProps, nextState, nextContext) {
const fooIsEqual: boolean = nextProps.propsFoo === nextState.stateFoo;
const hasNextContext: boolean = !!nextContext;
dispatch({ type: 'ComponentDidUpdate'});
},
componentWillReceiveProps(nextProps, nextContext) {
const fooIsGreaterThanZero: boolean = nextProps.propsFoo > 0;
const hasNextContext: boolean = !!nextContext;
dispatch({ type: 'ComponentWillReceiveProps'});
},
componentWillUnmount() {
dispatch({ type: 'ComponentWillUnmount'});
},
shouldComponentUpdate(nextProps, nextState, nextContext) {
const fooIsEqual: boolean = nextProps.propsFoo === nextState.stateFoo;
const hasNextContext: boolean = !!nextContext;
return !fooIsEqual;
},
};
}
const connectWithLifecylceContainer =
connectWithLifecycle<StateProps, MapDispatchProps>(mapStateToProps, mapDispatchToProps)(ComponentFoo);
const applyLifecycleContainer =
connect<StateProps, MapDispatchProps>(mapStateToProps, mapDispatchToProps)(applyLifecycle(ComponentFoo));
const lifecycleContainer =
connect<MapStateProps, MapDispatchProps>(mapStateToProps, mapDispatchToProps)(LifecycleComponent);