import React from 'react'; import { View, Text, Dimensions } from 'react-native'; import { useTheme } from '~/features/theme/ThemeProvider'; import colors from '~/tailwind.config.js'; import { useTranslation } from 'react-i18next'; interface WeekData { weekNumber: number; year: number; startDate: Date; endDate: Date; memos: number; memories: number; duration: number; words: number; } interface WeeklyChartProps { data: WeekData[]; } /** * Beautiful visual chart component for displaying weekly statistics */ const WeeklyChart: React.FC = ({ data }) => { const { isDark, themeVariant } = useTheme(); const { t } = useTranslation(); const screenWidth = Dimensions.get('window').width; const chartWidth = screenWidth - 80; // Account for padding const textColor = isDark ? '#FFFFFF' : '#000000'; const textSecondaryColor = isDark ? '#CCCCCC' : '#666666'; const contentBackgroundColor = isDark ? (colors as any).theme?.extend?.colors?.dark?.[themeVariant]?.contentBackground : (colors as any).theme?.extend?.colors?.[themeVariant]?.contentBackground; const borderColor = isDark ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'; const primaryColor = isDark ? (colors as any).theme?.extend?.colors?.dark?.[themeVariant]?.primary : (colors as any).theme?.extend?.colors?.[themeVariant]?.primary; if (data.length === 0) return null; // Find max values for scaling const maxMemos = Math.max(...data.map((w) => w.memos)); const maxMemories = Math.max(...data.map((w) => w.memories)); const maxWords = Math.max(...data.map((w) => w.words)); // Bar width calculation const barWidth = Math.max(20, (chartWidth - data.length * 8) / data.length); const formatDuration = (seconds: number): string => { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); if (hours > 0) { return `${hours}h ${minutes}m`; } else if (minutes > 0) { return `${minutes}m`; } else { return `${seconds}s`; } }; const formatWeekLabel = (week: WeekData) => { return `${t('statistics.week_abbr')}${week.weekNumber}`; }; return ( {/* Chart Title */} {t('statistics.memo_activity_recent_weeks', 'Memo-Aktivität der letzten Wochen')} {/* Bar Chart */} {data .slice() .reverse() .map((week, index) => { const memoHeight = maxMemos > 0 ? (week.memos / maxMemos) * 150 : 0; const memoryHeight = maxMemories > 0 ? (week.memories / maxMemories) * 150 : 0; return ( {/* Bars Container */} {/* Memo Bar */} {/* Memory Bar */} {/* Week Label */} {formatWeekLabel(week)} {/* Value Label */} {week.memos} ); })} {/* Legend */} {t('statistics.memos')} {t('statistics.memories')} {/* Summary Stats */} {data.reduce((sum, week) => sum + week.memos, 0)} {t('statistics.memos')} {data.reduce((sum, week) => sum + week.memories, 0)} {t('statistics.memories')} {formatDuration(data.reduce((sum, week) => sum + week.duration, 0))} {t('statistics.total', 'Gesamt')} ); }; export default WeeklyChart;