mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
This PR updates the `cms-sanity` example to use: - App Router - TypeScript - Sanity Studio v3 instead of v2 - Embeds the Studio inside the next app on the `/studio` route. - ISR / Data Cache (revalidations through `revalidatePath` while in Live Visual Editing, time-based to match the Sanity API CDN in production). - Support Vercel Visual Editing out of the box. - The new `next-sanity/image` component. - Vercel Speed Insights. - The Sanity Presentation Tool for live content previews. - Sanity Portable Text setup to fully support `@tailwindcss/typography`. - [AI Assist](https://www.sanity.io/docs/ai-assist) - Auto fill in `alt` text on images. - Preset prompts for content creation
66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
/**
|
|
* This plugin contains all the logic for setting up the singletons
|
|
*/
|
|
|
|
import { definePlugin, type DocumentDefinition } from "sanity";
|
|
import { type StructureResolver } from "sanity/structure";
|
|
|
|
export const singletonPlugin = definePlugin((types: string[]) => {
|
|
return {
|
|
name: "singletonPlugin",
|
|
document: {
|
|
// Hide 'Singletons (such as Settings)' from new document options
|
|
// https://user-images.githubusercontent.com/81981/195728798-e0c6cf7e-d442-4e58-af3a-8cd99d7fcc28.png
|
|
newDocumentOptions: (prev, { creationContext, ...rest }) => {
|
|
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
|
|
// Structure tool can understand
|
|
const singletonItems = typeDefArray.map((typeDef) => {
|
|
return S.listItem()
|
|
.title(typeDef.title!)
|
|
.icon(typeDef.icon)
|
|
.child(
|
|
S.editor()
|
|
.id(typeDef.name)
|
|
.schemaType(typeDef.name)
|
|
.documentId(typeDef.name),
|
|
);
|
|
});
|
|
|
|
// The default root list items (except custom ones)
|
|
const defaultListItems = S.documentTypeListItems().filter(
|
|
(listItem) =>
|
|
!typeDefArray.find((singleton) => singleton.name === listItem.getId()),
|
|
);
|
|
|
|
return S.list()
|
|
.title("Content")
|
|
.items([...singletonItems, S.divider(), ...defaultListItems]);
|
|
};
|
|
};
|