import { CommentIcon } from '@sanity/icons'; import { defineField } from 'sanity'; import { languages } from '../../languages'; import { validateImage } from '../../utils/validation'; export default defineField({ name: 'blurb', title: 'Blurb', type: 'document', icon: CommentIcon, fields: [ defineField({ name: 'language', type: 'string', readOnly: true, description: 'Language of this document.' // hidden: true, }), // Title defineField({ name: 'title', title: 'Title', type: 'string', description: 'What do you want to convey?', validation: (Rule) => Rule.required() }), // Image defineField({ name: 'image', title: 'Image', type: 'mainImage', validation: (Rule) => validateImage(Rule, true) }), // Text defineField({ name: 'text', title: 'Text', type: 'text', description: 'Small text displayed below title.', rows: 5 }), // Link { name: 'link', title: 'Link', type: 'object', fields: [ { name: 'linkType', type: 'string', title: 'Link type', initialValue: 'internal', description: 'Link to internal or external content.', validation: (Rule) => Rule.required(), options: { list: ['internal', 'external'], layout: 'radio' } }, { name: 'internalLink', type: 'linkInternal', title: 'Internal link', hidden: ({ parent }) => parent?.linkType !== 'internal', options: { collapsible: false }, validation: (Rule) => Rule.custom((value: any, context: any) => { if (context.parent.linkType == 'internal') { const currentLink = value && value.reference; if (!currentLink) { return 'Reference is required'; } } return true; }) }, { name: 'externalLink', type: 'linkExternal', title: 'External link', hidden: ({ parent }) => parent?.linkType !== 'external', options: { collapsible: false }, validation: (Rule) => Rule.custom((value: any, context: any) => { if (context.parent.linkType == 'external') { const currentTitle = value?.title; const currentUrl = value?.url; if (!currentTitle) { return 'Title is required'; } else if (!currentUrl) { return 'URL is required'; } } return true; }) } ] } ], preview: { select: { title: 'title', image: 'image', language: 'language' }, prepare(selection) { const { image, title, language } = selection; const currentLang = languages.find((lang) => lang.id === language); return { media: image, title, subtitle: `${currentLang ? currentLang.title : ''}` }; } } });