123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- /* eslint-disable react/prop-types */
- import * as React from 'react';
- import createReactClass from 'create-react-class';
- import Reflux from 'reflux';
- import ProjectsStore from 'app/stores/projectsStore';
- import {Project} from 'app/types';
- import getDisplayName from 'app/utils/getDisplayName';
- type Props = {
- projects?: Project[];
- specificProjectSlugs?: string[];
- };
- type InjectedProjectsProps = {
- loadingProjects: boolean;
- } & Props;
- type State = {
- projects: Project[];
- loading: boolean;
- };
- /**
- * Higher order component that takes specificProjectSlugs and provides list of that projects from ProjectsStore
- */
- const withProjectsSpecified = <P extends InjectedProjectsProps>(
- WrappedComponent: React.ComponentType<P>
- ) =>
- createReactClass<Props & Omit<P, keyof InjectedProjectsProps>, State>({
- displayName: `withProjectsSpecified(${getDisplayName(WrappedComponent)})`,
- mixins: [Reflux.listenTo(ProjectsStore, 'onProjectUpdate') as any],
- getInitialState() {
- return ProjectsStore.getState(this.props.specificProjectSlugs);
- },
- onProjectUpdate() {
- this.setState(ProjectsStore.getState(this.props.specificProjectSlugs));
- },
- render() {
- return (
- <WrappedComponent
- {...(this.props as P)}
- projects={this.state.projects as Project[]}
- loadingProjects={this.state.loading}
- />
- );
- },
- });
- export default withProjectsSpecified;
|