Skip to content

Commit c0873df

Browse files
fix: render favicon and siteName in title (#668)
* fix: render favicon and siteName in title * fix: remove translation files
1 parent 12fbe7e commit c0873df

File tree

6 files changed

+85
-1
lines changed

6 files changed

+85
-1
lines changed

package-lock.json

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

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"raw-loader": "4.0.2",
5252
"react": "17.0.2",
5353
"react-dom": "17.0.2",
54+
"react-helmet": "6.1.0",
5455
"react-redux": "7.2.9",
5556
"react-router": "6.18.0",
5657
"react-router-dom": "6.18.0",

src/components/Head/Head.jsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React from 'react';
2+
3+
import { Helmet } from 'react-helmet';
4+
5+
import { getConfig } from '@edx/frontend-platform';
6+
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
7+
8+
import messages from './messages';
9+
10+
const Head = ({ intl }) => (
11+
<Helmet>
12+
<title>
13+
{intl.formatMessage(messages['discussions.page.title'], { siteName: getConfig().SITE_NAME })}
14+
</title>
15+
<link rel="shortcut icon" href={getConfig().FAVICON_URL} type="image/x-icon" />
16+
</Helmet>
17+
);
18+
19+
Head.propTypes = {
20+
intl: intlShape.isRequired,
21+
};
22+
23+
export default injectIntl(Head);

src/components/Head/Head.test.jsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React from 'react';
2+
3+
import { render } from '@testing-library/react';
4+
import { Helmet } from 'react-helmet';
5+
6+
import { getConfig } from '@edx/frontend-platform';
7+
import { IntlProvider } from '@edx/frontend-platform/i18n';
8+
9+
import Head from './Head';
10+
11+
describe('Head', () => {
12+
const props = {};
13+
it('should match render title tag and favicon with the site configuration values', () => {
14+
render(<IntlProvider locale="en"><Head {...props} /></IntlProvider>);
15+
const helmet = Helmet.peek();
16+
expect(helmet.title).toEqual(`Discussions | ${getConfig().SITE_NAME}`);
17+
expect(helmet.linkTags[0].rel).toEqual('shortcut icon');
18+
expect(helmet.linkTags[0].href).toEqual(getConfig().FAVICON_URL);
19+
});
20+
});

src/components/Head/messages.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { defineMessages } from '@edx/frontend-platform/i18n';
2+
3+
const messages = defineMessages({
4+
'discussions.page.title': {
5+
id: 'discussions.page.title',
6+
defaultMessage: 'Discussions | {siteName}',
7+
description: 'Title tag',
8+
},
9+
});
10+
11+
export default messages;

src/index.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@ import {
1010
} from '@edx/frontend-platform';
1111
import { AppProvider, ErrorPage } from '@edx/frontend-platform/react';
1212

13+
import Head from './components/Head/Head';
1314
import { DiscussionsHome } from './discussions';
1415
import messages from './i18n';
1516
import store from './store';
1617

17-
import './assets/favicon.ico';
1818
import './index.scss';
1919

2020
subscribe(APP_READY, () => {
2121
ReactDOM.render(
2222
<AppProvider store={store}>
23+
<Head />
2324
<DiscussionsHome />
2425
</AppProvider>,
2526
document.getElementById('root'),

0 commit comments

Comments
 (0)