From 41651391fcc0651432887c3c1a4995c228c00cd3 Mon Sep 17 00:00:00 2001 From: capJavert Date: Wed, 27 Nov 2024 11:52:57 +0100 Subject: [PATCH 1/5] feat: temp rewrite --- packages/webapp/next.config.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/webapp/next.config.ts b/packages/webapp/next.config.ts index 0a75f48fe0..219c15571a 100644 --- a/packages/webapp/next.config.ts +++ b/packages/webapp/next.config.ts @@ -102,6 +102,7 @@ const nextConfig: NextConfig = { env: { CURRENT_VERSION: version, }, + assetPrefix: process.env.CDN_ASSET_PREFIX, rewrites: async () => { const rewrites: Rewrite[] = [ { @@ -124,6 +125,24 @@ const nextConfig: NextConfig = { }, ]; + if (process.env.REWRITE_DEPLOYMENT_URL) { + return { + beforeFiles: [ + { + source: '/:path*', + destination: `${process.env.REWRITE_DEPLOYMENT_URL}/:path*`, + }, + ], + afterFiles: rewrites, + fallback: [ + { + source: '/:path*', + destination: `${process.env.REWRITE_DEPLOYMENT_URL}/:path*`, + }, + ], + }; + } + // to support GitPod environment and avoid CORS issues, we need to proxy the API requests if (process.env.NEXT_PUBLIC_DOMAIN === 'localhost') { rewrites.unshift({ From e2176bbaf08140baa5bafd3d1f940bfb5d5cc78c Mon Sep 17 00:00:00 2001 From: capJavert Date: Thu, 28 Nov 2024 11:07:31 +0100 Subject: [PATCH 2/5] feat: test isr --- packages/webapp/pages/isr/[id]/index.tsx | 101 +++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 packages/webapp/pages/isr/[id]/index.tsx diff --git a/packages/webapp/pages/isr/[id]/index.tsx b/packages/webapp/pages/isr/[id]/index.tsx new file mode 100644 index 0000000000..be09933f3e --- /dev/null +++ b/packages/webapp/pages/isr/[id]/index.tsx @@ -0,0 +1,101 @@ +import { gqlClient } from '@dailydotdev/shared/src/graphql/common'; +import { + PostData, + POST_BY_ID_STATIC_FIELDS_QUERY, + Post, + PostType, +} from '@dailydotdev/shared/src/graphql/posts'; +import { webappUrl } from '@dailydotdev/shared/src/lib/constants'; +import { ClientError } from 'graphql-request'; +import { + GetStaticPathsResult, + GetStaticPropsContext, + GetStaticPropsResult, +} from 'next'; +import { NextSeoProps } from 'next-seo'; +import { ApiError } from 'next/dist/server/api-utils'; +import { ParsedUrlQuery } from 'querystring'; +import React, { ReactElement } from 'react'; +import { DynamicSeoProps } from '../../../components/common'; +import { getTemplatedTitle } from '../../../components/layouts/utils'; +import { getSeoDescription } from '../../../components/PostSEOSchema'; + +export interface Props extends DynamicSeoProps { + id: string; + initialData?: PostData; +} + +interface PostParams extends ParsedUrlQuery { + id: string; +} + +const seoTitle = (post: Post) => { + if (post?.type === PostType.Share && post?.title === null) { + return `Shared post at ${post?.source?.name}`; + } + + return post?.title; +}; + +const TestPage = ({ id, initialData }: Props): ReactElement => { + return ( +
+

Test post: {id}

+ {JSON.stringify(initialData, null, 2)} +
+ ); +}; + +export default TestPage; + +export async function getStaticPaths(): Promise { + return { paths: [], fallback: true }; +} + +export async function getStaticProps({ + params, +}: GetStaticPropsContext): Promise> { + const { id } = params; + + try { + const initialData = await gqlClient.request( + POST_BY_ID_STATIC_FIELDS_QUERY, + { id }, + ); + + const post = initialData.post as Post; + const seo: NextSeoProps = { + canonical: post?.slug ? `${webappUrl}posts/${post.slug}` : undefined, + title: getTemplatedTitle(seoTitle(post)), + description: getSeoDescription(post), + openGraph: { + images: [{ url: `https://og.daily.dev/api/posts/${post?.id}` }], + article: { + publishedTime: post?.createdAt, + tags: post?.tags, + }, + }, + }; + + return { + props: { + id: initialData.post.id, + initialData, + seo, + }, + revalidate: 15, + }; + } catch (err) { + const clientError = err as ClientError; + const errors = Object.values(ApiError); + if (errors.includes(clientError?.response?.errors?.[0]?.extensions?.code)) { + const { postId } = clientError.response.errors[0].extensions; + + return { + props: { id: postId || id }, + revalidate: 60, + }; + } + throw err; + } +} From 45893cc2d119063e1482cecc846f8b3468491204 Mon Sep 17 00:00:00 2001 From: capJavert Date: Thu, 28 Nov 2024 11:30:33 +0100 Subject: [PATCH 3/5] feat: fixed sha commit build id --- packages/webapp/next.config.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/webapp/next.config.ts b/packages/webapp/next.config.ts index 635f8d2ca8..79f8282bc2 100644 --- a/packages/webapp/next.config.ts +++ b/packages/webapp/next.config.ts @@ -199,6 +199,9 @@ const nextConfig: NextConfig = { poweredByHeader: false, reactStrictMode: false, productionBrowserSourceMaps: process.env.SOURCE_MAPS === 'true', + generateBuildId: async () => { + return process.env.COMMIT_REF || process.env.VERCEL_GIT_COMMIT_SHA; + }, }), }), }; From 715e716817ee37bc005b28f19414d3216b709dfc Mon Sep 17 00:00:00 2001 From: capJavert Date: Thu, 28 Nov 2024 11:35:52 +0100 Subject: [PATCH 4/5] feat: isr fallback blocking --- packages/webapp/pages/isr/[id]/index.tsx | 2 +- packages/webapp/pages/posts/[id]/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webapp/pages/isr/[id]/index.tsx b/packages/webapp/pages/isr/[id]/index.tsx index be09933f3e..189c725007 100644 --- a/packages/webapp/pages/isr/[id]/index.tsx +++ b/packages/webapp/pages/isr/[id]/index.tsx @@ -49,7 +49,7 @@ const TestPage = ({ id, initialData }: Props): ReactElement => { export default TestPage; export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } export async function getStaticProps({ diff --git a/packages/webapp/pages/posts/[id]/index.tsx b/packages/webapp/pages/posts/[id]/index.tsx index 136088967c..abc33d58c8 100644 --- a/packages/webapp/pages/posts/[id]/index.tsx +++ b/packages/webapp/pages/posts/[id]/index.tsx @@ -182,7 +182,7 @@ PostPage.layoutProps = { export default PostPage; export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } export async function getStaticProps({ From 62b15ddae7cfc4aa895cfc45d9b5b416adad60d5 Mon Sep 17 00:00:00 2001 From: capJavert Date: Thu, 28 Nov 2024 15:19:10 +0100 Subject: [PATCH 5/5] feat: use fallback blocking for all isr --- .../layouts/ProfileLayout/index.tsx | 2 +- .../pages/backoffice/keywords/[value].tsx | 2 +- packages/webapp/pages/isr/[id]/index.tsx | 101 ------------------ packages/webapp/pages/sources/[source].tsx | 2 +- .../webapp/pages/squads/[handle]/[token].tsx | 2 +- .../webapp/pages/squads/[handle]/edit.tsx | 2 +- .../webapp/pages/squads/[handle]/moderate.tsx | 2 +- packages/webapp/pages/tags/[tag].tsx | 2 +- 8 files changed, 7 insertions(+), 108 deletions(-) delete mode 100644 packages/webapp/pages/isr/[id]/index.tsx diff --git a/packages/webapp/components/layouts/ProfileLayout/index.tsx b/packages/webapp/components/layouts/ProfileLayout/index.tsx index d6196de5ec..290cba0dfa 100644 --- a/packages/webapp/components/layouts/ProfileLayout/index.tsx +++ b/packages/webapp/components/layouts/ProfileLayout/index.tsx @@ -128,7 +128,7 @@ interface ProfileParams extends ParsedUrlQuery { } export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } export async function getStaticProps({ diff --git a/packages/webapp/pages/backoffice/keywords/[value].tsx b/packages/webapp/pages/backoffice/keywords/[value].tsx index ebe71f6332..c3ddd6b182 100644 --- a/packages/webapp/pages/backoffice/keywords/[value].tsx +++ b/packages/webapp/pages/backoffice/keywords/[value].tsx @@ -51,7 +51,7 @@ KeywordPage.getLayout = getMainLayout; export default KeywordPage; export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } interface KeywordParams extends ParsedUrlQuery { diff --git a/packages/webapp/pages/isr/[id]/index.tsx b/packages/webapp/pages/isr/[id]/index.tsx deleted file mode 100644 index 189c725007..0000000000 --- a/packages/webapp/pages/isr/[id]/index.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { gqlClient } from '@dailydotdev/shared/src/graphql/common'; -import { - PostData, - POST_BY_ID_STATIC_FIELDS_QUERY, - Post, - PostType, -} from '@dailydotdev/shared/src/graphql/posts'; -import { webappUrl } from '@dailydotdev/shared/src/lib/constants'; -import { ClientError } from 'graphql-request'; -import { - GetStaticPathsResult, - GetStaticPropsContext, - GetStaticPropsResult, -} from 'next'; -import { NextSeoProps } from 'next-seo'; -import { ApiError } from 'next/dist/server/api-utils'; -import { ParsedUrlQuery } from 'querystring'; -import React, { ReactElement } from 'react'; -import { DynamicSeoProps } from '../../../components/common'; -import { getTemplatedTitle } from '../../../components/layouts/utils'; -import { getSeoDescription } from '../../../components/PostSEOSchema'; - -export interface Props extends DynamicSeoProps { - id: string; - initialData?: PostData; -} - -interface PostParams extends ParsedUrlQuery { - id: string; -} - -const seoTitle = (post: Post) => { - if (post?.type === PostType.Share && post?.title === null) { - return `Shared post at ${post?.source?.name}`; - } - - return post?.title; -}; - -const TestPage = ({ id, initialData }: Props): ReactElement => { - return ( -
-

Test post: {id}

- {JSON.stringify(initialData, null, 2)} -
- ); -}; - -export default TestPage; - -export async function getStaticPaths(): Promise { - return { paths: [], fallback: 'blocking' }; -} - -export async function getStaticProps({ - params, -}: GetStaticPropsContext): Promise> { - const { id } = params; - - try { - const initialData = await gqlClient.request( - POST_BY_ID_STATIC_FIELDS_QUERY, - { id }, - ); - - const post = initialData.post as Post; - const seo: NextSeoProps = { - canonical: post?.slug ? `${webappUrl}posts/${post.slug}` : undefined, - title: getTemplatedTitle(seoTitle(post)), - description: getSeoDescription(post), - openGraph: { - images: [{ url: `https://og.daily.dev/api/posts/${post?.id}` }], - article: { - publishedTime: post?.createdAt, - tags: post?.tags, - }, - }, - }; - - return { - props: { - id: initialData.post.id, - initialData, - seo, - }, - revalidate: 15, - }; - } catch (err) { - const clientError = err as ClientError; - const errors = Object.values(ApiError); - if (errors.includes(clientError?.response?.errors?.[0]?.extensions?.code)) { - const { postId } = clientError.response.errors[0].extensions; - - return { - props: { id: postId || id }, - revalidate: 60, - }; - } - throw err; - } -} diff --git a/packages/webapp/pages/sources/[source].tsx b/packages/webapp/pages/sources/[source].tsx index 0d59b7b524..c01b6884bd 100644 --- a/packages/webapp/pages/sources/[source].tsx +++ b/packages/webapp/pages/sources/[source].tsx @@ -255,7 +255,7 @@ SourcePage.layoutProps = { export default SourcePage; export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } interface SourcePageParams extends ParsedUrlQuery { diff --git a/packages/webapp/pages/squads/[handle]/[token].tsx b/packages/webapp/pages/squads/[handle]/[token].tsx index 1f9205b1e3..3ff38d07d9 100644 --- a/packages/webapp/pages/squads/[handle]/[token].tsx +++ b/packages/webapp/pages/squads/[handle]/[token].tsx @@ -300,7 +300,7 @@ SquadReferral.layoutProps = { showSidebar: false }; export default SquadReferral; export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } export async function getStaticProps({ diff --git a/packages/webapp/pages/squads/[handle]/edit.tsx b/packages/webapp/pages/squads/[handle]/edit.tsx index 143f2d22c1..93a3cc75de 100644 --- a/packages/webapp/pages/squads/[handle]/edit.tsx +++ b/packages/webapp/pages/squads/[handle]/edit.tsx @@ -115,7 +115,7 @@ EditSquad.getLayout = getMainLayout; EditSquad.layoutProps = { seo }; export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } interface SquadPageParams extends ParsedUrlQuery { diff --git a/packages/webapp/pages/squads/[handle]/moderate.tsx b/packages/webapp/pages/squads/[handle]/moderate.tsx index 2625dee253..090c8a7dff 100644 --- a/packages/webapp/pages/squads/[handle]/moderate.tsx +++ b/packages/webapp/pages/squads/[handle]/moderate.tsx @@ -76,7 +76,7 @@ export default function ModerateSquadPage({ } export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } interface SquadPageParams extends ParsedUrlQuery { diff --git a/packages/webapp/pages/tags/[tag].tsx b/packages/webapp/pages/tags/[tag].tsx index a5ff317851..928145a108 100644 --- a/packages/webapp/pages/tags/[tag].tsx +++ b/packages/webapp/pages/tags/[tag].tsx @@ -346,7 +346,7 @@ TagPage.layoutProps = mainFeedLayoutProps; export default TagPage; export async function getStaticPaths(): Promise { - return { paths: [], fallback: true }; + return { paths: [], fallback: 'blocking' }; } interface TagPageParams extends ParsedUrlQuery {