From a1a4b0d35e6f6b99bde4a7fb660f5fb405730503 Mon Sep 17 00:00:00 2001 From: Przemek Wiech Date: Wed, 3 Nov 2021 14:19:26 +0100 Subject: [PATCH] Refactored `WikiTreeLoginMenuComponent` from class-based to functional --- src/menu/wikitree_menu.tsx | 146 ++++++++++++------------------------- 1 file changed, 45 insertions(+), 101 deletions(-) diff --git a/src/menu/wikitree_menu.tsx b/src/menu/wikitree_menu.tsx index d2ba63d..796d6a4 100644 --- a/src/menu/wikitree_menu.tsx +++ b/src/menu/wikitree_menu.tsx @@ -2,11 +2,11 @@ import * as queryString from 'query-string'; import wikitreeLogo from './wikitree.png'; import {analyticsEvent} from '../util/analytics'; import {Button, Form, Header, Input, Modal} from 'semantic-ui-react'; -import {Component, createRef, useEffect, useRef, useState} from 'react'; import {FormattedMessage, injectIntl, WrappedComponentProps} from 'react-intl'; import {getLoggedInUserName} from '../datasource/wikitree'; import {MenuItem, MenuType} from './menu_item'; import {RouteComponentProps} from 'react-router-dom'; +import {useEffect, useRef, useState} from 'react'; enum WikiTreeLoginState { UNKNOWN, @@ -152,119 +152,63 @@ export function WikiTreeMenu(props: RouteComponentProps & Props) { ); } -interface LoginState { - wikiTreeLoginState: WikiTreeLoginState; - wikiTreeLoginUsername?: string; -} - /** Displays and handles the "Log in to WikiTree" menu. */ -class WikiTreeLoginMenuComponent extends Component< - RouteComponentProps & WrappedComponentProps & Props, - LoginState -> { - state: LoginState = { - wikiTreeLoginState: WikiTreeLoginState.UNKNOWN, - }; - - wikiTreeLoginFormRef: React.RefObject = createRef(); - wikiTreeReturnUrlRef: React.RefObject = createRef(); +function WikiTreeLoginMenuComponent(props: WrappedComponentProps & Props) { + const formRef = useRef(null); + const returnUrlRef = useRef(null); /** * Redirect to the WikiTree Apps login page with a return URL pointing to * Topola Viewer hosted on apps.wikitree.com. */ - private wikiTreeLogin() { + function login() { const wikiTreeTopolaUrl = 'https://apps.wikitree.com/apps/wiech13/topola-viewer'; // Append '&' because the login page appends '?authcode=...' to this URL. // TODO: remove ?authcode if it is in the current URL. const returnUrl = `${wikiTreeTopolaUrl}${window.location.hash}&`; - this.wikiTreeReturnUrlRef.current!.value = returnUrl; - this.wikiTreeLoginFormRef.current!.submit(); + returnUrlRef.current!.value = returnUrl; + formRef.current!.submit(); } - private checkWikiTreeLoginState() { - const wikiTreeLoginUsername = getLoggedInUserName(); - const wikiTreeLoginState = wikiTreeLoginUsername - ? WikiTreeLoginState.LOGGED_IN - : WikiTreeLoginState.NOT_LOGGED_IN; - if (this.state.wikiTreeLoginState !== wikiTreeLoginState) { - this.setState( - Object.assign({}, this.state, { - wikiTreeLoginState, - wikiTreeLoginUsername, - }), - ); - } - } - - componentDidMount() { - this.checkWikiTreeLoginState(); - } - - componentDidUpdate() { - this.checkWikiTreeLoginState(); - } - - render() { - switch (this.state.wikiTreeLoginState) { - case WikiTreeLoginState.NOT_LOGGED_IN: - return ( - <> - this.wikiTreeLogin()} - > - WikiTree logo - - -
- - -
- - ); - - case WikiTreeLoginState.LOGGED_IN: - const tooltip = this.state.wikiTreeLoginUsername - ? this.props.intl.formatMessage( - { - id: 'menu.wikitree_popup_username', - defaultMessage: 'Logged in to WikiTree as {username}', - }, - {username: this.state.wikiTreeLoginUsername}, - ) - : this.props.intl.formatMessage({ - id: 'menu.wikitree_popup', - defaultMessage: 'Logged in to WikiTree', - }); - return ( - - WikiTree logo - - - ); - } - return null; + const username = getLoggedInUserName(); + if (!username) { + return ( + <> + + WikiTree logo + + +
+ + +
+ + ); } + const tooltip = props.intl.formatMessage( + { + id: 'menu.wikitree_popup_username', + defaultMessage: 'Logged in to WikiTree as {username}', + }, + {username}, + ); + return ( + + WikiTree logo + + + ); } export const WikiTreeLoginMenu = injectIntl(WikiTreeLoginMenuComponent);