File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ import TwitterEmbed from "@/components/twitter-embed";
2121import CodePenEmbed from "@/components/codepen-embed" ;
2222import CodeSandboxEmbed from "./codesandbox-embed" ;
2323import HTMLEmbed from "@/components/html-embed" ;
24+ import QuoteEmbed from "@/components/quote-embed" ;
2425
2526
2627export 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 } ) => (
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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 ;
Original file line number Diff line number Diff line change 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+ } ) ;
Original file line number Diff line number Diff line change @@ -14,6 +14,7 @@ import codepen from "../custom/codepen";
1414import codesandbox from "../custom/codesandbox" ;
1515import html from "../custom/html" ;
1616import twitter from "../custom/twitter-embed" ;
17+ import quote from "../custom/quote" ;
1718
1819const 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 ] ,
You can’t perform that action at this time.
0 commit comments