From 9ef4303a1a0665d367ecf3562063fa00415ee32e Mon Sep 17 00:00:00 2001 From: Daniel Parreira Date: Mon, 25 Oct 2021 15:04:11 -0700 Subject: [PATCH] Add platform wizard when opening Flipper for first time Summary: T103651722 - Added a first time wizard to pick the user platforms when the user opens it for the first time. The fact that the wizard was shown is stored in localstorage. Reviewed By: mweststrate Differential Revision: D31861286 fbshipit-source-id: a46c532520cd88a0c4c608d3ee314289f0407475 --- .../app/src/chrome/PlatformSelectWizard.tsx | 158 ++++++++++++++++++ desktop/app/src/sandy-chrome/SandyApp.tsx | 10 ++ 2 files changed, 168 insertions(+) create mode 100644 desktop/app/src/chrome/PlatformSelectWizard.tsx diff --git a/desktop/app/src/chrome/PlatformSelectWizard.tsx b/desktop/app/src/chrome/PlatformSelectWizard.tsx new file mode 100644 index 000000000..cea992bcc --- /dev/null +++ b/desktop/app/src/chrome/PlatformSelectWizard.tsx @@ -0,0 +1,158 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import React, {Component} from 'react'; +import {updateSettings, Action} from '../reducers/settings'; +import {connect} from 'react-redux'; +import {State as Store} from '../reducers'; +import {Settings} from '../reducers/settings'; +import {flush} from '../utils/persistor'; +import ToggledSection from './settings/ToggledSection'; +import {isEqual} from 'lodash'; +import restartFlipper from '../utils/restartFlipper'; +import {reportUsage} from 'flipper-common'; +import {Modal, Button} from 'antd'; +import {Layout, withTrackingScope, _NuxManagerContext} from 'flipper-plugin'; + +const WIZARD_FINISHED_LOCAL_STORAGE_KEY = 'platformSelectWizardFinished'; + +type OwnProps = { + onHide: () => void; + platform: NodeJS.Platform; +}; + +type StateFromProps = { + settings: Settings; +}; + +type DispatchFromProps = { + updateSettings: (settings: Settings) => Action; +}; + +type State = { + updatedSettings: Settings; + forcedRestartSettings: Partial; +}; + +type Props = OwnProps & StateFromProps & DispatchFromProps; +class PlatformSelectWizard extends Component { + state: State = { + updatedSettings: {...this.props.settings}, + forcedRestartSettings: {}, + }; + + componentDidMount() { + reportUsage('platformwizard:opened'); + } + + componentWillUnmount() { + reportUsage('platformwizard:closed'); + } + + applyChanges = async (settingsPristine: boolean) => { + this.props.updateSettings(this.state.updatedSettings); + + markWizardAsCompleted(); + + this.props.onHide(); + + return flush().then(() => { + if (!settingsPristine) { + reportUsage('platformwizard:action:changed'); + restartFlipper(true); + } else { + reportUsage('platformwizard:action:noop'); + } + }); + }; + + render() { + const {enableAndroid, enableIOS} = this.state.updatedSettings; + + const settingsPristine = isEqual( + this.props.settings, + this.state.updatedSettings, + ); + + const contents = ( + + + <> + Please select the targets you intend to debug, so that we can + optimise the configuration for the selected targets. + + + { + this.setState({ + updatedSettings: { + ...this.state.updatedSettings, + enableAndroid: v, + }, + }); + }}> + { + this.setState({ + updatedSettings: {...this.state.updatedSettings, enableIOS: v}, + }); + }}> + + ); + + const footerText = settingsPristine ? 'Looks fine' : 'Apply and Restart'; + const footer = ( + <> + + + ); + + return ( + { + this.props.onHide(); + markWizardAsCompleted(); + }} + width={570} + title="Select Platform Configuration" + footer={footer}> + {contents} + + ); + } +} + +export default connect( + ({settingsState}) => ({ + settings: settingsState, + }), + {updateSettings}, +)(withTrackingScope(PlatformSelectWizard)); + +export function hasPlatformWizardBeenDone( + localStorage: Storage | undefined, +): boolean { + return ( + !localStorage || + localStorage.getItem(WIZARD_FINISHED_LOCAL_STORAGE_KEY) !== 'true' + ); +} + +function markWizardAsCompleted() { + window.localStorage.setItem(WIZARD_FINISHED_LOCAL_STORAGE_KEY, 'true'); +} diff --git a/desktop/app/src/sandy-chrome/SandyApp.tsx b/desktop/app/src/sandy-chrome/SandyApp.tsx index 93b905cd8..e7d58d439 100644 --- a/desktop/app/src/sandy-chrome/SandyApp.tsx +++ b/desktop/app/src/sandy-chrome/SandyApp.tsx @@ -30,6 +30,9 @@ import PluginContainer from '../PluginContainer'; import {ContentContainer} from './ContentContainer'; import {Notification} from './notification/Notification'; import ChangelogSheet, {hasNewChangesToShow} from '../chrome/ChangelogSheet'; +import PlatformSelectWizard, { + hasPlatformWizardBeenDone, +} from '../chrome/PlatformSelectWizard'; import {getVersionString} from '../utils/versionString'; import config from '../fb-stubs/config'; import {WelcomeScreenStaticView} from './WelcomeScreen'; @@ -98,6 +101,13 @@ export function SandyApp() { if (hasNewChangesToShow(window.localStorage)) { Dialog.showModal((onHide) => ); } + + if (hasPlatformWizardBeenDone(window.localStorage)) { + Dialog.showModal((onHide) => ( + + )); + } + // don't warn about logger, even with a new logger we don't want to re-register // eslint-disable-next-line }, []);