Fixes https://github.com/twentyhq/twenty/issues/11566 + translates dates - Date display bug: We had an issue with date (not date time) display depending on the timezone the user had selected. The date is stored in the db as yyyy-mm-dd, eg. 2025-05-01 for **May 1st, 2025**. When returned this date is formatted in a UTC DateTime at midnight, so 2025-05-1 00:00:00. Then when displaying the date we were converting this date using the timeZone, so 2025-04-30 17:00:00, thus displaying **April 30th, 2025**. The fix chosen is that we should not take into account the timezone for date (not date time!) displays as we always want to show the same date. - Date translation: dates were not translated, not in their default display (_May 1st, 2025_) nor in their relative display (_about a month ago_). The lib we use for date formatting, date-fns, offers a translation option with pre-built `Locale`s from their lib. Unfortunately and surprisingly we cannot just use directly string locale codes (like `fr-FR`), cf [open issue on date-fns](https://github.com/date-fns/date-fns/issues/3660). A util was introduced to offset this by dynamically importing the right date-fns Locale based on the locale code.
27 lines
1.0 KiB
TypeScript
27 lines
1.0 KiB
TypeScript
import { FieldDateMetadataSettings } from '@/object-record/record-field/types/FieldMetadata';
|
|
import { UserContext } from '@/users/contexts/UserContext';
|
|
import { useContext } from 'react';
|
|
import { useRecoilValue } from 'recoil';
|
|
import { dateLocaleState } from '~/localization/states/dateLocaleState';
|
|
import { formatDateString } from '~/utils/string/formatDateString';
|
|
import { EllipsisDisplay } from './EllipsisDisplay';
|
|
|
|
type DateDisplayProps = {
|
|
value: string | null | undefined;
|
|
dateFieldSettings?: FieldDateMetadataSettings;
|
|
};
|
|
export const DateDisplay = ({ value, dateFieldSettings }: DateDisplayProps) => {
|
|
const { dateFormat } = useContext(UserContext);
|
|
const dateLocale = useRecoilValue(dateLocaleState);
|
|
|
|
const formattedDate = formatDateString({
|
|
value,
|
|
timeZone: 'UTC', // Needed because we have db-stored date (yyyy-mm-dd) is converted to UTC dateTime by TypeORM
|
|
dateFormat,
|
|
dateFieldSettings,
|
|
localeCatalog: dateLocale.localeCatalog,
|
|
});
|
|
|
|
return <EllipsisDisplay>{formattedDate}</EllipsisDisplay>;
|
|
};
|