forked from CaliCastle/cali.so
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PostPortableText.tsx
61 lines (56 loc) · 1.63 KB
/
PostPortableText.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
'use client'
import { PortableText, type PortableTextComponents } from '@portabletext/react'
import React from 'react'
import { PeekabooLink } from '~/components/links/PeekabooLink'
import {
PortableTextBlocksBlockquote,
PortableTextBlocksH1,
PortableTextBlocksH2,
PortableTextBlocksH3,
PortableTextBlocksH4,
PortableTextBlocksListItem,
PortableTextBlocksNormal,
} from '~/components/portable-text/PortableTextBlocks'
import { PortableTextCodeBlock } from '~/components/portable-text/PortableTextCodeBlock'
import { PortableTextImage } from '~/components/portable-text/PortableTextImage'
import { PortableTextTweet } from '~/components/portable-text/PortableTextTweet'
const components: PortableTextComponents = {
block: {
normal: PortableTextBlocksNormal,
h1: PortableTextBlocksH1,
h2: PortableTextBlocksH2,
h3: PortableTextBlocksH3,
h4: PortableTextBlocksH4,
blockquote: PortableTextBlocksBlockquote,
},
listItem: PortableTextBlocksListItem,
types: {
image: PortableTextImage,
tweet: PortableTextTweet,
codeBlock: PortableTextCodeBlock,
},
marks: {
link: ({ children, value }) => {
const rel = !value.href.startsWith('/')
? 'noreferrer noopener'
: undefined
return (
<PeekabooLink href={value.href} rel={rel}>
{children}
</PeekabooLink>
)
},
},
}
export function PostPortableText(props: {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
value: any
components?: PortableTextComponents
}) {
return (
<PortableText
value={props.value}
components={props.components ?? components}
/>
)
}