mirror of
https://github.com/vercel/commerce.git
synced 2025-05-15 14:06:59 +00:00
100 lines
2.9 KiB
TypeScript
100 lines
2.9 KiB
TypeScript
// @ts-nocheck
|
|
|
|
/**
|
|
* This plugin contains all the logic for setting up the singletons
|
|
*/
|
|
|
|
import { type DocumentDefinition } from 'sanity';
|
|
import { Iframe } from 'sanity-plugin-iframe-pane';
|
|
import { ListItemBuilder, type StructureResolver } from 'sanity/desk';
|
|
|
|
import { iframeOptions, PREVIEWABLE_DOCUMENT_TYPES } from '../sanity.config';
|
|
|
|
const hiddenDocTypes = (listItem: ListItemBuilder) => {
|
|
const id = listItem.getId();
|
|
|
|
if (!id) {
|
|
return false;
|
|
}
|
|
|
|
return ![
|
|
// 'category',
|
|
// 'home',
|
|
'media.tag',
|
|
// 'page',
|
|
// 'product',
|
|
// 'settings',
|
|
// 'blurb',
|
|
// 'section',
|
|
// 'usp',
|
|
'navigation',
|
|
'footerMenu',
|
|
'utilityMenu'
|
|
].includes(id);
|
|
};
|
|
|
|
export const singletonPlugin = (types: string[]) => {
|
|
return {
|
|
name: 'singletonPlugin',
|
|
document: {
|
|
// Hide 'Singletons (such as Home)' from new document options
|
|
// https://user-images.githubusercontent.com/81981/195728798-e0c6cf7e-d442-4e58-af3a-8cd99d7fcc28.png
|
|
newDocumentOptions: (prev, { creationContext }) => {
|
|
if (creationContext.type === 'global') {
|
|
return prev.filter((templateItem) => !types.includes(templateItem.templateId));
|
|
}
|
|
|
|
return prev;
|
|
},
|
|
// Removes the "duplicate" action on the Singletons (such as Home)
|
|
actions: (prev, { schemaType }) => {
|
|
if (types.includes(schemaType)) {
|
|
return prev.filter(({ action }) => action !== 'duplicate');
|
|
}
|
|
|
|
return prev;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
// The StructureResolver is how we're changing the DeskTool structure to linking to document (named Singleton)
|
|
// like how "Home" is handled.
|
|
export const pageStructure = (typeDefArray: DocumentDefinition[]): StructureResolver => {
|
|
return (S) => {
|
|
// Goes through all of the singletons that were provided and translates them into something the
|
|
// Desktool can understand
|
|
const singletonItems = typeDefArray.map((typeDef) => {
|
|
return S.listItem()
|
|
.title(typeDef.title)
|
|
.icon(typeDef.icon)
|
|
.child(
|
|
S.documentList()
|
|
.title(typeDef.name)
|
|
.filter(`_type == "${typeDef.name}"`)
|
|
.child((id = typeDef.name) =>
|
|
S.document()
|
|
.schemaType(typeDef.name)
|
|
.id(id)
|
|
.views([
|
|
S.view.form(),
|
|
// Preview
|
|
...(PREVIEWABLE_DOCUMENT_TYPES.includes(typeDef.name as any)
|
|
? [S.view.component(Iframe).options(iframeOptions).title('Preview')]
|
|
: [])
|
|
])
|
|
)
|
|
);
|
|
});
|
|
|
|
// The default root list items (except custom ones)
|
|
const defaultListItems = S.documentTypeListItems()
|
|
.filter((listItem) => !typeDefArray.find((singleton) => singleton.name === listItem.getId()))
|
|
.filter(hiddenDocTypes);
|
|
|
|
return S.list()
|
|
.title('Content')
|
|
.items([...singletonItems, S.divider(), ...defaultListItems]);
|
|
};
|
|
};
|