import type { TEnvelopeReminderDurationPeriod, TEnvelopeReminderPeriod, TEnvelopeReminderSettings, } from '@documenso/lib/constants/envelope-reminder'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@documenso/ui/primitives/select'; import { Plural, Trans } from '@lingui/react/macro'; type ReminderMode = 'enabled' | 'disabled' | 'inherit'; const getMode = (value: TEnvelopeReminderSettings | null | undefined): ReminderMode => { if (value === null || value === undefined) { return 'inherit'; } if ('disabled' in value.sendAfter) { return 'disabled'; } return 'enabled'; }; const getPeriodAmount = (period: TEnvelopeReminderPeriod | undefined): number => { if (period && 'amount' in period) { return period.amount; } return 1; }; const getPeriodUnit = (period: TEnvelopeReminderPeriod | undefined): TEnvelopeReminderDurationPeriod['unit'] => { if (period && 'unit' in period) { return period.unit; } return 'day'; }; export type ReminderSettingsPickerProps = { value: TEnvelopeReminderSettings | null | undefined; onChange: (value: TEnvelopeReminderSettings | null) => void; disabled?: boolean; inheritLabel?: string; }; export const ReminderSettingsPicker = ({ value, onChange, disabled = false, inheritLabel, }: ReminderSettingsPickerProps) => { const mode = getMode(value); const sendAfterAmount = getPeriodAmount(value?.sendAfter); const sendAfterUnit = getPeriodUnit(value?.sendAfter); const repeatEveryAmount = getPeriodAmount(value?.repeatEvery); const repeatEveryUnit = getPeriodUnit(value?.repeatEvery); const onModeChange = (newMode: string) => { if (newMode === 'inherit') { onChange(null); return; } if (newMode === 'disabled') { onChange({ sendAfter: { disabled: true }, repeatEvery: { disabled: true }, }); return; } onChange({ sendAfter: { unit: sendAfterUnit, amount: sendAfterAmount }, repeatEvery: { unit: repeatEveryUnit, amount: repeatEveryAmount }, }); }; const updateSendAfter = (updates: Partial<{ amount: number; unit: TEnvelopeReminderDurationPeriod['unit'] }>) => { const newAmount = Math.max(1, Math.floor(updates.amount ?? sendAfterAmount)); const newUnit = updates.unit ?? sendAfterUnit; onChange({ sendAfter: { unit: newUnit, amount: newAmount }, repeatEvery: value?.repeatEvery ?? { unit: repeatEveryUnit, amount: repeatEveryAmount }, }); }; const updateRepeatEvery = (updates: Partial<{ amount: number; unit: TEnvelopeReminderDurationPeriod['unit'] }>) => { const newAmount = Math.max(1, Math.floor(updates.amount ?? repeatEveryAmount)); const newUnit = updates.unit ?? repeatEveryUnit; onChange({ sendAfter: value?.sendAfter ?? { unit: sendAfterUnit, amount: sendAfterAmount }, repeatEvery: { unit: newUnit, amount: newAmount }, }); }; const onRepeatModeChange = (newMode: string) => { if (newMode === 'disabled') { onChange({ sendAfter: value?.sendAfter ?? { unit: sendAfterUnit, amount: sendAfterAmount }, repeatEvery: { disabled: true }, }); return; } onChange({ sendAfter: value?.sendAfter ?? { unit: sendAfterUnit, amount: sendAfterAmount }, repeatEvery: { unit: repeatEveryUnit, amount: repeatEveryAmount }, }); }; const repeatMode = value?.repeatEvery && 'disabled' in value.repeatEvery ? 'disabled' : 'enabled'; return (
{mode === 'enabled' && (
updateSendAfter({ amount: Number(e.target.value) })} disabled={disabled} data-testid="reminder-send-after-amount" /> updateSendAfter({ unit: unit as TEnvelopeReminderDurationPeriod['unit'], }) } disabled={disabled} testId="reminder-send-after-unit" />
{repeatMode === 'enabled' && (
updateRepeatEvery({ amount: Number(e.target.value) })} disabled={disabled} data-testid="reminder-repeat-amount" /> updateRepeatEvery({ unit: unit as TEnvelopeReminderDurationPeriod['unit'], }) } disabled={disabled} testId="reminder-repeat-unit" />
)}
)}
); }; const UnitSelect = ({ value, amount, onChange, disabled, testId, }: { value: string; amount: number; onChange: (value: string) => void; disabled: boolean; testId: string; }) => ( );