Files
flipper/desktop/flipper-ui-core/src/chrome/PlatformSelectWizard.tsx
Michel Weststrate 7e50c0466a Move app/src (mostly) to flipper-ui-core/src
Summary:
This diff moves all UI code from app/src to app/flipper-ui-core. That is now slightly too much (e.g. node deps are not removed yet), but from here it should be easier to move things out again, as I don't want this diff to be open for too long to avoid too much merge conflicts.

* But at least flipper-ui-core is Electron free :)
* Killed all cross module imports as well, as they where now even more in the way
* Some unit test needed some changes, most not too big (but emotion hashes got renumbered in the snapshots, feel free to ignore that)
* Found some files that were actually meaningless (tsconfig in plugins, WatchTools files, that start generating compile errors, removed those

Follow up work:
* make flipper-ui-core configurable, and wire up flipper-server-core in Electron instead of here
* remove node deps (aigoncharov)
* figure out correct place to load GKs, plugins, make intern requests etc., and move to the correct module
* clean up deps

Reviewed By: aigoncharov

Differential Revision: D32427722

fbshipit-source-id: 14fe92e1ceb15b9dcf7bece367c8ab92df927a70
2021-11-16 05:29:21 -08:00

159 lines
4.1 KiB
TypeScript

/**
* 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 {reportUsage} from 'flipper-common';
import {Modal, Button} from 'antd';
import {Layout, withTrackingScope, _NuxManagerContext} from 'flipper-plugin';
import {getRenderHostInstance} from '../RenderHost';
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<Settings>;
};
type Props = OwnProps & StateFromProps & DispatchFromProps;
class PlatformSelectWizard extends Component<Props, State> {
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 = (
<Layout.Container gap>
<Layout.Container style={{width: '100%', paddingBottom: 15}}>
<>
Please select the targets you intend to debug, so that we can
optimise the configuration for the selected targets.
</>
</Layout.Container>
<ToggledSection
label="Android Developer"
toggled={enableAndroid}
onChange={(v) => {
this.setState({
updatedSettings: {
...this.state.updatedSettings,
enableAndroid: v,
},
});
}}></ToggledSection>
<ToggledSection
label="iOS Developer"
toggled={enableIOS && this.props.platform === 'darwin'}
onChange={(v) => {
this.setState({
updatedSettings: {...this.state.updatedSettings, enableIOS: v},
});
}}></ToggledSection>
</Layout.Container>
);
const footerText = settingsPristine ? 'Looks fine' : 'Apply and Restart';
const footer = (
<>
<Button
type="primary"
onClick={() => this.applyChanges(settingsPristine)}>
{footerText}
</Button>
</>
);
return (
<Modal
visible
onCancel={() => {
this.props.onHide();
markWizardAsCompleted();
}}
width={570}
title="Select Platform Configuration"
footer={footer}>
{contents}
</Modal>
);
}
}
export default connect<StateFromProps, DispatchFromProps, OwnProps, Store>(
({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');
}