From ea4eeee49ea09f90d51e3dc3ff26524543745545 Mon Sep 17 00:00:00 2001 From: Akshat Garg <60404253+akshatgarg12@users.noreply.github.com> Date: Fri, 25 Jun 2021 21:13:04 +0530 Subject: [PATCH] feat(client): ts-migrate header components (#42287) --- client/src/components/Header/Header.test.js | 6 +-- .../Header/components/{Login.js => Login.tsx} | 37 +++++++------ .../Header/components/MenuButton.js | 38 -------------- .../{AuthOrProfile.js => auth-or-profile.tsx} | 23 ++++---- .../Header/components/menu-button.tsx | 44 ++++++++++++++++ .../components/{NavLinks.js => nav-links.tsx} | 52 +++++++++++-------- .../components/{NavLogo.js => nav-logo.tsx} | 4 +- .../{universalNav.css => universal-nav.css} | 0 .../{UniversalNav.js => universal-nav.tsx} | 42 ++++++++------- .../{UserState.js => user-state.tsx} | 28 +++++----- .../components/Header/{index.js => index.tsx} | 43 +++++++++------ 11 files changed, 175 insertions(+), 142 deletions(-) rename client/src/components/Header/components/{Login.js => Login.tsx} (64%) delete mode 100644 client/src/components/Header/components/MenuButton.js rename client/src/components/Header/components/{AuthOrProfile.js => auth-or-profile.tsx} (67%) create mode 100644 client/src/components/Header/components/menu-button.tsx rename client/src/components/Header/components/{NavLinks.js => nav-links.tsx} (81%) rename client/src/components/Header/components/{NavLogo.js => nav-logo.tsx} (82%) rename client/src/components/Header/components/{universalNav.css => universal-nav.css} (100%) rename client/src/components/Header/components/{UniversalNav.js => universal-nav.tsx} (66%) rename client/src/components/Header/components/{UserState.js => user-state.tsx} (69%) rename client/src/components/Header/{index.js => index.tsx} (58%) diff --git a/client/src/components/Header/Header.test.js b/client/src/components/Header/Header.test.js index e93717a9f1..7311a3f992 100644 --- a/client/src/components/Header/Header.test.js +++ b/client/src/components/Header/Header.test.js @@ -1,9 +1,9 @@ import React from 'react'; import ShallowRenderer from 'react-test-renderer/shallow'; -import { UniversalNav } from './components/UniversalNav'; -import { NavLinks } from './components/NavLinks'; -import AuthOrProfile from './components/AuthOrProfile'; +import { UniversalNav } from './components/universal-nav'; +import { NavLinks } from './components/nav-links'; +import AuthOrProfile from './components/auth-or-profile'; import envData from '../../../../config/env.json'; diff --git a/client/src/components/Header/components/Login.js b/client/src/components/Header/components/Login.tsx similarity index 64% rename from client/src/components/Header/components/Login.js rename to client/src/components/Header/components/Login.tsx index 4e92238532..6045ce46cb 100644 --- a/client/src/components/Header/components/Login.js +++ b/client/src/components/Header/components/Login.tsx @@ -1,5 +1,9 @@ +/* eslint-disable react/prop-types */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable import/no-unresolved */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import React from 'react'; -import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { Button } from '@freecodecamp/react-bootstrap'; @@ -16,14 +20,21 @@ const mapStateToProps = createSelector(isSignedInSelector, isSignedIn => ({ isSignedIn })); -function Login(props) { +export interface LoginProps { + block?: boolean; + children?: unknown; + 'data-test-label'?: string; + isSignedIn?: boolean; +} + +const Login = ({ + block, + children, + 'data-test-label': dataTestLabel, + isSignedIn +}: LoginProps): JSX.Element => { const { t } = useTranslation(); - const { - block, - 'data-test-label': dataTestLabel, - children, - isSignedIn - } = props; + const href = isSignedIn ? `${homeLocation}/learn` : `${apiLocation}/signin`; return ( - - - - - ); -}; - -MenuButton.displayName = 'MenuButton'; -MenuButton.propTypes = { - className: PropTypes.string, - displayMenu: PropTypes.bool.isRequired, - innerRef: PropTypes.object, - onClick: PropTypes.func.isRequired, - user: PropTypes.object -}; - -export default MenuButton; diff --git a/client/src/components/Header/components/AuthOrProfile.js b/client/src/components/Header/components/auth-or-profile.tsx similarity index 67% rename from client/src/components/Header/components/AuthOrProfile.js rename to client/src/components/Header/components/auth-or-profile.tsx index 71815125a3..29efaf69ab 100644 --- a/client/src/components/Header/components/AuthOrProfile.js +++ b/client/src/components/Header/components/auth-or-profile.tsx @@ -1,16 +1,18 @@ -/* eslint-disable react/sort-prop-types */ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +// @ts-nocheck import React from 'react'; import { Link, borderColorPicker, AvatarRenderer } from '../../helpers'; -import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; +import Login from './Login'; -import Login from '../components/Login'; - -const propTypes = { - user: PropTypes.object -}; - -export function AuthOrProfile({ user }) { +export interface AuthOrProfileProps { + user?: Object; +} +const AuthOrProfile = ({ user }: AuthOrProfileProps): JSX.Element => { const { t } = useTranslation(); const isUserDonating = user && user.isDonating; const isUserSignedIn = user && user.username; @@ -39,8 +41,7 @@ export function AuthOrProfile({ user }) { ); } -} +}; -AuthOrProfile.propTypes = propTypes; AuthOrProfile.displayName = 'AuthOrProfile'; export default AuthOrProfile; diff --git a/client/src/components/Header/components/menu-button.tsx b/client/src/components/Header/components/menu-button.tsx new file mode 100644 index 0000000000..8dbbef13fa --- /dev/null +++ b/client/src/components/Header/components/menu-button.tsx @@ -0,0 +1,44 @@ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable react/prop-types */ +import React, { RefObject } from 'react'; +import { useTranslation } from 'react-i18next'; +import AuthOrProfile from './auth-or-profile'; + +export interface MenuButtonProps { + className?: string; + displayMenu?: boolean; + innerRef?: RefObject; + onClick?: React.MouseEventHandler | undefined; + user?: Object; +} + +const MenuButton = ({ + displayMenu, + innerRef, + onClick, + user +}: MenuButtonProps): JSX.Element => { + const { t } = useTranslation(); + + return ( + <> + + + + + + ); +}; + +MenuButton.displayName = 'MenuButton'; + +export default MenuButton; diff --git a/client/src/components/Header/components/NavLinks.js b/client/src/components/Header/components/nav-links.tsx similarity index 81% rename from client/src/components/Header/components/NavLinks.js rename to client/src/components/Header/components/nav-links.tsx index eae270cc9c..550f0f1d36 100644 --- a/client/src/components/Header/components/NavLinks.js +++ b/client/src/components/Header/components/nav-links.tsx @@ -1,6 +1,15 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-unsafe-return */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable react/prop-types */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +// @ts-nocheck import React, { Component, Fragment } from 'react'; import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { @@ -15,33 +24,33 @@ import { updateUserFlag } from '../../../redux/settings'; import envData from '../../../../../config/env.json'; import createLanguageRedirect from '../../createLanguageRedirect'; import createExternalRedirect from '../../createExternalRedirects'; - -const { clientLocale, radioLocation, apiLocation } = envData; - -const { +import { availableLangs, i18nextCodes, langDisplayNames -} = require('../../../../../config/i18n/all-langs'); +} from '../../../../../config/i18n/all-langs'; + +const { clientLocale, radioLocation, apiLocation } = envData; const locales = availableLangs.client; -const propTypes = { - displayMenu: PropTypes.bool, - fetchState: PropTypes.shape({ pending: PropTypes.bool }), - i18n: PropTypes.object, - t: PropTypes.func, - toggleDisplayMenu: PropTypes.func, - toggleNightMode: PropTypes.func.isRequired, - user: PropTypes.object -}; +export interface NavLinksProps { + displayMenu?: boolean; + fetchState?: { pending: boolean }; + i18n: Object; + t: (x: any) => any; + toggleDisplayMenu?: React.MouseEventHandler; + toggleNightMode: (x: any) => any; + user?: Record; +} const mapDispatchToProps = { - toggleNightMode: theme => updateUserFlag({ theme }) + toggleNightMode: (theme: unknown) => updateUserFlag({ theme }) }; -export class NavLinks extends Component { - toggleTheme(currentTheme = 'default', toggleNightMode) { +export class NavLinks extends Component { + static displayName: string; + toggleTheme(currentTheme = 'default', toggleNightMode: any) { toggleNightMode(currentTheme === 'night' ? 'default' : 'night'); } @@ -54,7 +63,7 @@ export class NavLinks extends Component { toggleDisplayMenu, toggleNightMode, user: { isDonating = false, username, theme } - } = this.props; + }: NavLinksProps = this.props; const { pending } = fetchState; return pending ? ( @@ -141,7 +150,7 @@ export class NavLinks extends Component { } disabled={!username} key='theme' - onClick={() => this.toggleTheme(theme, toggleNightMode)} + onClick={() => this.toggleTheme(String(theme), toggleNightMode)} > {username ? ( <> @@ -165,7 +174,7 @@ export class NavLinks extends Component {