diff --git a/packages/react-email/src/app/preview/[slug]/page.tsx b/packages/react-email/src/app/preview/[...slug]/page.tsx similarity index 83% rename from packages/react-email/src/app/preview/[slug]/page.tsx rename to packages/react-email/src/app/preview/[...slug]/page.tsx index dc1fd4e317..0d4c0c8667 100644 --- a/packages/react-email/src/app/preview/[slug]/page.tsx +++ b/packages/react-email/src/app/preview/[...slug]/page.tsx @@ -8,13 +8,13 @@ import Preview from './preview'; export const dynamicParams = true; export interface PreviewParams { - slug: string; + slug: string[]; } export default async function Page({ params }: { params: PreviewParams }) { - // will come in here as a relative path to the email - // ex: authentication/verify-password.tsx but encoded like authentication%20verify-password.tsx - const slug = decodeURIComponent(params.slug); + // will come in here as segments of a relative path to the email + // ex: ['authentication', 'verify-password.tsx'] + const slug = params.slug.join('/'); const emailsDirMetadata = await getEmailsDirectoryMetadata( emailsDirectoryAbsolutePath, ); @@ -47,5 +47,5 @@ export default async function Page({ params }: { params: PreviewParams }) { } export function generateMetadata({ params }: { params: PreviewParams }) { - return { title: `${decodeURIComponent(params.slug)} — React Email` }; + return { title: `${params.slug.join('/')} — React Email` }; } diff --git a/packages/react-email/src/app/preview/[slug]/preview.tsx b/packages/react-email/src/app/preview/[...slug]/preview.tsx similarity index 100% rename from packages/react-email/src/app/preview/[slug]/preview.tsx rename to packages/react-email/src/app/preview/[...slug]/preview.tsx diff --git a/packages/react-email/src/app/preview/[slug]/rendering-error.tsx b/packages/react-email/src/app/preview/[...slug]/rendering-error.tsx similarity index 100% rename from packages/react-email/src/app/preview/[slug]/rendering-error.tsx rename to packages/react-email/src/app/preview/[...slug]/rendering-error.tsx diff --git a/packages/react-email/src/cli/commands/build.ts b/packages/react-email/src/cli/commands/build.ts index d3b95b1b9b..c2f7748915 100644 --- a/packages/react-email/src/cli/commands/build.ts +++ b/packages/react-email/src/cli/commands/build.ts @@ -104,9 +104,15 @@ const getEmailSlugsFromEmailDirectory = ( .replace(emailsDirectoryAbsolutePath, '') .trim(); - const slugs = [] as string[]; + const slugs = [] as Array[]; emailDirectory.emailFilenames.forEach((filename) => - slugs.push(path.join(directoryPathRelativeToEmailsDirectory, filename)), + slugs.push( + path + .join(directoryPathRelativeToEmailsDirectory, filename) + .split(path.sep) + // sometimes it gets empty segments due to trailing slashes + .filter((segment) => segment.length > 0), + ), ); emailDirectory.subDirectories.forEach((directory) => { slugs.push( @@ -136,7 +142,7 @@ const forceSSGForEmailPreviews = async ( ).map((slug) => ({ slug })); await fs.promises.appendFile( - path.resolve(builtPreviewAppPath, './src/app/preview/[slug]/page.tsx'), + path.resolve(builtPreviewAppPath, './src/app/preview/[...slug]/page.tsx'), ` export async function generateStaticParams() { diff --git a/packages/react-email/src/components/sidebar/sidebar-directory-children.tsx b/packages/react-email/src/components/sidebar/sidebar-directory-children.tsx index 2465a78835..9364b5c89d 100644 --- a/packages/react-email/src/components/sidebar/sidebar-directory-children.tsx +++ b/packages/react-email/src/components/sidebar/sidebar-directory-children.tsx @@ -67,7 +67,7 @@ export const SidebarDirectoryChildren = (props: { return (