From c260af50238e3e6eada821d431bee4e54dd54029 Mon Sep 17 00:00:00 2001 From: Gimle Larpes Date: Sat, 31 May 2025 16:10:41 +0200 Subject: [PATCH] Add setting for date formatting --- src/app/atoms/time/Time.jsx | 5 +- src/app/features/settings/general/General.tsx | 145 +++++++++++++++++- src/app/hooks/useDateFormat.ts | 4 + src/app/state/settings.ts | 2 +- 4 files changed, 147 insertions(+), 9 deletions(-) diff --git a/src/app/atoms/time/Time.jsx b/src/app/atoms/time/Time.jsx index 96e7704b..3684fb36 100644 --- a/src/app/atoms/time/Time.jsx +++ b/src/app/atoms/time/Time.jsx @@ -21,7 +21,10 @@ function Time({ timestamp, fullTime, hour24Clock, dateFormatString }) { const timeFormat = hour24Clock ? 'HH:MM' : 'hh:MM TT'; - formattedDate = dateFormat(date, isToday || isYesterday ? timeFormat : dateFormatString); + formattedDate = dateFormat( + date, + isToday || isYesterday ? timeFormat : dateFormatString.toLowerCase() + ); if (isYesterday) { formattedDate = `Yesterday, ${formattedDate}`; } diff --git a/src/app/features/settings/general/General.tsx b/src/app/features/settings/general/General.tsx index e647920a..55464d7f 100644 --- a/src/app/features/settings/general/General.tsx +++ b/src/app/features/settings/general/General.tsx @@ -1,9 +1,12 @@ import React, { ChangeEventHandler, + FormEventHandler, KeyboardEventHandler, MouseEventHandler, + useEffect, useState, } from 'react'; +import dayjs from 'dayjs'; import { as, Box, @@ -342,10 +345,105 @@ function Appearance() { ); } -function SelectDateFormat() { - // ADD TEXT INPUT AND RELATED LOGIC-- ADD LIVE PREVIEW: e.g. [formatted current date] +type CustomDateFormatProps = { + dateFormatString: string; + setDateFormatString: (format: string) => void; +}; + +function CustomDateFormat({ dateFormatString, setDateFormatString }: CustomDateFormatProps) { + const [dateFormatCustom, setDateFormatCustom] = useState(dateFormatString); + + useEffect(() => { + setDateFormatCustom(dateFormatString); + }, [dateFormatString]); + + const handleChange: ChangeEventHandler = (evt) => { + const name = evt.currentTarget.value; + setDateFormatCustom(name); + }; + + const handleReset = () => { + setDateFormatCustom(dateFormatString); + }; + + const handleSubmit: FormEventHandler = (evt) => { + evt.preventDefault(); + + const target = evt.target as HTMLFormElement | undefined; + const customDateFormatInput = target?.customDateFormatInput as HTMLInputElement | undefined; + const format = customDateFormatInput?.value; + if (!format) return; + + setDateFormatString(format); + }; + + const hasChanges = dateFormatCustom !== dateFormatString; + return ( + + View formatting syntax on{' '} + + Day.js + + . + + } + > + + + + + + ) + } + /> + + + + + ); +} + +type PresetDateFormatProps = { + dateFormatPreset: string; + handlePresetChange: (format: string) => void; +}; + +function PresetDateFormat({ dateFormatPreset, handlePresetChange }: PresetDateFormatProps) { const [menuCords, setMenuCords] = useState(); - const [dateFormatString, setDateFormatString] = useSetting(settingsAtom, 'dateFormatString'); const dateFormatItems = useDateFormatItems(); const handleMenu: MouseEventHandler = (evt) => { @@ -353,7 +451,7 @@ function SelectDateFormat() { }; const handleSelect = (format: DateFormat) => { - setDateFormatString(format); + handlePresetChange(format); setMenuCords(undefined); }; @@ -369,7 +467,7 @@ function SelectDateFormat() { onClick={handleMenu} > - {dateFormatItems.find((i) => i.format === dateFormatString)?.name ?? dateFormatString} + {dateFormatItems.find((i) => i.format === dateFormatPreset)?.name ?? dateFormatPreset} handleSelect(item.format)} > @@ -412,6 +510,39 @@ function SelectDateFormat() { ); } +function SelectDateFormat() { + const [dateFormatString, setDateFormatString] = useSetting(settingsAtom, 'dateFormatString'); + const [dateFormatPreset, setDateFormatPreset] = useState(dateFormatString); + + const handlePresetChange = (format: string) => { + setDateFormatPreset(format); + if (format !== '') { + setDateFormatString(format); + } + }; + + return ( + <> + + } + /> + {dateFormatPreset === '' && ( + + )} + + ); +} + function DateAndTime() { const [hour24Clock, setHour24Clock] = useSetting(settingsAtom, 'hour24Clock'); @@ -426,7 +557,7 @@ function DateAndTime() { - } /> + ); diff --git a/src/app/hooks/useDateFormat.ts b/src/app/hooks/useDateFormat.ts index c4ef0cc4..520d4b0d 100644 --- a/src/app/hooks/useDateFormat.ts +++ b/src/app/hooks/useDateFormat.ts @@ -17,6 +17,10 @@ export const useDateFormatItems = (): DateFormatItem[] => format: 'DD/MM/YYYY', name: 'DD/MM/YYYY', }, + { + format: 'MM/DD/YYYY', + name: 'MM/DD/YYYY', + }, { format: 'YYYY/MM/DD', name: 'YYYY/MM/DD', diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index f296cd1a..15bf9a14 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -1,7 +1,7 @@ import { atom } from 'jotai'; const STORAGE_KEY = 'settings'; -export type DateFormat = 'D MMM YYYY' | 'DD/MM/YYYY' | 'YYYY/MM/DD' | ''; +export type DateFormat = 'D MMM YYYY' | 'DD/MM/YYYY' | 'MM/DD/YYYY' | 'YYYY/MM/DD' | ''; export type MessageSpacing = '0' | '100' | '200' | '300' | '400' | '500'; export enum MessageLayout { Modern = 0,