From 77b551d004051047221c3537fd1e99be42e8c2a8 Mon Sep 17 00:00:00 2001 From: Gimle Larpes Date: Fri, 25 Jul 2025 01:05:53 +0200 Subject: [PATCH] add support for 24hr time to TimePicker --- src/app/components/time-date/TimePicker.tsx | 117 +++++++++++------- .../features/room/jump-to-time/JumpToTime.tsx | 6 +- src/app/utils/time.ts | 3 +- 3 files changed, 76 insertions(+), 50 deletions(-) diff --git a/src/app/components/time-date/TimePicker.tsx b/src/app/components/time-date/TimePicker.tsx index 1dd0958b..c835ed09 100644 --- a/src/app/components/time-date/TimePicker.tsx +++ b/src/app/components/time-date/TimePicker.tsx @@ -4,6 +4,8 @@ import dayjs from 'dayjs'; import * as css from './styles.css'; import { PickerColumn } from './PickerColumn'; import { hour12to24, hour24to12, hoursToMs, inSameDay, minutesToMs } from '../../utils/time'; +import { useSetting } from '../../state/hooks/settings'; +import { settingsAtom } from '../../state/settings'; type TimePickerProps = { min: number; @@ -13,9 +15,11 @@ type TimePickerProps = { }; export const TimePicker = forwardRef( ({ min, max, value, onChange }, ref) => { + const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock'); + const hour24 = dayjs(value).hour(); - const selectedHour = hour24to12(hour24); + const selectedHour = hour24Clock ? hour24 : hour24to12(hour24); const selectedMinute = dayjs(value).minute(); const selectedPM = hour24 >= 12; @@ -24,7 +28,7 @@ export const TimePicker = forwardRef( }; const handleHour = (hour: number) => { - const seconds = hoursToMs(hour12to24(hour, selectedPM)); + const seconds = hoursToMs(hour24Clock ? hour : hour12to24(hour, selectedPM)); const lastSeconds = hoursToMs(hour24); const newValue = value + (seconds - lastSeconds); handleSubmit(newValue); @@ -59,28 +63,43 @@ export const TimePicker = forwardRef( - {Array.from(Array(12).keys()) - .map((i) => { - if (i === 0) return 12; - return i; - }) - .map((hour) => ( - handleHour(hour)} - disabled={ - (minDay && hour12to24(hour, selectedPM) < minHour24) || - (maxDay && hour12to24(hour, selectedPM) > maxHour24) - } - > - {hour < 10 ? `0${hour}` : hour} - - ))} + {hour24Clock + ? Array.from(Array(24).keys()).map((hour) => ( + handleHour(hour)} + disabled={(minDay && hour < minHour24) || (maxDay && hour > maxHour24)} + > + {hour < 10 ? `0${hour}` : hour} + + )) + : Array.from(Array(12).keys()) + .map((i) => { + if (i === 0) return 12; + return i; + }) + .map((hour) => ( + handleHour(hour)} + disabled={ + (minDay && hour12to24(hour, selectedPM) < minHour24) || + (maxDay && hour12to24(hour, selectedPM) > maxHour24) + } + > + {hour < 10 ? `0${hour}` : hour} + + ))} {Array.from(Array(60).keys()).map((minute) => ( @@ -101,30 +120,32 @@ export const TimePicker = forwardRef( ))} - - handlePeriod(false)} - disabled={minDay && minPM} - > - AM - - handlePeriod(true)} - disabled={maxDay && !maxPM} - > - PM - - + {!hour24Clock && ( + + handlePeriod(false)} + disabled={minDay && minPM} + > + AM + + handlePeriod(true)} + disabled={maxDay && !maxPM} + > + PM + + + )} ); diff --git a/src/app/features/room/jump-to-time/JumpToTime.tsx b/src/app/features/room/jump-to-time/JumpToTime.tsx index 8c4e2c0b..223c6cf6 100644 --- a/src/app/features/room/jump-to-time/JumpToTime.tsx +++ b/src/app/features/room/jump-to-time/JumpToTime.tsx @@ -29,6 +29,8 @@ import { useRoom } from '../../../hooks/useRoom'; import { StateEvent } from '../../../../types/matrix/room'; import { getToday, getYesterday, timeDayMonthYear, timeHourMinute } from '../../../utils/time'; import { DatePicker, TimePicker } from '../../../components/time-date'; +import { useSetting } from '../../../state/hooks/settings'; +import { settingsAtom } from '../../../state/settings'; type JumpToTimeProps = { onCancel: () => void; @@ -45,6 +47,8 @@ export function JumpToTime({ onCancel, onSubmit }: JumpToTimeProps) { const createTs = useMemo(() => createStateEvent?.getTs() ?? 0, [createStateEvent]); const [ts, setTs] = useState(() => Date.now()); + const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock'); + const [timePickerCords, setTimePickerCords] = useState(); const [datePickerCords, setDatePickerCords] = useState(); @@ -125,7 +129,7 @@ export function JumpToTime({ onCancel, onSubmit }: JumpToTimeProps) { after={} onClick={handleTimePicker} > - {timeHourMinute(ts)} + {timeHourMinute(ts, hour24Clock)} dayjs(ts).isToday(); export const yesterday = (ts: number): boolean => dayjs(ts).isYesterday(); -export const timeHour = (ts: number): string => dayjs(ts).format('hh'); +export const timeHour = (ts: number, hour24Clock: boolean): string => + dayjs(ts).format(hour24Clock ? 'HH' : 'hh'); export const timeMinute = (ts: number): string => dayjs(ts).format('mm'); export const timeAmPm = (ts: number): string => dayjs(ts).format('A'); export const timeDay = (ts: number): string => dayjs(ts).format('D');