sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
83 lines (70 loc) • 2.27 kB
text/typescript
import {EarthAmericasIcon, JsonIcon} from '@sanity/icons'
import {type DocumentInspector, type DocumentInspectorMenuItem, type TFunction} from 'sanity'
import {type PaneMenuItem, type StructureToolFeatures} from '../../types'
import {INSPECT_ACTION_PREFIX} from './constants'
interface GetMenuItemsParams {
currentInspector?: DocumentInspector
features: StructureToolFeatures
hasValue: boolean
inspectors: DocumentInspector[]
previewUrl?: string | null
inspectorMenuItems: DocumentInspectorMenuItem[]
t: TFunction
}
function getInspectorItems({
currentInspector,
hasValue,
inspectors,
inspectorMenuItems,
}: GetMenuItemsParams): PaneMenuItem[] {
return inspectors
.map((inspector, index) => {
const menuItem = inspectorMenuItems[index]
if (!menuItem || menuItem.hidden) return null
return {
action: `${INSPECT_ACTION_PREFIX}${inspector.name}`,
group: menuItem.showAsAction ? undefined : 'inspectors',
icon: menuItem.icon,
isDisabled: !hasValue,
selected: currentInspector?.name === inspector.name,
shortcut: menuItem.hotkeys?.join('+'),
showAsAction: menuItem.showAsAction,
title: menuItem.title,
tone: menuItem.tone,
}
})
.filter(Boolean) as PaneMenuItem[]
}
function getInspectItem({hasValue, t}: GetMenuItemsParams): PaneMenuItem {
return {
action: 'inspect',
group: 'inspectors',
title: t('document-inspector.menu-item.title'),
icon: JsonIcon,
isDisabled: !hasValue,
shortcut: 'Ctrl+Alt+I',
}
}
export function getProductionPreviewItem({previewUrl, t}: GetMenuItemsParams): PaneMenuItem | null {
if (!previewUrl) return null
return {
action: 'production-preview',
group: 'links',
title: t('production-preview.menu-item.title'),
icon: EarthAmericasIcon,
shortcut: 'Ctrl+Alt+O',
}
}
export function getMenuItems(params: GetMenuItemsParams): PaneMenuItem[] {
const inspectorItems = getInspectorItems(params)
const items = [
// Get production preview item
getProductionPreviewItem(params),
].filter(Boolean) as PaneMenuItem[]
return [
...inspectorItems,
// TODO: convert to inspector or document view?
getInspectItem(params),
...items,
]
}