Skip to content

Commit ac04dfe

Browse files
authored
feat(react-email): Non-encoded email slugs (#1203)
1 parent 80b3c4f commit ac04dfe

File tree

5 files changed

+15
-9
lines changed

5 files changed

+15
-9
lines changed

packages/react-email/src/app/preview/[slug]/page.tsx renamed to packages/react-email/src/app/preview/[...slug]/page.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import Preview from './preview';
88
export const dynamicParams = true;
99

1010
export interface PreviewParams {
11-
slug: string;
11+
slug: string[];
1212
}
1313

1414
export default async function Page({ params }: { params: PreviewParams }) {
15-
// will come in here as a relative path to the email
16-
// ex: authentication/verify-password.tsx but encoded like authentication%20verify-password.tsx
17-
const slug = decodeURIComponent(params.slug);
15+
// will come in here as segments of a relative path to the email
16+
// ex: ['authentication', 'verify-password.tsx']
17+
const slug = params.slug.join('/');
1818
const emailsDirMetadata = await getEmailsDirectoryMetadata(
1919
emailsDirectoryAbsolutePath,
2020
);
@@ -47,5 +47,5 @@ export default async function Page({ params }: { params: PreviewParams }) {
4747
}
4848

4949
export function generateMetadata({ params }: { params: PreviewParams }) {
50-
return { title: `${decodeURIComponent(params.slug)} — React Email` };
50+
return { title: `${params.slug.join('/')} — React Email` };
5151
}

packages/react-email/src/cli/commands/build.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,15 @@ const getEmailSlugsFromEmailDirectory = (
104104
.replace(emailsDirectoryAbsolutePath, '')
105105
.trim();
106106

107-
const slugs = [] as string[];
107+
const slugs = [] as Array<string>[];
108108
emailDirectory.emailFilenames.forEach((filename) =>
109-
slugs.push(path.join(directoryPathRelativeToEmailsDirectory, filename)),
109+
slugs.push(
110+
path
111+
.join(directoryPathRelativeToEmailsDirectory, filename)
112+
.split(path.sep)
113+
// sometimes it gets empty segments due to trailing slashes
114+
.filter((segment) => segment.length > 0),
115+
),
110116
);
111117
emailDirectory.subDirectories.forEach((directory) => {
112118
slugs.push(
@@ -136,7 +142,7 @@ const forceSSGForEmailPreviews = async (
136142
).map((slug) => ({ slug }));
137143

138144
await fs.promises.appendFile(
139-
path.resolve(builtPreviewAppPath, './src/app/preview/[slug]/page.tsx'),
145+
path.resolve(builtPreviewAppPath, './src/app/preview/[...slug]/page.tsx'),
140146
`
141147
142148
export async function generateStaticParams() {

packages/react-email/src/components/sidebar/sidebar-directory-children.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export const SidebarDirectoryChildren = (props: {
6767
return (
6868
<Link
6969
href={{
70-
pathname: `/preview/${encodeURIComponent(emailSlug)}`,
70+
pathname: `/preview/${emailSlug}`,
7171
search: searchParams.toString(),
7272
}}
7373
key={emailSlug}

0 commit comments

Comments
 (0)