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