Skip to content
Snippets Groups Projects
PortableTextBlock.js 2.96 KiB
Newer Older
Tarje Lavik's avatar
Tarje Lavik committed
import React from 'react'
Sanity.io's avatar
Sanity.io committed
import {Link as NextLink} from 'next/link'
Tarje Lavik's avatar
Tarje Lavik committed
import {Heading, Link, Text} from '@chakra-ui/react'
import { BigText, Hero, Iframe, InstagramPost, PageHeader,Quote, MiradorGallery, SectionText, SingleObject, Social, TimelineSection, TwoColumn, Video } from './Sections'
Sanity.io's avatar
Sanity.io committed

const BlockContent = require('@sanity/block-content-to-react')

export default function PortableTextBlock(props) {
  if (!props.blocks) {
    return null
  }

  const {fontSize, fontWeight, my} = props

  const BlockRenderer = (props) => {
    const {style = 'normal'} = props.node

    if (/^h\d/.test(style)) {
Tarje Lavik's avatar
Tarje Lavik committed
      const level = style
      return(<Heading as={level} size={level === "h2" ? "lg" : "md"}>{props.children}</Heading>)
Sanity.io's avatar
Sanity.io committed
    }

    if (style === 'blockquote') {
      return <blockquote>- {props.children}</blockquote>
    }

    return (
      <Text fontSize={fontSize} fontWeight={fontWeight} my={my}>
        {props.children}
      </Text>
    )
    // Fall back to default handling
    // return BlockContent.defaultSerializers.types.block(props)
  }

  const serializers = {
    marks: {
      internalLink: ({mark, children}) => {
        const {reference} = mark
        const href = `/id/${reference._ref}`
        return (
          <Link as={NextLink} href={href}>
            {children}
          </Link>
        )
      },
      link: ({mark, children}) => {
        // Read https://css-tricks.com/use-target_blank/
        const {blank, href} = mark
        return blank ? (
          <Link as={NextLink} href={href} isExternal>
            {children}
          </Link>
        ) : (
          <Link as={NextLink} href={href} isExternal>
            {children}
          </Link>
        )
      },
    },
    types: {
      code: (props) => (
        <pre data-language={props.node.language}>
          <code>{props.node.code}</code>
        </pre>
      ),
      block: BlockRenderer,
Tarje Lavik's avatar
Tarje Lavik committed
      BigText: (props) => (<BigText {...props.node} />),
      Hero: (props) => (<Hero {...props.node} />),
      Iframe: (props) => (<Iframe {...props.node} />),
      InstagramPost: (props) => (<InstagramPost {...props.node} />),
      MiradorGallery: (props) => (<MiradorGallery {...props.node} />),
      PageHeader: (props) => (<PageHeader {...props.node} />),
      Quote: (props) => (<Quote {...props.node} />),
      SectionText: (props) => (<SectionText {...props.node} />),
      SingleObject: (props) => (<SingleObject {...props.node} />),
      Social: (props) => (<Social {...props.node} />),
      TimelineSection: (props) => (<TimelineSection {...props.node} />),
      TwoColumn: (props) => (<TwoColumn {...props.node} />),
      Video: (props) => (<Video {...props.node} />),
      Place: (props) => (
Sanity.io's avatar
Sanity.io committed
        <div>
          <h2>Demo: referanse til dokument i en Portable Text blokk</h2>
          <p>
            <Link href={`/id/${props.node._id}`}>{props.node.label.nor}</Link>
          </p>
        </div>
      )
    },
  }

  return <BlockContent blocks={props.blocks} serializers={serializers} />
}