"use client"; import { RecurrenceFrequency } from "@capakraken/shared"; import type { RecurrencePattern } from "@capakraken/shared"; import { InfoTooltip } from "~/components/ui/InfoTooltip.js"; const WEEKDAY_LABELS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; interface RecurrenceEditorProps { value: RecurrencePattern | undefined; onChange: (pattern: RecurrencePattern | undefined) => void; } export function RecurrenceEditor({ value, onChange }: RecurrenceEditorProps) { const freq = value?.frequency ?? RecurrenceFrequency.WEEKLY; function update(patch: Partial) { onChange({ ...value, frequency: freq, ...patch }); } function setFrequency(f: RecurrenceFrequency) { // Reset pattern-specific fields when switching frequency onChange({ frequency: f }); } function toggleWeekday(dow: number) { const current = value?.weekdays ?? []; const next = current.includes(dow) ? current.filter((d) => d !== dow) : [...current, dow].sort((a, b) => a - b); update({ weekdays: next }); } const inputClass = "px-2 py-1 border border-gray-300 dark:border-gray-600 rounded text-sm focus:outline-none focus:ring-2 focus:ring-brand-500 dark:bg-gray-900 dark:text-gray-100"; const labelClass = "text-xs font-medium text-gray-600 dark:text-gray-400 block mb-1"; return (
{/* Frequency selector */}
Frequency
{Object.values(RecurrenceFrequency).map((f) => ( ))}
{/* Weekday picker — WEEKLY and BIWEEKLY */} {(freq === RecurrenceFrequency.WEEKLY || freq === RecurrenceFrequency.BIWEEKLY) && (
Days of week
{WEEKDAY_LABELS.map((label, dow) => { const selected = (value?.weekdays ?? []).includes(dow); return ( ); })}
)} {/* Biweekly interval */} {freq === RecurrenceFrequency.BIWEEKLY && (
update({ interval: Number(e.target.value) })} className={`${inputClass} w-24`} />
)} {/* Monthly — day of month */} {freq === RecurrenceFrequency.MONTHLY && (
update({ monthDay: Number(e.target.value) })} className={`${inputClass} w-24`} />
)} {/* Custom — hoursPerDay override */} {freq === RecurrenceFrequency.CUSTOM && (
update({ hoursPerDay: Number(e.target.value) })} className={`${inputClass} w-24`} />
)} {/* Optional hours override for WEEKLY/BIWEEKLY/MONTHLY */} {freq !== RecurrenceFrequency.CUSTOM && (
{ const next = { ...value, frequency: freq } as RecurrencePattern; if (e.target.value === "") { delete next.hoursPerDay; } else { next.hoursPerDay = Number(e.target.value); } onChange(next); }} className={`${inputClass} w-40`} />
)} {/* Optional date range overrides */}
{ const next = { ...value, frequency: freq } as RecurrencePattern; if (e.target.value) { next.startDate = e.target.value; } else { delete next.startDate; } onChange(next); }} className={inputClass} />
{ const next = { ...value, frequency: freq } as RecurrencePattern; if (e.target.value) { next.endDate = e.target.value; } else { delete next.endDate; } onChange(next); }} className={inputClass} />
); }