import React from 'react'; import { View, Text } from 'react-native'; import { useTheme } from '~/features/theme/ThemeProvider'; import colors from '~/tailwind.config.js'; import Icon from '~/components/atoms/Icon'; import { useTranslation } from 'react-i18next'; interface WeekData { weekNumber: number; year: number; startDate: Date; endDate: Date; memos: number; memories: number; duration: number; words: number; } interface WeekCardProps { weekData: WeekData; isLatest?: boolean; } /** * Beautiful card component for displaying individual week statistics */ const WeekCard: React.FC = ({ weekData, isLatest = false }) => { const { isDark, themeVariant } = useTheme(); const { t } = useTranslation(); 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; 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 formatDateRange = (start: Date, end: Date) => { const startStr = start.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', }); const endStr = end.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', }); return `${startStr} - ${endStr}`; }; const getProductivityLevel = () => { if (weekData.memos >= 10) return { level: t('statistics.very_high'), color: '#4CAF50', icon: 'trending-up' }; if (weekData.memos >= 5) return { level: t('statistics.high'), color: '#8BC34A', icon: 'trending-up' }; if (weekData.memos >= 3) return { level: t('statistics.medium'), color: '#FFC107', icon: 'remove' }; if (weekData.memos >= 1) return { level: t('statistics.low'), color: '#FF9800', icon: 'trending-down' }; return { level: t('statistics.none'), color: '#F44336', icon: 'trending-down' }; }; const productivity = getProductivityLevel(); return ( {/* Header */} {t('statistics.week_abbr')} {weekData.weekNumber} {isLatest && ( {t('statistics.current')} )} {formatDateRange(weekData.startDate, weekData.endDate)} • {weekData.year} {productivity.level} {/* Stats Grid */} {/* Memos */} {weekData.memos} {t('statistics.memos')} {/* Memories */} {weekData.memories} {t('statistics.memories')} {/* Duration */} {formatDuration(weekData.duration)} {t('statistics.recordings')} {/* Words */} {weekData.words.toLocaleString()} {t('statistics.words')} {/* Progress Bar */} {t('statistics.activity_level')} {weekData.memos} / 10 {t('statistics.memos')} ); }; export default WeekCard;