Preview subtitle with async referenced document titles in Sanity
I can see the issue you're running into! The prepare function in Sanity's preview configuration cannot be async and cannot make queries. The function needs to return synchronously, which is why your async function returning a Promise object isn't working.
The good news is that Sanity has a built-in solution for this exact scenario. You can use dot notation in the select object to access fields from referenced documents directly, without needing to make separate queries.
Here's how to fix your preview:
preview: {
select: {
title: 'title',
// Access the title from the first 3 tools/cards in your content array
tool0: 'content.0.tool.title',
tool1: 'content.1.tool.title',
tool2: 'content.2.tool.title',
card0: 'content.0.card.title',
card1: 'content.1.card.title',
card2: 'content.2.card.title'
},
prepare({ title, tool0, tool1, tool2, card0, card1, card2 }) {
// Filter out undefined values and combine
const items = [tool0, tool1, tool2, card0, card1, card2].filter(Boolean)
return {
title: title,
subtitle: items.length > 0 ? items.join(', ') : 'No items yet'
}
}
}This approach:
- Uses array indices (
content.0,content.1, etc.) to access specific array items - Uses dot notation to reach into the referenced documents and grab their titles
- Works synchronously, so the preview updates immediately
- No client queries needed!
Important limitation: You need to specify the exact number of items you want to preview upfront (I used 3 in the example). The select object can't dynamically loop through all array items, so you'll need to decide how many references you want to show in the subtitle.
If you have a mixed array of tools and cards, you might need to adjust the select paths based on your schema structure. For example, if your content array has objects with either a tool or card reference field, the above should work. If the structure is different, adjust the paths accordingly.
This is the standard Sanity way to handle reference previews - much cleaner than trying to fetch data in the prepare function!
Show original thread2 replies
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.