UNPKG

sanity-plugin-social-preview

Version:

Show your editors how their page will look on Google and major social platforms in your documents' view

80 lines (66 loc) 2.01 kB
import imageUrlBuilder from '@sanity/image-url' import { useDataset, useProjectId } from 'sanity' import { BasePreviewProps, SanityImage } from './types' export const getDomainName = (str: string): string => { try { const url = new URL(str) return url.hostname } catch (error) { return str } } // eslint-disable-next-line export const useImageUrl = ( image: BasePreviewProps['image'], dimensions: { w: number; h: number }, ) => { const projectId = useProjectId() const dataset = useDataset() if (!image) return undefined if (typeof image === 'string') { return image } const builder = imageUrlBuilder({ projectId, dataset }) return builder.image(image).width(dimensions.w).height(dimensions.h).url() } export const assemblePageUrl = ({ document, options, }: { document: { slug?: string } options: { previewURL?: string } }): string => { const { slug } = document const { previewURL } = options if (!slug || !previewURL) { console.warn('Missing slug or previewURL', { slug, previewURL }) return '' } return `${previewURL}/project/${slug}` } const defaults = { nonTextBehavior: 'remove' } export function toPlainText( blocks: any[], opts: { nonTextBehavior?: 'remove' } = {}, ): string { const options = Object.assign({}, defaults, opts) return blocks .map((block) => { if (block._type !== 'block' || !block.children) { return options.nonTextBehavior === 'remove' ? '' : `[${block._type} block]` } return block.children.map((child: any) => child.text || '').join('') }) .join('\n\n') } export function truncate(str: string, maxLength: number): string { if (str.length < maxLength) { return str } // To prevent truncating in the middle of words, let's get // the position of the first whitespace after the truncation const firstWhitespaceAfterTruncation = str.slice(maxLength).search(/\s/) + maxLength return `${str.slice(0, firstWhitespaceAfterTruncation)}...` }