import React, { Fragment, useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { Button, ButtonGroup, Col, Row } from 'reactstrap'; import ECharts from '../../../../../common/charts/ECharts'; import ChartWrapper from '../ChartWrapper'; import { getBarOptions, getPieOptions } from '../../../../../common/charts/ChartsOptions'; import { IoIosAdd, IoIosRefresh, IoIosCheckmark } from 'react-icons/io'; import reduxConnect from '../../../../../../redux/utils/connect'; import translate from 'react-i18next/dist/commonjs/translate'; import { compose } from 'redux'; import { getOverviewBarAPI, getOverviewPieAPI } from '../../../../../../api/analytics/createAnalytics'; import useIsMounted from '../../../../../common/hooks/useIsMounted'; const initialBar = { data: [], error: undefined, loading: true, vertical: false }; const initialPie = { data: [], error: undefined, loading: true }; function ResultsTab(props) { const { actions, analyze, feedData, id, t } = props; const isMounted = useIsMounted(); const [barData, setBarData] = useState(initialBar); const [barTimeData, setBarTimeData] = useState(initialBar); const [pieData, setPieData] = useState(initialPie); const [pieTimeData, setPieTimeData] = useState(initialPie); const [filter, setFilter] = useState(filtersNames[0].id); useEffect(() => { if (!id) { return; } if (filter === filtersNames[0].id) { getBarChart(); getPieChart(); } else { getBarChartFeeds(); getPieChartFeeds(); } }, [filter]); useEffect(() => { if (barData.data) { setBarData((prev) => ({ ...prev, data: { ...prev.data, xAxis: prev.data.yAxis, yAxis: prev.data.xAxis } })); } }, [barData.vertical]); function updateResult(foo, id) { switch (id) { case cn.first: filter === filtersNames[0].id ? getBarChart() : getBarChartFeeds(); return; case cn.second: filter === filtersNames[0].id ? getPieChart() : getPieChartFeeds(); return; } } function getBarChart() { setBarData((prev) => ({ ...prev, loading: true })); getOverviewBarAPI(filter, id).then((res) => { if (!isMounted.current) { return false; } if (res.error || !res.data.data) { // on error setBarData((prev) => ({ ...prev, loading: false, error: res.errorMessage })); return; } const { data } = res.data; const labels = data[0] ? Object.keys(data[0].data) : []; const datasets = data.map((item) => ({ name: item.name, type: barData.vertical ? 'bar' : 'line', smooth: true, data: Object.values(item.data) })); const barOptions = getBarOptions(datasets, labels); setBarData({ data: barOptions, error: false, loading: false, vertical: false }); }); } function getBarChartFeeds() { setBarTimeData((prev) => ({ ...prev, loading: true })); getOverviewBarAPI(filter, id).then((res) => { if (!isMounted.current) { return false; } if (res.error || !res.data.data) { // on error setBarTimeData((prev) => ({ ...prev, loading: false, error: res.errorMessage })); return; } const { data } = res.data; const barOptions = {}; const errors = {}; data.map((feed) => { const { name, data } = feed; if (!data || (Array.isArray(data) && data.length < 1)) { errors[name] = t('analyzeTab.noData'); return; } const labels = Object.keys(data[0].data).sort(); const datasets = data.map((item) => ({ name: item.name, type: barTimeData.vertical ? 'bar' : 'line', smooth: true, data: labels.map((v) => item.data[v]) })); barOptions[name] = getBarOptions(datasets, labels); }); setBarTimeData({ data: barOptions, error: errors, loading: false, vertical: false }); }); } function getPieChart() { setPieData((prev) => ({ ...prev, loading: true })); getOverviewPieAPI(filter, id).then((res) => { if (!isMounted.current) { return false; } if (res.error || !res.data.data) { // alert on error setPieData((prev) => ({ ...prev, loading: false, error: res.errorMessage })); return; } const { data } = res.data; const pieOptions = getPieOptions( Object.entries(data).map((v) => ({ name: v[0], value: v[1] })) ); setPieData({ data: pieOptions, error: false, loading: false }); }); } function getPieChartFeeds() { setPieTimeData((prev) => ({ ...prev, loading: true })); getOverviewPieAPI(filter, id).then((res) => { if (!isMounted.current) { return false; } if (res.error || !res.data.data) { // alert on error setPieTimeData((prev) => ({ ...prev, loading: false, error: res.errorMessage })); return; } const { data } = res.data; const pieOptions = {}; const errors = {}; Object.entries(data).forEach((feed) => { const [name, value] = feed; if (!value || (Array.isArray(value) && value.length < 1)) { errors[name] = t('analyzeTab.noData'); } pieOptions[name] = getPieOptions( Object.entries(value).map((v) => ({ name: v[0], value: v[1] })) ); }); setPieTimeData({ data: pieOptions, error: errors, loading: false }); }); } function changeVertical() { setBarData((prev) => ({ ...prev, vertical: !prev.vertical })); } const hideChart1Alert = (id) => analyze.alertCharts.find((v) => v.name === cn.first && v.id === id); const hideChart2Alert = (id) => analyze.alertCharts.find((v) => v.name === cn.second && v.id === id); const barchartMenus = (id) => [ { title: '', // t('analyzeTab.chartMenus.addToAlert'), icon: IoIosAdd, size: 24, fn: () => actions.addAlertChart({ name: cn.first, id }), showInMore: false, hide: hideChart1Alert(id) }, { title: '', // t('analyzeTab.chartMenus.addedToAlerts'), icon: IoIosCheckmark, size: 24, showInMore: false, hide: !hideChart1Alert(id) }, { title: t('analyzeTab.chartMenus.refresh'), icon: IoIosRefresh, fn: () => updateResult(null, cn.first), showInMore: false }, /* { title: t('analyzeTab.chartMenus.addToDashboard'), fn: () => {}, showInMore: true }, */ { title: 'Toggle Horizontal/Vertical', fn: changeVertical, showInMore: true } ]; const piechartMenus = (id) => [ { title: '', // t('analyzeTab.chartMenus.addToAlert'), icon: IoIosAdd, size: 24, fn: () => actions.addAlertChart({ name: cn.second, id }), showInMore: false, hide: hideChart2Alert(id) }, { title: '', // t('analyzeTab.chartMenus.addedToAlerts'), icon: IoIosCheckmark, size: 24, showInMore: false, hide: !hideChart2Alert(id) }, { title: t('analyzeTab.chartMenus.refresh'), icon: IoIosRefresh, fn: () => updateResult(null, cn.second), showInMore: false } // { title: t('analyzeTab.chartMenus.addToDashboard'), fn: () => {}, showInMore: true } ]; return (
{filtersNames.map((item) => ( ))}
{filter === filtersNames[0].id ? ( // feeds in single graph ) : ( feedData.feeds.map((feed) => ( )) )}
); } const cn = { first: 'Mentions Over Time', second: 'Share of Mentions' }; const filtersNames = [ { name: 'None', transKey: 'none', id: 'none' }, { name: 'Media Types', transKey: 'mediaTypes', id: 'media' }, { name: 'Sentiments', transKey: 'sentiments', id: 'sentiment' }, // { name: 'Countries', transKey:'countries', id: 'country' }, { name: 'Languages', transKey: 'languages', id: 'language' } ]; ResultsTab.propTypes = { actions: PropTypes.object, id: PropTypes.string, t: PropTypes.func, feedData: PropTypes.object, analyze: PropTypes.object }; const applyDecorators = compose( reduxConnect('analyze', ['appState', 'analyze']), translate(['tabsContent'], { wait: true }) ); export default applyDecorators(React.memo(ResultsTab));