commerce/plugins/settings.tsx
2023-08-23 23:20:53 +02:00

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]);
};
};