diff --git a/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx b/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx index 01e06f0e7..b8efb2176 100644 --- a/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx +++ b/ts/components/conversation/right-panel/overlay/disappearing-messages/TimeOptions.tsx @@ -1,10 +1,14 @@ import { isEmpty } from 'lodash'; import { DisappearTimeOptionDataTestId } from 'react'; -import { TimerOptionsArray } from '../../../../../session/disappearing_messages/timerOptions'; +import { + TimerOptionsArray, + TimerSeconds, +} from '../../../../../session/disappearing_messages/timerOptions'; import { PanelButtonGroup, PanelLabel } from '../../../../buttons/PanelButton'; import { PanelRadioButton } from '../../../../buttons/PanelRadioButton'; import { Localizer } from '../../../../basic/Localizer'; +import { assertUnreachable } from '../../../../../types/sqlSharedTypes'; type TimerOptionsProps = { options: TimerOptionsArray | null; @@ -14,6 +18,56 @@ type TimerOptionsProps = { disabled?: boolean; }; +function toMinutes(seconds: Extract) { + const ret = Math.floor(seconds / 60); + if (ret !== 5 && ret !== 30) { + throw new Error('invalid toMinutes'); + } + return ret; +} + +function toHours(seconds: Extract) { + const ret = Math.floor(seconds / 3600); + if (ret !== 1 && ret !== 6 && ret !== 12) { + throw new Error('invalid toHours'); + } + return ret; +} + +function toDays(seconds: Extract) { + const ret = Math.floor(seconds / 86400); + if (ret !== 1 && ret !== 7 && ret !== 14) { + throw new Error('invalid toDays'); + } + return ret; +} + +function getDataTestIdFromTimerSeconds(seconds: TimerSeconds): DisappearTimeOptionDataTestId { + switch (seconds) { + case 0: + case 5: + case 10: + case 30: + case 60: + return `time-option-${seconds}-seconds`; + case 300: + case 1800: + return `time-option-${toMinutes(seconds)}-minutes`; + case 3600: + case 21600: + case 43200: + return `time-option-${toHours(seconds)}-hours`; + case 86400: + case 604800: + case 1209600: + return `time-option-${toDays(seconds)}-days`; + default: + assertUnreachable(seconds, 'getDataTestIdFromTimerSeconds: unhandled case'); + // tsc is a bit dumb sometimes and expects a return here + throw new Error('getDataTestIdFromTimerSeconds: unhandled case'); + } +} + export const TimeOptions = (props: TimerOptionsProps) => { const { options, selected, setSelected, hasOnlyOneMode, disabled } = props; @@ -30,8 +84,9 @@ export const TimeOptions = (props: TimerOptionsProps) => { )} {options.map(option => { - // we want "time-option-3600-seconds", etc as accessibility id - const parentDataTestId: DisappearTimeOptionDataTestId = `time-option-${option.value}-seconds`; + // we want "time-option-1-hours", etc as accessibility id + const parentDataTestId = getDataTestIdFromTimerSeconds(option.value); + return (