From b0809a20abe347c5b2778d43b30d0624d95e55bf Mon Sep 17 00:00:00 2001 From: Spherrrical Date: Wed, 1 Apr 2026 15:40:39 -0700 Subject: [PATCH] fix(web): make blog routes resilient without Sanity config --- apps/www/src/app/api/og/[slug]/route.tsx | 13 ++++++++++-- apps/www/src/app/blog/[slug]/layout.tsx | 13 ++++++++++-- apps/www/src/app/blog/[slug]/page.tsx | 26 ++++++++++++++++++++---- apps/www/src/app/blog/page.tsx | 11 +++++++++- apps/www/src/app/sitemap.ts | 4 ++++ apps/www/src/lib/sanity.ts | 21 ++++++++++++------- 6 files changed, 72 insertions(+), 16 deletions(-) diff --git a/apps/www/src/app/api/og/[slug]/route.tsx b/apps/www/src/app/api/og/[slug]/route.tsx index f11f804c..46e6457b 100644 --- a/apps/www/src/app/api/og/[slug]/route.tsx +++ b/apps/www/src/app/api/og/[slug]/route.tsx @@ -39,6 +39,10 @@ function loadFont(fileName: string, baseUrl: string) { } async function getBlogPost(slug: string) { + if (!client) { + return null; + } + const query = `*[_type == "blog" && slug.current == $slug && published == true][0] { _id, title, @@ -53,8 +57,13 @@ async function getBlogPost(slug: string) { } }`; - const post = await client.fetch(query, { slug }); - return post; + try { + const post = await client.fetch(query, { slug }); + return post; + } catch (error) { + console.error("Error fetching blog post for OG image:", error); + return null; + } } function formatDate(dateString: string): string { diff --git a/apps/www/src/app/blog/[slug]/layout.tsx b/apps/www/src/app/blog/[slug]/layout.tsx index 942d61c6..3eeec143 100644 --- a/apps/www/src/app/blog/[slug]/layout.tsx +++ b/apps/www/src/app/blog/[slug]/layout.tsx @@ -17,6 +17,10 @@ interface BlogPost { } async function getBlogPost(slug: string): Promise { + if (!client) { + return null; + } + const query = `*[_type == "blog" && slug.current == $slug && published == true][0] { _id, title, @@ -26,8 +30,13 @@ async function getBlogPost(slug: string): Promise { author }`; - const post = await client.fetch(query, { slug }); - return post || null; + try { + const post = await client.fetch(query, { slug }); + return post || null; + } catch (error) { + console.error("Error fetching blog post metadata:", error); + return null; + } } export async function generateMetadata({ diff --git a/apps/www/src/app/blog/[slug]/page.tsx b/apps/www/src/app/blog/[slug]/page.tsx index 49c55955..7af4a52c 100644 --- a/apps/www/src/app/blog/[slug]/page.tsx +++ b/apps/www/src/app/blog/[slug]/page.tsx @@ -25,6 +25,10 @@ interface BlogPost { } async function getBlogPost(slug: string): Promise { + if (!client) { + return null; + } + const query = `*[_type == "blog" && slug.current == $slug && published == true][0] { _id, title, @@ -51,17 +55,31 @@ async function getBlogPost(slug: string): Promise { author }`; - const post = await client.fetch(query, { slug }); - return post || null; + try { + const post = await client.fetch(query, { slug }); + return post || null; + } catch (error) { + console.error("Error fetching blog post:", error); + return null; + } } async function getAllBlogSlugs(): Promise { + if (!client) { + return []; + } + const query = `*[_type == "blog" && published == true] { "slug": slug.current }`; - const posts = await client.fetch(query); - return posts.map((post: { slug: string }) => post.slug); + try { + const posts = await client.fetch(query); + return posts.map((post: { slug: string }) => post.slug); + } catch (error) { + console.error("Error fetching blog slugs:", error); + return []; + } } export async function generateStaticParams() { diff --git a/apps/www/src/app/blog/page.tsx b/apps/www/src/app/blog/page.tsx index 9b13c5e5..93e5d271 100644 --- a/apps/www/src/app/blog/page.tsx +++ b/apps/www/src/app/blog/page.tsx @@ -44,6 +44,10 @@ function formatDate(dateString: string): string { } async function getBlogPosts(): Promise { + if (!client) { + return []; + } + const query = `*[_type == "blog" && published == true] | order(publishedAt desc) { _id, title, @@ -58,7 +62,12 @@ async function getBlogPosts(): Promise { featured }`; - return await client.fetch(query); + try { + return await client.fetch(query); + } catch (error) { + console.error("Error fetching blog posts:", error); + return []; + } } export default async function BlogPage() { diff --git a/apps/www/src/app/sitemap.ts b/apps/www/src/app/sitemap.ts index d3a386e7..e3cd5fd7 100644 --- a/apps/www/src/app/sitemap.ts +++ b/apps/www/src/app/sitemap.ts @@ -10,6 +10,10 @@ interface BlogPost { } async function getBlogPosts(): Promise { + if (!client) { + return []; + } + const query = `*[_type == "blog" && published == true] | order(publishedAt desc) { slug, publishedAt, diff --git a/apps/www/src/lib/sanity.ts b/apps/www/src/lib/sanity.ts index bb6ad3f5..d5a26217 100644 --- a/apps/www/src/lib/sanity.ts +++ b/apps/www/src/lib/sanity.ts @@ -6,15 +6,22 @@ const projectId = process.env.NEXT_PUBLIC_SANITY_PROJECT_ID; const dataset = process.env.NEXT_PUBLIC_SANITY_DATASET; const apiVersion = process.env.NEXT_PUBLIC_SANITY_API_VERSION; -export const client = createClient({ - projectId, - dataset, - apiVersion, - useCdn: true, // Set to false if statically generating pages, using ISR or using the on-demand revalidation API -}); +export const hasSanityConfig = Boolean(projectId && dataset && apiVersion); -const builder = imageUrlBuilder(client); +export const client = hasSanityConfig + ? createClient({ + projectId, + dataset, + apiVersion, + useCdn: true, // Set to false if statically generating pages, using ISR or using the on-demand revalidation API + }) + : null; + +const builder = client ? imageUrlBuilder(client) : null; export function urlFor(source: SanityImageSource) { + if (!builder) { + throw new Error("Sanity client is not configured."); + } return builder.image(source); }