Skip to content

Commit 2ce8a2c

Browse files
arbrandesclaude
andcommitted
fix: set document title via Helmet on the template route
Adopt the per-page document title pattern from frontend-base ADR 0015, so apps generated from this template ship with a sensible browser-tab title instead of inheriting the previous app's. Since frontend-base's migration how-to points to this repo for complete examples, including the pattern here also makes it discoverable for new apps. Refs openedx/frontend-base#250. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 1bbac69 commit 2ce8a2c

5 files changed

Lines changed: 80 additions & 17 deletions

File tree

package-lock.json

Lines changed: 28 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656
"url": "https://github.com/openedx/frontend-template-application/issues"
5757
},
5858
"dependencies": {
59-
"@edx/openedx-atlas": "^0.7.0"
59+
"@edx/openedx-atlas": "^0.7.0",
60+
"react-helmet": "^6.1.0"
6061
},
6162
"devDependencies": {
6263
"@edx/browserslist-config": "^1.5.0",

src/Main.test.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { render, waitFor } from '@testing-library/react';
2+
import { BrowserRouter } from 'react-router-dom';
3+
import { IntlProvider } from '@openedx/frontend-base';
4+
import Main from './Main';
5+
6+
describe('Main', () => {
7+
it('sets the document title from the page-title message and site name', async () => {
8+
render(
9+
<IntlProvider locale="en" messages={{}}>
10+
<BrowserRouter>
11+
<Main />
12+
</BrowserRouter>
13+
</IntlProvider>
14+
);
15+
await waitFor(() => {
16+
expect(document.title).toBe('Template | Template Test Site');
17+
});
18+
});
19+
});

src/Main.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
1-
import { CurrentAppProvider } from '@openedx/frontend-base';
1+
import { CurrentAppProvider, getSiteConfig, useIntl } from '@openedx/frontend-base';
2+
import { Helmet } from 'react-helmet';
23
import { Outlet } from 'react-router-dom';
34
import { appId } from './constants';
5+
import messages from './messages';
46

57
import './style.scss';
68

7-
const Main = () => (
8-
<CurrentAppProvider appId={appId}>
9-
<main className="d-flex flex-column flex-grow-1">
10-
<Outlet />
11-
</main>
12-
</CurrentAppProvider>
13-
);
9+
const Main = () => {
10+
const { formatMessage } = useIntl();
11+
return (
12+
<CurrentAppProvider appId={appId}>
13+
<Helmet>
14+
<title>
15+
{formatMessage(messages['template.page.title'], {
16+
siteName: getSiteConfig().siteName,
17+
})}
18+
</title>
19+
</Helmet>
20+
<main className="d-flex flex-column flex-grow-1">
21+
<Outlet />
22+
</main>
23+
</CurrentAppProvider>
24+
);
25+
};
1426

1527
export default Main;

src/messages.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { defineMessages } from '@openedx/frontend-base';
2+
3+
const messages = defineMessages({
4+
'template.page.title': {
5+
id: 'template.page.title',
6+
defaultMessage: 'Template | {siteName}',
7+
description: 'Document title for the template app',
8+
},
9+
});
10+
11+
export default messages;

0 commit comments

Comments
 (0)