From fc0d68c0192892e2bcfb6dbe4ad045f3e58ff6aa Mon Sep 17 00:00:00 2001
From: Angelo Ashmore <angeloashmore@users.noreply.github.com>
Date: Wed, 2 Mar 2022 14:01:24 -1000
Subject: [PATCH] fix: detect empty Rich Text fields using
 `@prismicio/helpers`'s `isFilled.richText()` (#130)

---
 package-lock.json             | 18 +++++++++---------
 package.json                  |  2 +-
 src/PrismicRichText.tsx       |  6 +++---
 src/PrismicText.tsx           |  2 +-
 test/PrismicRichText.test.tsx | 17 ++++++++++++++---
 test/PrismicText.test.tsx     | 15 +++++++++++++--
 6 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index a75470c..9a287f1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
 			"version": "2.1.0",
 			"license": "Apache-2.0",
 			"dependencies": {
-				"@prismicio/helpers": "^2.1.1",
+				"@prismicio/helpers": "^2.2.0",
 				"@prismicio/richtext": "^2.0.1"
 			},
 			"devDependencies": {
@@ -726,12 +726,12 @@
 			}
 		},
 		"node_modules/@prismicio/helpers": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/@prismicio/helpers/-/helpers-2.1.1.tgz",
-			"integrity": "sha512-jP17J0ot3zOEMqL3yJteAQW6zwR2ttWwowpVJ02Q6sBk1K9DFfQbQ9ySA4tkBQS0ki3ttWFnrERDzCZ/xCCvGQ==",
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@prismicio/helpers/-/helpers-2.2.0.tgz",
+			"integrity": "sha512-qgszdfBrPqn4NdmBiyNK+USfUWuI21HCCOMJMoq2R6jp4YDbxcXD7RjixNPK9mjZRtraHnrHzFO/ABK1gLgQIA==",
 			"dependencies": {
 				"@prismicio/richtext": "^2.0.1",
-				"@prismicio/types": "^0.1.23",
+				"@prismicio/types": "^0.1.24",
 				"escape-html": "^1.0.3",
 				"imgix-url-builder": "^0.0.2"
 			},
@@ -11844,12 +11844,12 @@
 			}
 		},
 		"@prismicio/helpers": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/@prismicio/helpers/-/helpers-2.1.1.tgz",
-			"integrity": "sha512-jP17J0ot3zOEMqL3yJteAQW6zwR2ttWwowpVJ02Q6sBk1K9DFfQbQ9ySA4tkBQS0ki3ttWFnrERDzCZ/xCCvGQ==",
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@prismicio/helpers/-/helpers-2.2.0.tgz",
+			"integrity": "sha512-qgszdfBrPqn4NdmBiyNK+USfUWuI21HCCOMJMoq2R6jp4YDbxcXD7RjixNPK9mjZRtraHnrHzFO/ABK1gLgQIA==",
 			"requires": {
 				"@prismicio/richtext": "^2.0.1",
-				"@prismicio/types": "^0.1.23",
+				"@prismicio/types": "^0.1.24",
 				"escape-html": "^1.0.3",
 				"imgix-url-builder": "^0.0.2"
 			}
