diff --git a/package-lock.json b/package-lock.json index 18d0d747..19e1b664 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "packages/*" ], "dependencies": { - "@edx/openedx-atlas": "^0.7.0" + "@edx/openedx-atlas": "^0.7.0", + "react-helmet": "^6.1.0" }, "devDependencies": { "@edx/browserslist-config": "^1.5.0", @@ -14579,7 +14580,6 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", - "peer": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -15261,7 +15261,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -16978,7 +16977,6 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -17010,8 +17008,7 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -17680,8 +17677,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react-focus-lock": { "version": "2.13.7", @@ -17734,6 +17730,21 @@ } } }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, "node_modules/react-imask": { "version": "7.6.1", "resolved": "https://registry.npmjs.org/react-imask/-/react-imask-7.6.1.tgz", @@ -18026,6 +18037,15 @@ "react-dom": ">=16.8" } }, + "node_modules/react-side-effect": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", diff --git a/package.json b/package.json index 3bd8cda6..7ad71f64 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,8 @@ "url": "https://github.com/openedx/frontend-template-application/issues" }, "dependencies": { - "@edx/openedx-atlas": "^0.7.0" + "@edx/openedx-atlas": "^0.7.0", + "react-helmet": "^6.1.0" }, "devDependencies": { "@edx/browserslist-config": "^1.5.0", diff --git a/src/Main.test.tsx b/src/Main.test.tsx new file mode 100644 index 00000000..04fcf6aa --- /dev/null +++ b/src/Main.test.tsx @@ -0,0 +1,19 @@ +import { render, waitFor } from '@testing-library/react'; +import { BrowserRouter } from 'react-router-dom'; +import { IntlProvider } from '@openedx/frontend-base'; +import Main from './Main'; + +describe('Main', () => { + it('sets the document title from the page-title message and site name', async () => { + render( + + +
+ + + ); + await waitFor(() => { + expect(document.title).toBe('Template | Template Test Site'); + }); + }); +}); diff --git a/src/Main.tsx b/src/Main.tsx index 98e124db..fee014af 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -1,15 +1,27 @@ -import { CurrentAppProvider } from '@openedx/frontend-base'; +import { CurrentAppProvider, getSiteConfig, useIntl } from '@openedx/frontend-base'; +import { Helmet } from 'react-helmet'; import { Outlet } from 'react-router-dom'; import { appId } from './constants'; +import messages from './messages'; import './style.scss'; -const Main = () => ( - -
- -
-
-); +const Main = () => { + const { formatMessage } = useIntl(); + return ( + + + + {formatMessage(messages['template.page.title'], { + siteName: getSiteConfig().siteName, + })} + + +
+ +
+
+ ); +}; export default Main; diff --git a/src/messages.ts b/src/messages.ts new file mode 100644 index 00000000..91288543 --- /dev/null +++ b/src/messages.ts @@ -0,0 +1,11 @@ +import { defineMessages } from '@openedx/frontend-base'; + +const messages = defineMessages({ + 'template.page.title': { + id: 'template.page.title', + defaultMessage: 'Template | {siteName}', + description: 'Document title for the template app', + }, +}); + +export default messages;