Delay app loading until persisted state loaded

Summary: This diff fixes the issue when some Flipper persisted state is required just after startup, but is loaded too late. This is easy to notice with a flag indicating whether Welcome window should be shown. Even if the flag is disabled, Flipper will still show the window on the next launch because it loads the state later than needed.

Differential Revision: D29426004

fbshipit-source-id: 011b5890034a6e254ce9ab834f098f1a2ab62a70
This commit is contained in:
Anton Nikolaev
2021-06-28 04:00:51 -07:00
committed by Facebook GitHub Bot
parent 4464fe6bd3
commit bbf1aeaa55

View File

@@ -15,7 +15,7 @@ import GK from './fb-stubs/GK';
import {init as initLogger} from './fb-stubs/Logger'; import {init as initLogger} from './fb-stubs/Logger';
import {SandyApp} from './sandy-chrome/SandyApp'; import {SandyApp} from './sandy-chrome/SandyApp';
import setupPrefetcher from './fb-stubs/Prefetcher'; import setupPrefetcher from './fb-stubs/Prefetcher';
import {persistStore} from 'redux-persist'; import {Persistor, persistStore} from 'redux-persist';
import {Store} from './reducers/index'; import {Store} from './reducers/index';
import dispatcher from './dispatcher/index'; import dispatcher from './dispatcher/index';
import TooltipProvider from './ui/components/TooltipProvider'; import TooltipProvider from './ui/components/TooltipProvider';
@@ -49,6 +49,7 @@ import styled from '@emotion/styled';
import {CopyOutlined} from '@ant-design/icons'; import {CopyOutlined} from '@ant-design/icons';
import {clipboard} from 'electron/common'; import {clipboard} from 'electron/common';
import {getVersionString} from './utils/versionString'; import {getVersionString} from './utils/versionString';
import {PersistGate} from 'redux-persist/integration/react';
if (process.env.NODE_ENV === 'development' && os.platform() === 'darwin') { if (process.env.NODE_ENV === 'development' && os.platform() === 'darwin') {
// By default Node.JS has its internal certificate storage and doesn't use // By default Node.JS has its internal certificate storage and doesn't use
@@ -64,7 +65,7 @@ enableMapSet();
GK.init(); GK.init();
class AppFrame extends React.Component< class AppFrame extends React.Component<
{logger: Logger}, {logger: Logger; persistor: Persistor},
{error: any; errorInfo: any} {error: any; errorInfo: any}
> { > {
state = {error: undefined as any, errorInfo: undefined as any}; state = {error: undefined as any, errorInfo: undefined as any};
@@ -80,7 +81,7 @@ class AppFrame extends React.Component<
} }
render() { render() {
const {logger} = this.props; const {logger, persistor} = this.props;
return this.state.error ? ( return this.state.error ? (
<Layout.Container grow center pad={80} style={{height: '100%'}}> <Layout.Container grow center pad={80} style={{height: '100%'}}>
<Layout.Top style={{maxWidth: 800, height: '100%'}}> <Layout.Top style={{maxWidth: 800, height: '100%'}}>
@@ -126,17 +127,19 @@ class AppFrame extends React.Component<
) : ( ) : (
<_LoggerContext.Provider value={logger}> <_LoggerContext.Provider value={logger}>
<Provider store={getStore()}> <Provider store={getStore()}>
<CacheProvider value={cache}> <PersistGate persistor={persistor}>
<TooltipProvider> <CacheProvider value={cache}>
<PopoverProvider> <TooltipProvider>
<ContextMenuProvider> <PopoverProvider>
<_NuxManagerContext.Provider value={_createNuxManager()}> <ContextMenuProvider>
<SandyApp /> <_NuxManagerContext.Provider value={_createNuxManager()}>
</_NuxManagerContext.Provider> <SandyApp />
</ContextMenuProvider> </_NuxManagerContext.Provider>
</PopoverProvider> </ContextMenuProvider>
</TooltipProvider> </PopoverProvider>
</CacheProvider> </TooltipProvider>
</CacheProvider>
</PersistGate>
</Provider> </Provider>
</_LoggerContext.Provider> </_LoggerContext.Provider>
); );
@@ -201,7 +204,7 @@ function init() {
} }
}); });
ReactDOM.render( ReactDOM.render(
<AppFrame logger={logger} />, <AppFrame logger={logger} persistor={persistor} />,
document.getElementById('root'), document.getElementById('root'),
); );
initLauncherHooks(config(), store); initLauncherHooks(config(), store);