import { useContext } from 'react'; import classNames from 'classnames'; import { ReportContext } from '../Report'; import EmptyPlaceholder from 'components/common/EmptyPlaceholder'; import { useMessages } from 'hooks'; import { formatDate } from 'lib/date'; import styles from './RetentionTable.module.css'; export function RetentionTable() { const { formatMessage, labels } = useMessages(); const { report } = useContext(ReportContext); const { data } = report || {}; if (!data) { return ; } const days = [1, 2, 3, 4, 5, 6, 7, 14, 21, 28]; const rows = data.reduce((arr, row) => { const { date, visitors, day } = row; if (day === 0) { return arr.concat({ date, visitors, records: days .reduce((arr, day) => { arr[day] = data.find(x => x.date === date && x.day === day); return arr; }, []) .filter(n => n), }); } return arr; }, []); const totalDays = rows.length; return ( <>
{formatMessage(labels.date)}
{formatMessage(labels.visitors)}
{days.map(n => (
{formatMessage(labels.day)} {n}
))}
{rows.map(({ date, visitors, records }, rowIndex) => { return (
{formatDate(`${date} 00:00:00`, 'PP')}
{visitors}
{days.map(day => { if (totalDays - rowIndex < day) { return null; } const percentage = records[day]?.percentage; return (
{percentage ? `${percentage.toFixed(2)}%` : ''}
); })}
); })}
); } export default RetentionTable;