/** * Copyright (c) Meta Platforms, Inc. and 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 {flush} from '../utils/persistor'; import ToggledSection from './settings/ToggledSection'; import {isEqual} from 'lodash'; import {Platform, reportUsage, Settings} from 'flipper-common'; import {Modal, Button} from 'antd'; import {Layout, withTrackingScope, _NuxManagerContext} from 'flipper-plugin'; import {getRenderHostInstance} from 'flipper-frontend-core'; const WIZARD_FINISHED_LOCAL_STORAGE_KEY = 'platformSelectWizardFinished'; type OwnProps = { onHide: () => void; platform: 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'); getRenderHostInstance().restartFlipper(); } 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'); }