import React, { PureComponent } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { StoreState } from 'app/types'; import { initPanelState } from '../../panel/state/actions'; import { setPanelInstanceState } from '../../panel/state/reducers'; import { DashboardModel, PanelModel } from '../state'; import { LazyLoader } from './LazyLoader'; import { PanelChromeAngular } from './PanelChromeAngular'; import { PanelStateWrapper } from './PanelStateWrapper'; export interface OwnProps { panel: PanelModel; stateKey: string; dashboard: DashboardModel; isEditing: boolean; isViewing: boolean; isDraggable?: boolean; width: number; height: number; lazy?: boolean; timezone?: string; hideMenu?: boolean; } const mapStateToProps = (state: StoreState, props: OwnProps) => { const panelState = state.panels[props.stateKey]; if (!panelState) { return { plugin: null }; } return { plugin: panelState.plugin, instanceState: panelState.instanceState, }; }; const mapDispatchToProps = { initPanelState, setPanelInstanceState, }; const connector = connect(mapStateToProps, mapDispatchToProps); export type Props = OwnProps & ConnectedProps; export class DashboardPanelUnconnected extends PureComponent { static defaultProps: Partial = { lazy: true, }; componentDidMount() { this.props.panel.isInView = !this.props.lazy; if (!this.props.lazy) { this.onPanelLoad(); } } onInstanceStateChange = (value: any) => { this.props.setPanelInstanceState({ key: this.props.stateKey, value }); }; onVisibilityChange = (v: boolean) => { this.props.panel.isInView = v; }; onPanelLoad = () => { if (!this.props.plugin) { this.props.initPanelState(this.props.panel); } }; renderPanel = ({ isInView }: { isInView: boolean }) => { const { dashboard, panel, isViewing, isEditing, width, height, plugin, timezone, hideMenu, isDraggable = true, } = this.props; if (!plugin) { return null; } if (plugin && plugin.angularPanelCtrl) { return ( ); } return ( ); }; render() { const { width, height, lazy } = this.props; return lazy ? ( {this.renderPanel} ) : ( this.renderPanel({ isInView: true }) ); } } export const DashboardPanel = connector(DashboardPanelUnconnected);