From 88f697b14133cf795f3a5d1e5c5f60964ddc0b8c Mon Sep 17 00:00:00 2001 From: Emmanuel Isenah Date: Fri, 27 Dec 2024 09:03:38 +0100 Subject: [PATCH 1/3] add redirect from /feed.xml to /rss.xml --- packages/blog-starter-kit/themes/personal/next.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/blog-starter-kit/themes/personal/next.config.js b/packages/blog-starter-kit/themes/personal/next.config.js index 4dc5f44bb..2e05f91cb 100644 --- a/packages/blog-starter-kit/themes/personal/next.config.js +++ b/packages/blog-starter-kit/themes/personal/next.config.js @@ -83,6 +83,10 @@ const config = { source: '/api/analytics', destination: `${HASHNODE_ADVANCED_ANALYTICS_URL}/api/analytics`, }, + { + source: '/feed.xml', + destination: '/rss.xml', + }, ]; }, async redirects() { From 706891007bb826928f5e9003e7b6e5d8666d10f5 Mon Sep 17 00:00:00 2001 From: Emmanuel Isenah Date: Fri, 27 Dec 2024 09:07:36 +0100 Subject: [PATCH 2/3] add error handling to slug getStaticProps --- .../themes/personal/pages/[slug].tsx | 52 +++++++++++-------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/packages/blog-starter-kit/themes/personal/pages/[slug].tsx b/packages/blog-starter-kit/themes/personal/pages/[slug].tsx index a7e751720..7bd1d5229 100644 --- a/packages/blog-starter-kit/themes/personal/pages/[slug].tsx +++ b/packages/blog-starter-kit/themes/personal/pages/[slug].tsx @@ -197,38 +197,48 @@ export const getStaticProps: GetStaticProps = async ({ params }) const host = process.env.NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST; const slug = params.slug; - const postData = await request(endpoint, SinglePostByPublicationDocument, { host, slug }); + try { + const postData = await request(endpoint, SinglePostByPublicationDocument, { host, slug }); + + if (postData.publication?.post) { + return { + props: { + type: 'post', + post: postData.publication.post, + publication: postData.publication, + }, + revalidate: 1, + }; + } + + const pageData = await request(endpoint, PageByPublicationDocument, { host, slug }); + + if (pageData.publication?.staticPage) { + return { + props: { + type: 'page', + page: pageData.publication.staticPage, + publication: pageData.publication, + }, + revalidate: 1, + }; + } - if (postData.publication?.post) { return { - props: { - type: 'post', - post: postData.publication.post, - publication: postData.publication, - }, + notFound: true, revalidate: 1, }; - } - - const pageData = await request(endpoint, PageByPublicationDocument, { host, slug }); + } catch (error) { + console.error('Error fetching data:', error); - if (pageData.publication?.staticPage) { return { - props: { - type: 'page', - page: pageData.publication.staticPage, - publication: pageData.publication, - }, + notFound: true, revalidate: 1, }; } - - return { - notFound: true, - revalidate: 1, - }; }; + export async function getStaticPaths() { const data = await request( process.env.NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT, From ef55f7dfcf0c66cd624a6611652a992654ffaeba Mon Sep 17 00:00:00 2001 From: Emmanuel Isenah Date: Fri, 27 Dec 2024 09:09:04 +0100 Subject: [PATCH 3/3] add route handler to fetch favicon --- .../themes/personal/pages/favicon.ico.tsx | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 packages/blog-starter-kit/themes/personal/pages/favicon.ico.tsx diff --git a/packages/blog-starter-kit/themes/personal/pages/favicon.ico.tsx b/packages/blog-starter-kit/themes/personal/pages/favicon.ico.tsx new file mode 100644 index 000000000..500b5a8c4 --- /dev/null +++ b/packages/blog-starter-kit/themes/personal/pages/favicon.ico.tsx @@ -0,0 +1,39 @@ +import request from 'graphql-request'; +import { type GetServerSideProps } from 'next'; +import { + PublicationByHostDocument, + PublicationByHostQuery, + PublicationByHostQueryVariables, +} from '../generated/graphql'; + +const GQL_ENDPOINT = process.env.NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT; +const FaviconIco = () => null; + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + const { res } = ctx; + const host = process.env.NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST; + if (!host) { + throw new Error('Could not determine host'); + } + + const data = await request( + GQL_ENDPOINT, + PublicationByHostDocument, + { + host: process.env.NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST, + }, + ); + if (!data.publication?.favicon) throw new Error('Favicon could not be found'); + + const faviconResponse = await fetch(data.publication.favicon); + const faviconBuffer = await faviconResponse.arrayBuffer(); + + res.setHeader('Cache-Control', 's-maxage=86400, stale-while-revalidate'); + res.setHeader('content-type', 'image/x-icon'); + res.write(Buffer.from(faviconBuffer)); + res.end(); + + return { props: {} }; +}; + +export default FaviconIco;