import { Col, Dropdown, Icon, Menu, Row } from 'antd'; import React, { Component, Suspense } from 'react'; import { Dispatch } from 'redux'; import { GridContent } from '@ant-design/pro-layout'; import { RadioChangeEvent } from 'antd/es/radio'; import { RangePickerValue } from 'antd/es/date-picker/interface'; import { connect } from 'dva'; import PageLoading from './components/PageLoading'; import { getTimeDistance } from './utils/utils'; import { AnalysisData } from './data.d'; import styles from './style.less'; const IntroduceRow = React.lazy(() => import('./components/IntroduceRow')); const SalesCard = React.lazy(() => import('./components/SalesCard')); const TopSearch = React.lazy(() => import('./components/TopSearch')); const ProportionSales = React.lazy(() => import('./components/ProportionSales')); const OfflineData = React.lazy(() => import('./components/OfflineData')); interface DashboardAnalysisProps { dashboardAnalysis: AnalysisData; dispatch: Dispatch; loading: boolean; } interface DashboardAnalysisState { salesType: 'all' | 'online' | 'stores'; currentTabKey: string; rangePickerValue: RangePickerValue; } @connect( ({ dashboardAnalysis, loading, }: { dashboardAnalysis: any; loading: { effects: { [key: string]: boolean }; }; }) => ({ dashboardAnalysis, loading: loading.effects['dashboardAnalysis/fetch'], }), ) class Analysis extends Component { state: DashboardAnalysisState = { salesType: 'all', currentTabKey: '', rangePickerValue: getTimeDistance('year'), }; reqRef: number = 0; timeoutId: number = 0; componentDidMount() { const { dispatch } = this.props; this.reqRef = requestAnimationFrame(() => { dispatch({ type: 'dashboardAnalysis/fetch', }); }); } componentWillUnmount() { const { dispatch } = this.props; dispatch({ type: 'dashboardAnalysis/clear', }); cancelAnimationFrame(this.reqRef); clearTimeout(this.timeoutId); } handleChangeSalesType = (e: RadioChangeEvent) => { this.setState({ salesType: e.target.value, }); }; handleTabChange = (key: string) => { this.setState({ currentTabKey: key, }); }; handleRangePickerChange = (rangePickerValue: RangePickerValue) => { const { dispatch } = this.props; this.setState({ rangePickerValue, }); dispatch({ type: 'dashboardAnalysis/fetchSalesData', }); }; selectDate = (type: 'today' | 'week' | 'month' | 'year') => { const { dispatch } = this.props; this.setState({ rangePickerValue: getTimeDistance(type), }); dispatch({ type: 'dashboardAnalysis/fetchSalesData', }); }; isActive = (type: 'today' | 'week' | 'month' | 'year') => { const { rangePickerValue } = this.state; const value = getTimeDistance(type); if (!rangePickerValue[0] || !rangePickerValue[1]) { return ''; } if ( rangePickerValue[0].isSame(value[0], 'day') && rangePickerValue[1].isSame(value[1], 'day') ) { return styles.currentDate; } return ''; }; render() { const { rangePickerValue, salesType, currentTabKey } = this.state; const { dashboardAnalysis, loading } = this.props; const { visitData, visitData2, salesData, searchData, offlineData, offlineChartData, salesTypeData, salesTypeDataOnline, salesTypeDataOffline, } = dashboardAnalysis; let salesPieData; if (salesType === 'all') { salesPieData = salesTypeData; } else { salesPieData = salesType === 'online' ? salesTypeDataOnline : salesTypeDataOffline; } const menu = ( 操作一 操作二 ); const dropdownGroup = ( ); const activeKey = currentTabKey || (offlineData[0] && offlineData[0].name); return ( }> ); } } export default Analysis;