import { ResponsivePie } from '@nivo/pie'; import { Box, Flex, Icon, Margins, Select, Skeleton, Table, Tile } from '@rocket.chat/fuselage'; import moment from 'moment'; import React, { useMemo, useState } from 'react'; import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; import { useEndpointData } from '../../../../../../client/hooks/useEndpointData'; import { LegendSymbol } from '../data/LegendSymbol'; import { Section } from '../Section'; import { ActionButton } from '../../../../../../client/components/basic/Buttons/ActionButton'; import { downloadCsvAs } from '../../../../../../client/lib/download'; export function MessagesPerChannelSection() { const t = useTranslation(); const periodOptions = useMemo(() => [ ['last 7 days', t('Last_7_days')], ['last 30 days', t('Last_30_days')], ['last 90 days', t('Last_90_days')], ], [t]); const [periodId, setPeriodId] = useState('last 7 days'); const period = useMemo(() => { switch (periodId) { case 'last 7 days': return { start: moment().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).subtract(7, 'days'), end: moment().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).subtract(1), }; case 'last 30 days': return { start: moment().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).subtract(30, 'days'), end: moment().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).subtract(1), }; case 'last 90 days': return { start: moment().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).subtract(90, 'days'), end: moment().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).subtract(1), }; } }, [periodId]); const handlePeriodChange = (periodId) => setPeriodId(periodId); const params = useMemo(() => ({ start: period.start.toISOString(), end: period.end.toISOString(), }), [period]); const pieData = useEndpointData('engagement-dashboard/messages/origin', params); const tableData = useEndpointData('engagement-dashboard/messages/top-five-popular-channels', params); const [pie, table] = useMemo(() => { if (!pieData || !tableData) { return []; } const pie = pieData.origins.reduce((obj, { messages, t }) => ({ ...obj, [t]: messages }), {}); const table = tableData.channels.reduce((entries, { t, messages, name, usernames }, i) => [...entries, { i, t, name: name || usernames.join(' × '), messages }], []); return [pie, table]; }, [period, pieData, tableData]); const downloadData = () => { const data = pieData.origins.map(({ t, messages }) => [t, messages]); downloadCsvAs(data, `MessagesPerChannelSection_start_${ params.start }_end_${ params.end }`); }; return