diff --git a/package.json b/package.json
index 8d1b762..b6208d7 100644
--- a/package.json
+++ b/package.json
@@ -46,7 +46,7 @@
 		"unit": "nyc --reporter=lcovonly --reporter=text --exclude-after-remap=false ava"
 	},
 	"dependencies": {
-		"@prismicio/helpers": "^2.1.1",
+		"@prismicio/helpers": "^2.2.0",
 		"@prismicio/richtext": "^2.0.1"
 	},
 	"devDependencies": {
diff --git a/src/PrismicRichText.tsx b/src/PrismicRichText.tsx
index ba3e216..3d0b315 100644
--- a/src/PrismicRichText.tsx
+++ b/src/PrismicRichText.tsx
@@ -220,9 +220,7 @@ export const PrismicRichText = (
 	const context = usePrismicContext();
 
 	return React.useMemo(() => {
-		if (!props.field) {
-			return null;
-		} else {
+		if (prismicH.isFilled.richText(props.field)) {
 			const linkResolver = props.linkResolver || context.linkResolver;
 
 			const serializer = prismicR.composeSerializers(
@@ -256,6 +254,8 @@ export const PrismicRichText = (
 			);
 
 			return <>{serialized}</>;
+		} else {
+			return null;
 		}
 	}, [
 		props.field,
diff --git a/src/PrismicText.tsx b/src/PrismicText.tsx
index 7e6447d..04a1571 100644
--- a/src/PrismicText.tsx
+++ b/src/PrismicText.tsx
@@ -43,7 +43,7 @@ export type PrismicTextProps = {
  */
 export const PrismicText = (props: PrismicTextProps): JSX.Element | null => {
 	return React.useMemo(() => {
-		if (props.field) {
+		if (prismicH.isFilled.richText(props.field)) {
 			const text = prismicH.asText(props.field, props.separator);
 
 			return <>{text}</>;
diff --git a/test/PrismicRichText.test.tsx b/test/PrismicRichText.test.tsx
index 523c178..969aed2 100644
--- a/test/PrismicRichText.test.tsx
+++ b/test/PrismicRichText.test.tsx
@@ -20,13 +20,19 @@ const Link = ({ href, rel, target, children }: LinkProps) => (
 	</a>
 );
 
-test("returns null if passed nullish field", (t) => {
+test("returns null if passed an empty field", (t) => {
 	const actualNull = renderJSON(<PrismicRichText field={null} />);
 	const actualUndefined = renderJSON(<PrismicRichText field={undefined} />);
+	const actualEmpty = renderJSON(<PrismicRichText field={[]} />);
+	const actualEmpty2 = renderJSON(
+		<PrismicRichText field={[{ type: "paragraph", text: "", spans: [] }]} />,
+	);
 	const expected = null;
 
 	t.deepEqual(actualNull, expected);
 	t.deepEqual(actualUndefined, expected);
+	t.deepEqual(actualEmpty, expected);
+	t.deepEqual(actualEmpty2, expected);
 });
 
 test("returns <h1> if type is heading1", (t) => {
@@ -349,11 +355,16 @@ test("returns <image /> wrapped in <PrismicLink />", (t) => {
 });
 
 test("returns <div /> with embedded html if type is embed", (t) => {
-	const oembed: prismicT.EmbedField = {
+	const oembed: prismicT.EmbedField<
+		prismicT.RichOEmbed & { provider_name: string }
+	> = {
+		version: "1.0",
 		embed_url: "https://example.com",
 		type: "rich",
-		provider_name: "Prismic",
 		html: "<marquee>Prismic is fun</marquee>",
+		width: 100,
+		height: 100,
+		provider_name: "Prismic",
 	};
 	const field: prismicT.RichTextField = [
 		{
diff --git a/test/PrismicText.test.tsx b/test/PrismicText.test.tsx
index 3894975..f920be7 100644
--- a/test/PrismicText.test.tsx
+++ b/test/PrismicText.test.tsx
@@ -21,24 +21,35 @@ test("returns string when passed RichTextField", (t) => {
 	t.deepEqual(actual, expected);
 });
 
-test("returns null when passed nullish field", (t) => {
+test("returns null when passed empty field", (t) => {
 	const actualNull = renderJSON(<PrismicText field={null} />);
 	const actualUndefined = renderJSON(<PrismicText field={undefined} />);
+	const actualEmpty = renderJSON(
+		<PrismicText field={[{ type: "paragraph", text: "", spans: [] }]} />,
+	);
 	const expected = null;
 
 	t.deepEqual(actualNull, expected);
 	t.deepEqual(actualUndefined, expected);
+	t.deepEqual(actualEmpty, expected);
 });
 
-test("returns fallback when passed nullish field", (t) => {
+test("returns fallback when passed empty field", (t) => {
 	const actualNull = renderJSON(
 		<PrismicText field={null} fallback="fallback" />,
 	);
 	const actualUndefined = renderJSON(
 		<PrismicText field={undefined} fallback="fallback" />,
 	);
+	const actualEmpty = renderJSON(
+		<PrismicText
+			field={[{ type: "paragraph", text: "", spans: [] }]}
+			fallback="fallback"
+		/>,
+	);
 	const expected = renderJSON(<>fallback</>);
 
 	t.deepEqual(actualNull, expected);
 	t.deepEqual(actualUndefined, expected);
+	t.deepEqual(actualEmpty, expected);
 });