withProjectsSpecified.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /* eslint-disable react/prop-types */
  2. import * as React from 'react';
  3. import createReactClass from 'create-react-class';
  4. import Reflux from 'reflux';
  5. import ProjectsStore from 'app/stores/projectsStore';
  6. import {Project} from 'app/types';
  7. import getDisplayName from 'app/utils/getDisplayName';
  8. type Props = {
  9. projects?: Project[];
  10. specificProjectSlugs?: string[];
  11. };
  12. type InjectedProjectsProps = {
  13. loadingProjects: boolean;
  14. } & Props;
  15. type State = {
  16. projects: Project[];
  17. loading: boolean;
  18. };
  19. /**
  20. * Higher order component that takes specificProjectSlugs and provides list of that projects from ProjectsStore
  21. */
  22. const withProjectsSpecified = <P extends InjectedProjectsProps>(
  23. WrappedComponent: React.ComponentType<P>
  24. ) =>
  25. createReactClass<Props & Omit<P, keyof InjectedProjectsProps>, State>({
  26. displayName: `withProjectsSpecified(${getDisplayName(WrappedComponent)})`,
  27. mixins: [Reflux.listenTo(ProjectsStore, 'onProjectUpdate') as any],
  28. getInitialState() {
  29. return ProjectsStore.getState(this.props.specificProjectSlugs);
  30. },
  31. onProjectUpdate() {
  32. this.setState(ProjectsStore.getState(this.props.specificProjectSlugs));
  33. },
  34. render() {
  35. return (
  36. <WrappedComponent
  37. {...(this.props as P)}
  38. projects={this.state.projects as Project[]}
  39. loadingProjects={this.state.loading}
  40. />
  41. );
  42. },
  43. });
  44. export default withProjectsSpecified;