Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a4f8717

Browse files
add quotes
1 parent 6d8833f commit a4f8717

File tree

5 files changed

+91
-0
lines changed

5 files changed

+91
-0
lines changed

components/portable-text.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import TwitterEmbed from "@/components/twitter-embed";
2121
import CodePenEmbed from "@/components/codepen-embed";
2222
import CodeSandboxEmbed from "./codesandbox-embed";
2323
import HTMLEmbed from "@/components/html-embed";
24+
import QuoteEmbed from "@/components/quote-embed";
2425

2526

2627
export default function CustomPortableText({
@@ -39,6 +40,7 @@ export default function CustomPortableText({
3940
codesandbox: ({ value }) => <CodeSandboxEmbed {...value} />,
4041
twitter: ({ value }) => <TwitterEmbed {...value} />,
4142
htmlBlock: ({ value }) => <HTMLEmbed {...value} />,
43+
quote: ({ value }) => <QuoteEmbed {...value} />,
4244
},
4345
block: {
4446
h5: ({ children }) => (

components/quote-embed.tsx

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import {
2+
PortableText,
3+
type PortableTextComponents,
4+
} from "next-sanity";
5+
import Link from "next/link";
6+
7+
export default function QuoteEmbed(props: any) {
8+
const { content, url } = props;
9+
if (!content) {
10+
return null;
11+
}
12+
const components: PortableTextComponents = {
13+
marks: {
14+
link: ({ children, value }) => {
15+
return (
16+
<Link href={value?.href || "#"} rel="noreferrer noopener" target="_blank">
17+
{children}
18+
</Link>
19+
);
20+
},
21+
internalLink: ({ children, value }) => {
22+
return <Link href={value?.href || "#"}>{children}</Link>;
23+
},
24+
},
25+
};
26+
return (
27+
<figure>
28+
<blockquote cite={url || '#'} className="mt-6 border-l-2 pl-6 italic">
29+
<PortableText components={components} value={content} />
30+
</blockquote>
31+
</figure>
32+
)
33+
}

sanity/components/QuotePreview.tsx

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from "react";
2+
// TODO: Add stronger typing
3+
const QuotePreview = (props: any) => {
4+
const { text, url } = props;
5+
if (!text) {
6+
return null;
7+
}
8+
return (
9+
<figure>
10+
<blockquote cite={url}>
11+
{text}
12+
</blockquote>
13+
</figure>
14+
)
15+
};
16+
17+
const preview = (props: any) => <QuotePreview {...props} />;
18+
19+
export default preview;

sanity/schemas/custom/quote.ts

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { defineArrayMember, defineField, defineType } from "sanity";
2+
import { FaQuoteLeft } from "react-icons/fa6";
3+
import preview from "../../components/QuotePreview";
4+
import externalLink from "./externalLink";
5+
import internalLink from "./internalLink";
6+
7+
export default defineType({
8+
name: "quote",
9+
type: "object",
10+
icon: FaQuoteLeft,
11+
fields: [
12+
defineField({
13+
name: "content",
14+
title: "Content",
15+
type: "array",
16+
of: [
17+
defineArrayMember({
18+
type: "block",
19+
marks: {
20+
annotations: [
21+
defineArrayMember(externalLink),
22+
defineArrayMember(internalLink),
23+
],
24+
},
25+
}),
26+
],
27+
}),
28+
defineField({
29+
name: 'url',
30+
type: 'url',
31+
title: 'URL',
32+
description: 'Source on the web',
33+
})
34+
],
35+
});

sanity/schemas/partials/base.ts

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import codepen from "../custom/codepen";
1414
import codesandbox from "../custom/codesandbox";
1515
import html from "../custom/html";
1616
import twitter from "../custom/twitter-embed";
17+
import quote from "../custom/quote";
1718

1819
const baseType = defineType({
1920
name: "base",
@@ -96,6 +97,7 @@ const baseType = defineType({
9697
defineArrayMember(codesandbox),
9798
defineArrayMember(twitter),
9899
defineArrayMember(html),
100+
defineArrayMember(quote),
99101
],
100102
}),
101103
],

0 commit comments

Comments
 (0)