import React, { useEffect, useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { RecurrenceType } from '../../entities/Task'; import { getFirstDayOfWeek } from '../../utils/profileService'; interface RecurrenceDisplayProps { recurrenceType: RecurrenceType; recurrenceInterval?: number; recurrenceWeekdays?: number[]; recurrenceEndDate?: string; recurrenceMonthDay?: number; recurrenceWeekOfMonth?: number; recurrenceWeekday?: number; completionBased?: boolean; compact?: boolean; } const RecurrenceDisplay: React.FC = ({ recurrenceType, recurrenceInterval = 1, recurrenceWeekdays, recurrenceEndDate, recurrenceMonthDay, // recurrenceWeekOfMonth and recurrenceWeekday kept for future use completionBased = false, compact = false, }) => { const { t } = useTranslation(); const [firstDayOfWeek, setFirstDayOfWeek] = useState(null); useEffect(() => { const loadFirstDayOfWeek = async () => { try { const day = await getFirstDayOfWeek(); setFirstDayOfWeek(day); } catch (error) { console.error('Error loading first day of week:', error); setFirstDayOfWeek(1); // Default to Monday on error } }; loadFirstDayOfWeek(); }, []); const allWeekdays = useMemo( () => [ { value: 0, short: t('weekdays.sunday', 'Sun'), full: t('weekdaysFull.sunday', 'Sunday'), }, { value: 1, short: t('weekdays.monday', 'Mon'), full: t('weekdaysFull.monday', 'Monday'), }, { value: 2, short: t('weekdays.tuesday', 'Tue'), full: t('weekdaysFull.tuesday', 'Tuesday'), }, { value: 3, short: t('weekdays.wednesday', 'Wed'), full: t('weekdaysFull.wednesday', 'Wednesday'), }, { value: 4, short: t('weekdays.thursday', 'Thu'), full: t('weekdaysFull.thursday', 'Thursday'), }, { value: 5, short: t('weekdays.friday', 'Fri'), full: t('weekdaysFull.friday', 'Friday'), }, { value: 6, short: t('weekdays.saturday', 'Sat'), full: t('weekdaysFull.saturday', 'Saturday'), }, ], [t] ); const orderedWeekdays = useMemo(() => { if (firstDayOfWeek === null) return allWeekdays; return [ ...allWeekdays.slice(firstDayOfWeek), ...allWeekdays.slice(0, firstDayOfWeek), ]; }, [allWeekdays, firstDayOfWeek]); const formatRecurrenceText = () => { switch (recurrenceType) { case 'daily': return recurrenceInterval > 1 ? t( 'recurrence.everyNDays', `Every ${recurrenceInterval} days`, { count: recurrenceInterval } ) : t('recurrence.daily', 'Daily'); case 'weekly': return recurrenceInterval > 1 ? t( 'recurrence.everyNWeeks', `Every ${recurrenceInterval} weeks`, { count: recurrenceInterval } ) : t('recurrence.weekly', 'Weekly'); case 'monthly': return recurrenceInterval > 1 ? t( 'recurrence.everyNMonths', `Every ${recurrenceInterval} months`, { count: recurrenceInterval } ) : t('recurrence.monthly', 'Monthly'); case 'monthly_weekday': return t('recurrence.monthlyWeekday', 'Monthly on weekday'); case 'monthly_last_day': return t('recurrence.monthlyLastDay', 'Monthly on last day'); default: return t('recurrence.recurring', 'Recurring'); } }; const formatEndDate = (dateString: string) => { try { const date = new Date(dateString); return date.toLocaleDateString(); } catch { return dateString; } }; if (recurrenceType === 'none' || !recurrenceType) { return null; } return (
{/* Main recurrence info */}
{formatRecurrenceText()} {completionBased && ( {t('recurrence.completionBased', 'After completion')} )}
{/* Weekday display for weekly recurrence */} {recurrenceType === 'weekly' && recurrenceWeekdays && recurrenceWeekdays.length > 0 && (
{t('forms.task.labels.repeatOn', 'Repeat on')}:
{orderedWeekdays.map((weekday) => { const isSelected = recurrenceWeekdays.includes( weekday.value ); return (
{weekday.short}
); })}
)} {/* Month day display for monthly recurrence */} {recurrenceType === 'monthly' && recurrenceMonthDay && (
{t('recurrence.onDay', 'On day')} {recurrenceMonthDay}
)} {/* End date display */} {recurrenceEndDate && (
{t('recurrence.until', 'Until')}{' '} {formatEndDate(recurrenceEndDate)}
)}
); }; export default RecurrenceDisplay;