diff --git a/client/package-lock.json b/client/package-lock.json
index e88856212c..73bb887172 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -5813,6 +5813,14 @@
"@types/react": "*"
}
},
+ "@types/react-test-renderer": {
+ "version": "17.0.1",
+ "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz",
+ "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
"@types/react-transition-group": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz",
diff --git a/client/package.json b/client/package.json
index 16d35fea33..8690f18e33 100644
--- a/client/package.json
+++ b/client/package.json
@@ -54,6 +54,7 @@
"@loadable/component": "5.15.0",
"@reach/router": "1.3.4",
"@types/react-spinkit": "^3.0.6",
+ "@types/react-test-renderer": "^17.0.1",
"algoliasearch": "4.9.3",
"assert": "2.0.0",
"babel-plugin-preval": "5.0.0",
diff --git a/client/src/components/Footer/index.js b/client/src/components/Footer/index.js
index 32ed7e099a..79117fb496 100644
--- a/client/src/components/Footer/index.js
+++ b/client/src/components/Footer/index.js
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next';
-import Link from '../helpers/Link';
+import Link from '../helpers/link';
import './footer.css';
const propTypes = {
diff --git a/client/src/components/helpers/index.js b/client/src/components/helpers/index.js
index b4647b906a..e37c92f152 100644
--- a/client/src/components/helpers/index.js
+++ b/client/src/components/helpers/index.js
@@ -4,7 +4,7 @@ export { default as SlimWidthRow } from './slim-width-row';
export { default as Loader } from './loader';
export { default as SkeletonSprite } from './skeleton-sprite';
export { default as Spacer } from './spacer';
-export { default as Link } from './Link';
+export { default as Link } from './link';
export { default as CurrentChallengeLink } from './CurrentChallengeLink';
export { default as ImageLoader } from './ImageLoader';
export { default as AvatarRenderer } from './AvatarRenderer';
diff --git a/client/src/components/helpers/Link.test.js b/client/src/components/helpers/link.test.tsx
similarity index 65%
rename from client/src/components/helpers/Link.test.js
rename to client/src/components/helpers/link.test.tsx
index d1e051653a..8815f45ca0 100644
--- a/client/src/components/helpers/Link.test.js
+++ b/client/src/components/helpers/link.test.tsx
@@ -1,14 +1,16 @@
/* global expect */
import React from 'react';
-import renderer from 'react-test-renderer';
+import renderer, { ReactTestRendererJSON } from 'react-test-renderer';
-import Link from './Link';
+import Link from './link';
describe('', () => {
const externalLink = renderer
.create()
- .toJSON();
- const gatsbyLink = renderer.create().toJSON();
+ .toJSON() as ReactTestRendererJSON;
+ const gatsbyLink = renderer
+ .create()
+ .toJSON() as ReactTestRendererJSON;
it('renders to the DOM', () => {
expect(gatsbyLink).toBeTruthy();
diff --git a/client/src/components/helpers/Link.js b/client/src/components/helpers/link.tsx
similarity index 52%
rename from client/src/components/helpers/Link.js
rename to client/src/components/helpers/link.tsx
index f5f9988ae9..0d548ef1b2 100644
--- a/client/src/components/helpers/Link.js
+++ b/client/src/components/helpers/link.tsx
@@ -1,15 +1,27 @@
-import React from 'react';
-import PropTypes from 'prop-types';
+import React, { ReactNode } from 'react';
import { Link as GatsbyLink } from 'gatsby';
-const propTypes = {
- children: PropTypes.any,
- external: PropTypes.bool,
- sameTab: PropTypes.bool,
- to: PropTypes.string.isRequired
-};
+// const propTypes = {
+// children: PropTypes.any,
+// external: PropTypes.bool,
+// sameTab: PropTypes.bool,
+// to: PropTypes.string.isRequired
+// };
-const Link = ({ children, to, external, sameTab, ...other }) => {
+interface LinkProps {
+ children?: ReactNode;
+ external?: boolean;
+ sameTab?: boolean;
+ to: string;
+}
+
+const Link = ({
+ children,
+ to,
+ external,
+ sameTab,
+ ...other
+}: LinkProps): JSX.Element => {
if (!external && /^\/(?!\/)/.test(to)) {
return (
@@ -30,6 +42,5 @@ const Link = ({ children, to, external, sameTab, ...other }) => {
);
};
-Link.propTypes = propTypes;
export default Link;
diff --git a/client/src/components/profile/Profile.js b/client/src/components/profile/Profile.js
index 25845b5046..76f22cdda1 100644
--- a/client/src/components/profile/Profile.js
+++ b/client/src/components/profile/Profile.js
@@ -2,7 +2,7 @@ import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { Grid, Row } from '@freecodecamp/react-bootstrap';
import Helmet from 'react-helmet';
-import Link from '../helpers/Link';
+import Link from '../helpers/link';
import { useTranslation } from 'react-i18next';
import { CurrentChallengeLink, FullWidthRow, Spacer } from '../helpers';
diff --git a/client/src/components/profile/components/Camper.js b/client/src/components/profile/components/Camper.js
index dbcb9c55bc..cb267540d0 100644
--- a/client/src/components/profile/components/Camper.js
+++ b/client/src/components/profile/components/Camper.js
@@ -11,7 +11,7 @@ import { useTranslation } from 'react-i18next';
import { AvatarRenderer } from '../../helpers';
import SocialIcons from './SocialIcons';
-import Link from '../../helpers/Link';
+import Link from '../../helpers/link';
import './camper.css';