Merge pull request #1154 from sharetribe/fix-topbar-inbox-hydrate-bug

Rehydrate bug: existing DOM elements were populated incorrectly
This commit is contained in:
Vesa Luusua 2019-08-19 13:24:56 +03:00 committed by GitHub
commit 10d25041b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 5 deletions

View file

@ -14,6 +14,8 @@ way to update this template, but currently, we follow a pattern:
## Upcoming version 2019-XX-XX ## Upcoming version 2019-XX-XX
- [fix] Rehydrate bug: existing DOM elements were populated incorrectly
[#1154](https://github.com/sharetribe/flex-template-web/pull/1154)
- [fix] Don't send personal id number or business profile to Stripe API when creating a Stripe - [fix] Don't send personal id number or business profile to Stripe API when creating a Stripe
customer if they are not required in `stripe-config.js`. This happened e.g. if someone filled the customer if they are not required in `stripe-config.js`. This happened e.g. if someone filled the
form after selecting the US and then before sending changed the country to Finland. form after selecting the US and then before sending changed the country to Finland.

View file

@ -1,4 +1,4 @@
import React from 'react'; import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { FormattedMessage, intlShape } from 'react-intl'; import { FormattedMessage, intlShape } from 'react-intl';
import classNames from 'classnames'; import classNames from 'classnames';
@ -32,6 +32,14 @@ const TopbarDesktop = props => {
onSearchSubmit, onSearchSubmit,
initialSearchFormValues, initialSearchFormValues,
} = props; } = props;
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
}, []);
const authenticatedOnClientSide = mounted && isAuthenticated;
const isAuthenticatedOrJustHydrated = isAuthenticated || !mounted;
const classes = classNames(rootClassName || css.root, className); const classes = classNames(rootClassName || css.root, className);
@ -47,7 +55,7 @@ const TopbarDesktop = props => {
const notificationDot = notificationCount > 0 ? <div className={css.notificationDot} /> : null; const notificationDot = notificationCount > 0 ? <div className={css.notificationDot} /> : null;
const inboxLink = isAuthenticated ? ( const inboxLink = authenticatedOnClientSide ? (
<NamedLink <NamedLink
className={css.inboxLink} className={css.inboxLink}
name="InboxPage" name="InboxPage"
@ -66,7 +74,7 @@ const TopbarDesktop = props => {
return currentPage === page || isAccountSettingsPage ? css.currentPage : null; return currentPage === page || isAccountSettingsPage ? css.currentPage : null;
}; };
const profileMenu = isAuthenticated ? ( const profileMenu = authenticatedOnClientSide ? (
<Menu> <Menu>
<MenuLabel className={css.profileMenuLabel} isOpenClassName={css.profileMenuIsOpen}> <MenuLabel className={css.profileMenuLabel} isOpenClassName={css.profileMenuIsOpen}>
<Avatar className={css.avatar} user={currentUser} disableProfileLink /> <Avatar className={css.avatar} user={currentUser} disableProfileLink />
@ -109,7 +117,7 @@ const TopbarDesktop = props => {
</Menu> </Menu>
) : null; ) : null;
const signupLink = isAuthenticated ? null : ( const signupLink = isAuthenticatedOrJustHydrated ? null : (
<NamedLink name="SignupPage" className={css.signupLink}> <NamedLink name="SignupPage" className={css.signupLink}>
<span className={css.signup}> <span className={css.signup}>
<FormattedMessage id="TopbarDesktop.signup" /> <FormattedMessage id="TopbarDesktop.signup" />
@ -117,7 +125,7 @@ const TopbarDesktop = props => {
</NamedLink> </NamedLink>
); );
const loginLink = isAuthenticated ? null : ( const loginLink = isAuthenticatedOrJustHydrated ? null : (
<NamedLink name="LoginPage" className={css.loginLink}> <NamedLink name="LoginPage" className={css.loginLink}>
<span className={css.login}> <span className={css.login}>
<FormattedMessage id="TopbarDesktop.login" /> <FormattedMessage id="TopbarDesktop.login" />