PluginListPage.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import PageHeader from 'app/core/components/PageHeader/PageHeader';
  5. import OrgActionBar from 'app/core/components/OrgActionBar/OrgActionBar';
  6. import PageLoader from 'app/core/components/PageLoader/PageLoader';
  7. import PluginList from './PluginList';
  8. import { NavModel, Plugin } from 'app/types';
  9. import { loadPlugins, setPluginsLayoutMode, setPluginsSearchQuery } from './state/actions';
  10. import { getNavModel } from '../../core/selectors/navModel';
  11. import { getLayoutMode, getPlugins, getPluginsSearchQuery } from './state/selectors';
  12. import { LayoutMode } from '../../core/components/LayoutSelector/LayoutSelector';
  13. export interface Props {
  14. navModel: NavModel;
  15. plugins: Plugin[];
  16. layoutMode: LayoutMode;
  17. searchQuery: string;
  18. hasFetched: boolean;
  19. loadPlugins: typeof loadPlugins;
  20. setPluginsLayoutMode: typeof setPluginsLayoutMode;
  21. setPluginsSearchQuery: typeof setPluginsSearchQuery;
  22. }
  23. export class PluginListPage extends PureComponent<Props> {
  24. componentDidMount() {
  25. this.fetchPlugins();
  26. }
  27. async fetchPlugins() {
  28. await this.props.loadPlugins();
  29. }
  30. render() {
  31. const {
  32. hasFetched,
  33. navModel,
  34. plugins,
  35. layoutMode,
  36. setPluginsLayoutMode,
  37. setPluginsSearchQuery,
  38. searchQuery,
  39. } = this.props;
  40. const linkButton = {
  41. href: 'https://grafana.com/plugins?utm_source=grafana_plugin_list',
  42. title: 'Find more plugins on Grafana.com',
  43. };
  44. return (
  45. <div>
  46. <PageHeader model={navModel} />
  47. <div className="page-container page-body">
  48. <OrgActionBar
  49. searchQuery={searchQuery}
  50. layoutMode={layoutMode}
  51. onSetLayoutMode={mode => setPluginsLayoutMode(mode)}
  52. setSearchQuery={query => setPluginsSearchQuery(query)}
  53. linkButton={linkButton}
  54. />
  55. {hasFetched ? (
  56. plugins && <PluginList plugins={plugins} layoutMode={layoutMode} />
  57. ) : (
  58. <PageLoader pageName="Plugins" />
  59. )}
  60. </div>
  61. </div>
  62. );
  63. }
  64. }
  65. function mapStateToProps(state) {
  66. return {
  67. navModel: getNavModel(state.navIndex, 'plugins'),
  68. plugins: getPlugins(state.plugins),
  69. layoutMode: getLayoutMode(state.plugins),
  70. searchQuery: getPluginsSearchQuery(state.plugins),
  71. hasFetched: state.plugins.hasFetched,
  72. };
  73. }
  74. const mapDispatchToProps = {
  75. loadPlugins,
  76. setPluginsLayoutMode,
  77. setPluginsSearchQuery,
  78. };
  79. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(PluginListPage));