Skip to content

Commit 8422668

Browse files
JarrodMFleschclaudecursoragent
authored
chore: replace magic strings with centralized constants (#15475)
Replaces hardcoded preference key strings with centralized constants to prevent typos and improve maintainability. Creates PREFERENCE_KEYS object in packages/payload/src/preferences/keys.ts and updates all usages throughout the codebase. I have another PR that sets preferences and figured it would be nice if we had a centralized place for the pref constants. --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 5ba0055 commit 8422668

File tree

10 files changed

+43
-15
lines changed

10 files changed

+43
-15
lines changed

packages/next/src/elements/Nav/getNavPrefs.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { NavPreferences, PayloadRequest } from 'payload'
22

3+
import { PREFERENCE_KEYS } from 'payload/shared'
34
import { cache } from 'react'
45

56
export const getNavPrefs = cache(async (req: PayloadRequest): Promise<NavPreferences> => {
@@ -15,7 +16,7 @@ export const getNavPrefs = cache(async (req: PayloadRequest): Promise<NavPrefere
1516
and: [
1617
{
1718
key: {
18-
equals: 'nav',
19+
equals: PREFERENCE_KEYS.NAV,
1920
},
2021
},
2122
{

packages/next/src/views/BrowseByFolder/buildView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerCompo
1212
import { getFolderResultsComponentAndData, upsertPreferences } from '@payloadcms/ui/rsc'
1313
import { formatAdminURL } from '@payloadcms/ui/shared'
1414
import { redirect } from 'next/navigation.js'
15+
import { PREFERENCE_KEYS } from 'payload/shared'
1516
import React from 'react'
1617

1718
export type BuildFolderViewArgs = {
@@ -111,7 +112,7 @@ export const buildBrowseByFolderView = async (
111112
sort?: FolderSortKeys
112113
viewPreference?: 'grid' | 'list'
113114
}>({
114-
key: 'browse-by-folder',
115+
key: PREFERENCE_KEYS.BROWSE_BY_FOLDER,
115116
req: initPageResult.req,
116117
value: {
117118
sort: query?.sort as FolderSortKeys,

packages/next/src/views/Dashboard/Default/ModularDashboard/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type {
1111
} from 'payload'
1212

1313
import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'
14+
import { PREFERENCE_KEYS } from 'payload/shared'
1415
import React from 'react'
1516

1617
import type { DashboardViewServerProps } from '../index.js'
@@ -74,7 +75,7 @@ async function getItemsFromPreferences(
7475
user: TypedUser,
7576
): Promise<null | WidgetItem[]> {
7677
const savedPreferences = await getPreferences(
77-
'dashboard-layout',
78+
PREFERENCE_KEYS.DASHBOARD_LAYOUT,
7879
payload,
7980
user.id,
8081
user.collection,

packages/next/src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
usePreferences,
1010
useServerFunctions,
1111
} from '@payloadcms/ui'
12+
import { PREFERENCE_KEYS } from 'payload/shared'
1213
import React, { useCallback, useEffect, useState } from 'react'
1314

1415
import type { WidgetInstanceClient, WidgetItem } from './index.client.js'
@@ -206,7 +207,7 @@ function useSetLayoutPreference() {
206207
const { setPreference } = usePreferences()
207208
return useCallback(
208209
async (layout: null | WidgetItem[]) => {
209-
await setPreference('dashboard-layout', { layouts: layout }, false)
210+
await setPreference(PREFERENCE_KEYS.DASHBOARD_LAYOUT, { layouts: layout }, false)
210211
},
211212
[setPreference],
212213
)

packages/payload/src/exports/shared.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,15 @@ export type {
6161

6262
export { buildFolderWhereConstraints } from '../folders/utils/buildFolderWhereConstraints.js'
6363
export { formatFolderOrDocumentItem } from '../folders/utils/formatFolderOrDocumentItem.js'
64+
export { PREFERENCE_KEYS } from '../preferences/keys.js'
65+
6466
export { validOperators, validOperatorSet } from '../types/constants.js'
6567

6668
export { formatFilesize } from '../uploads/formatFilesize.js'
67-
6869
export { isImage } from '../uploads/isImage.js'
6970
export { appendUploadSelectFields } from '../utilities/appendUploadSelectFields.js'
7071
export { applyLocaleFiltering } from '../utilities/applyLocaleFiltering.js'
72+
7173
export { combineWhereConstraints } from '../utilities/combineWhereConstraints.js'
7274

7375
export {
@@ -76,25 +78,25 @@ export {
7678
deepCopyObjectSimple,
7779
deepCopyObjectSimpleWithoutReactComponents,
7880
} from '../utilities/deepCopyObject.js'
79-
8081
export {
8182
deepMerge,
8283
deepMergeWithCombinedArrays,
8384
deepMergeWithReactComponents,
8485
deepMergeWithSourceArrays,
8586
} from '../utilities/deepMerge.js'
87+
8688
export { extractID } from '../utilities/extractID.js'
8789

8890
export { flattenAllFields } from '../utilities/flattenAllFields.js'
89-
9091
export { flattenTopLevelFields } from '../utilities/flattenTopLevelFields.js'
9192
export { formatAdminURL } from '../utilities/formatAdminURL.js'
9293
export { formatLabels, toWords } from '../utilities/formatLabels.js'
93-
export { getBestFitFromSizes } from '../utilities/getBestFitFromSizes.js'
9494

95+
export { getBestFitFromSizes } from '../utilities/getBestFitFromSizes.js'
9596
export { getDataByPath } from '../utilities/getDataByPath.js'
9697
export { getFieldPermissions } from '../utilities/getFieldPermissions.js'
9798
export { getObjectDotNotation } from '../utilities/getObjectDotNotation.js'
99+
98100
export { getSafeRedirect } from '../utilities/getSafeRedirect.js'
99101

100102
export { getSelectMode } from '../utilities/getSelectMode.js'
@@ -146,7 +148,6 @@ export {
146148
} from '../utilities/transformColumnPreferences.js'
147149

148150
export { transformWhereQuery } from '../utilities/transformWhereQuery.js'
149-
150151
export { unflatten } from '../utilities/unflatten.js'
151152
export { validateMimeType } from '../utilities/validateMimeType.js'
152153
export { validateWhereQuery } from '../utilities/validateWhereQuery.js'
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* Centralized preference keys used throughout Payload admin UI.
3+
* Import these constants instead of using string literals to prevent typos.
4+
*/
5+
6+
export const PREFERENCE_KEYS = {
7+
/**
8+
* Stores browse by folder view state
9+
*/
10+
BROWSE_BY_FOLDER: 'browse-by-folder',
11+
12+
/**
13+
* Stores dashboard layout configuration
14+
*/
15+
DASHBOARD_LAYOUT: 'dashboard-layout',
16+
17+
/**
18+
* Stores navigation group collapse/expand state and nav open/closed state
19+
*/
20+
NAV: 'nav',
21+
} as const

packages/ui/src/elements/Nav/NavToggler/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use client'
22
import { useWindowInfo } from '@faceless-ui/window-info'
3+
import { PREFERENCE_KEYS } from 'payload/shared'
34
import React from 'react'
45

56
import { usePreferences } from '../../../providers/Preferences/index.js'
@@ -41,7 +42,7 @@ export const NavToggler: React.FC<{
4142
// this is because the js may open or close the nav based on the window size, routing, etc
4243
if (!largeBreak) {
4344
await setPreference(
44-
'nav',
45+
PREFERENCE_KEYS.NAV,
4546
{
4647
open: !navOpen,
4748
},

packages/ui/src/elements/Nav/context.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client'
22
import { useWindowInfo } from '@faceless-ui/window-info'
33
import { usePathname } from 'next/navigation.js'
4+
import { PREFERENCE_KEYS } from 'payload/shared'
45
import React, { useEffect, useRef } from 'react'
56

67
import { usePreferences } from '../../providers/Preferences/index.js'
@@ -27,7 +28,7 @@ export const NavContext = React.createContext<NavContextType>({
2728
export const useNav = () => React.use(NavContext)
2829

2930
const getNavPreference = async (getPreference): Promise<boolean> => {
30-
const navPrefs = await getPreference('nav')
31+
const navPrefs = await getPreference(PREFERENCE_KEYS.NAV)
3132
const preferredState = navPrefs?.open
3233
if (typeof preferredState === 'boolean') {
3334
return preferredState

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client'
22
import type { NavPreferences } from 'payload'
33

4+
import { PREFERENCE_KEYS } from 'payload/shared'
45
import React, { useState } from 'react'
56

67
import { ChevronIcon } from '../../icons/Chevron/index.js'
@@ -17,8 +18,6 @@ type Props = {
1718
label: string
1819
}
1920

20-
const preferencesKey = 'nav'
21-
2221
export const NavGroup: React.FC<Props> = ({ children, isOpen: isOpenFromProps, label }) => {
2322
const [collapsed, setCollapsed] = useState(
2423
typeof isOpenFromProps !== 'undefined' ? !isOpenFromProps : false,
@@ -39,7 +38,7 @@ export const NavGroup: React.FC<Props> = ({ children, isOpen: isOpenFromProps, l
3938
newGroupPrefs[label].open = Boolean(collapsed)
4039
}
4140

42-
void setPreference(preferencesKey, { groups: newGroupPrefs }, true)
41+
void setPreference(PREFERENCE_KEYS.NAV, { groups: newGroupPrefs }, true)
4342
setCollapsed(!collapsed)
4443
}
4544

packages/ui/src/views/BrowseByFolder/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { FolderListViewClientProps } from 'payload'
66
import { useDndMonitor } from '@dnd-kit/core'
77
import { getTranslation } from '@payloadcms/translations'
88
import { useRouter } from 'next/navigation.js'
9+
import { PREFERENCE_KEYS } from 'payload/shared'
910
import React, { Fragment } from 'react'
1011

1112
import { DroppableBreadcrumb } from '../../elements/FolderView/Breadcrumbs/index.js'
@@ -171,7 +172,7 @@ function BrowseByFolderViewInContext(props: BrowseByFolderViewInContextProps) {
171172

172173
const handleSetViewType = React.useCallback(
173174
(view: 'grid' | 'list') => {
174-
void setPreference('browse-by-folder', {
175+
void setPreference(PREFERENCE_KEYS.BROWSE_BY_FOLDER, {
175176
viewPreference: view,
176177
})
177178
setActiveView(view)

0 commit comments

Comments
 (0)