PluginListPage.tsx 2.6 KB

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