Skip to content

Commit 1d35e37

Browse files
authored
fix(preview-server): file names and extensions not being used in download (#2684)
1 parent b5b5663 commit 1d35e37

File tree

5 files changed

+23
-6
lines changed

5 files changed

+23
-6
lines changed

.changeset/itchy-wasps-read.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@react-email/preview-server": patch
3+
---
4+
5+
fix file names and extensions not being used in download

packages/preview-server/src/actions/render-email-by-path.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ export interface RenderedEmailMetadata {
2727
markupWithReferences?: string;
2828
plainText: string;
2929
reactMarkup: string;
30+
31+
basename: string;
32+
extname: string;
3033
}
3134

3235
export type EmailRenderingResult =
@@ -130,6 +133,9 @@ export const renderEmailByPath = async (
130133
markupWithReferences: markupWithReferences.replaceAll('\0', ''),
131134
plainText,
132135
reactMarkup,
136+
137+
basename: path.basename(emailPath, path.extname(emailPath)),
138+
extname: path.extname(emailPath).slice(1),
133139
};
134140

135141
cache.set(emailPath, renderingResult);

packages/preview-server/src/app/preview/[...slug]/preview.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const Preview = ({ emailTitle, className, ...props }: PreviewProps) => {
3636

3737
const isDarkModeEnabled = searchParams.get('dark') !== null;
3838
const activeView = searchParams.get('view') ?? 'preview';
39-
const activeLang = searchParams.get('lang') ?? 'jsx';
39+
const activeLang = searchParams.get('lang') ?? 'tsx';
4040

4141
const handleDarkModeChange = (enabled: boolean) => {
4242
const params = new URLSearchParams(searchParams);
@@ -207,17 +207,20 @@ const Preview = ({ emailTitle, className, ...props }: PreviewProps) => {
207207
<Tooltip.Provider>
208208
<CodeContainer
209209
activeLang={activeLang}
210+
basename={renderedEmailMetadata.basename}
210211
markups={[
211212
{
212-
language: 'jsx',
213+
language: 'tsx',
214+
extension: renderedEmailMetadata.extname,
213215
content: renderedEmailMetadata.reactMarkup,
214216
},
215217
{
216-
language: 'markup',
218+
language: 'html',
217219
content: renderedEmailMetadata.prettyMarkup,
218220
},
219221
{
220222
language: 'markdown',
223+
extension: 'md',
221224
content: renderedEmailMetadata.plainText,
222225
},
223226
]}

packages/preview-server/src/components/code-container.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,20 @@ import { Tooltip } from './tooltip';
1313

1414
interface CodeContainerProps {
1515
markups: MarkupProps[];
16+
basename: string;
1617
activeLang: string;
1718
setActiveLang: (lang: string) => void;
1819
}
1920

2021
interface MarkupProps {
2122
language: Language;
23+
extension?: string;
2224
content: string;
2325
}
2426

2527
export const CodeContainer: React.FC<Readonly<CodeContainerProps>> = ({
2628
markups,
29+
basename: filename,
2730
activeLang,
2831
setActiveLang,
2932
}) => {
@@ -83,7 +86,7 @@ export const CodeContainer: React.FC<Readonly<CodeContainerProps>> = ({
8386
<CopyToClipboardButton content={activeMarkup.content} />
8487
<DownloadButton
8588
content={activeMarkup.content}
86-
filename={`email.${activeMarkup.language}`}
89+
filename={`${filename}.${activeMarkup.extension || activeMarkup.language}`}
8790
/>
8891
</div>
8992
<div className="h-[calc(100%-2.25rem)]">

packages/preview-server/src/utils/language-map.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const languageMap = {
2-
jsx: 'React',
3-
markup: 'HTML',
2+
tsx: 'React',
3+
html: 'HTML',
44
markdown: 'Plain Text',
55
};
66

0 commit comments

Comments
 (0)