Skip to content

Commit a3e1856

Browse files
authored
fix: date hydration error if user locale is different to server (#6806)
Closes #6796 ## Type of change - [x] Bug fix (non-breaking change which fixes an issue)
1 parent 6612bd1 commit a3e1856

File tree

1 file changed

+18
-21
lines changed
  • packages/ui/src/elements/DocumentControls

1 file changed

+18
-21
lines changed

packages/ui/src/elements/DocumentControls/index.tsx

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { CollectionPermission, GlobalPermission } from 'payload/auth'
33
import type { SanitizedCollectionConfig } from 'payload/types'
44

55
import { getTranslation } from '@payloadcms/translations'
6-
import React, { Fragment } from 'react'
6+
import React, { Fragment, useEffect } from 'react'
77

88
import { useComponentMap } from '../../providers/ComponentMap/index.js'
99
import { useConfig } from '../../providers/Config/index.js'
@@ -64,6 +64,19 @@ export const DocumentControls: React.FC<{
6464
routes: { admin: adminRoute },
6565
} = config
6666

67+
// Settings these in state to avoid hydration issues if there is a mismatch between the server and client
68+
const [updatedAt, setUpdatedAt] = React.useState<string>('')
69+
const [createdAt, setCreatedAt] = React.useState<string>('')
70+
71+
useEffect(() => {
72+
if (data?.updatedAt) {
73+
setUpdatedAt(formatDate({ date: data.updatedAt, i18n, pattern: dateFormat }))
74+
}
75+
if (data?.createdAt) {
76+
setCreatedAt(formatDate({ date: data.createdAt, i18n, pattern: dateFormat }))
77+
}
78+
}, [data, i18n, dateFormat])
79+
6780
const hasCreatePermission =
6881
permissions && 'create' in permissions && permissions.create?.permission
6982

@@ -127,35 +140,19 @@ export const DocumentControls: React.FC<{
127140
className={[`${baseClass}__list-item`, `${baseClass}__value-wrap`]
128141
.filter(Boolean)
129142
.join(' ')}
130-
title={
131-
data?.updatedAt
132-
? formatDate({ date: data?.updatedAt, i18n, pattern: dateFormat })
133-
: ''
134-
}
143+
title={data?.updatedAt ? updatedAt : ''}
135144
>
136145
<p className={`${baseClass}__label`}>{i18n.t('general:lastModified')}:&nbsp;</p>
137-
{data?.updatedAt && (
138-
<p className={`${baseClass}__value`}>
139-
{formatDate({ date: data?.updatedAt, i18n, pattern: dateFormat })}
140-
</p>
141-
)}
146+
{data?.updatedAt && <p className={`${baseClass}__value`}>{updatedAt}</p>}
142147
</li>
143148
<li
144149
className={[`${baseClass}__list-item`, `${baseClass}__value-wrap`]
145150
.filter(Boolean)
146151
.join(' ')}
147-
title={
148-
data?.createdAt
149-
? formatDate({ date: data?.createdAt, i18n, pattern: dateFormat })
150-
: ''
151-
}
152+
title={data?.createdAt ? createdAt : ''}
152153
>
153154
<p className={`${baseClass}__label`}>{i18n.t('general:created')}:&nbsp;</p>
154-
{data?.createdAt && (
155-
<p className={`${baseClass}__value`}>
156-
{formatDate({ date: data?.createdAt, i18n, pattern: dateFormat })}
157-
</p>
158-
)}
155+
{data?.createdAt && <p className={`${baseClass}__value`}>{createdAt}</p>}
159156
</li>
160157
</Fragment>
161158
)}

0 commit comments

Comments
 (0)