PluginInfo component

Summary: Moved PluginEnabler component from PluginContainer into a separate file PluginInfo and also refactored it to not use deprecated components. In following diffs I will be extending PluginInfo to show not only enabler, but also additional information about the currently selected plugin.

Reviewed By: priteshrnandgaonkar

Differential Revision: D29186007

fbshipit-source-id: 4c8af9dcc4dc53476b9c50305f2221aeb009553e
This commit is contained in:
Anton Nikolaev
2021-06-29 13:00:18 -07:00
committed by Facebook GitHub Bot
parent 7bc38c1735
commit 280c612157
2 changed files with 103 additions and 37 deletions

View File

@@ -44,7 +44,7 @@ import {activateMenuItems} from './MenuBar';
import {Message} from './reducers/pluginMessageQueue'; import {Message} from './reducers/pluginMessageQueue';
import {IdlerImpl} from './utils/Idler'; import {IdlerImpl} from './utils/Idler';
import {processMessageQueue} from './utils/messageQueue'; import {processMessageQueue} from './utils/messageQueue';
import {ToggleButton, SmallText, Layout} from './ui'; import {Layout} from './ui';
import {theme, TrackingScope, _SandyPluginRenderer} from 'flipper-plugin'; import {theme, TrackingScope, _SandyPluginRenderer} from 'flipper-plugin';
import {isDevicePluginDefinition, isSandyPlugin} from './utils/pluginUtils'; import {isDevicePluginDefinition, isSandyPlugin} from './utils/pluginUtils';
import {ContentContainer} from './sandy-chrome/ContentContainer'; import {ContentContainer} from './sandy-chrome/ContentContainer';
@@ -54,6 +54,7 @@ import semver from 'semver';
import {loadPlugin} from './reducers/pluginManager'; import {loadPlugin} from './reducers/pluginManager';
import {produce} from 'immer'; import {produce} from 'immer';
import {reportUsage} from './utils/metrics'; import {reportUsage} from './utils/metrics';
import PluginInfo from './chrome/PluginInfo';
const {Text, Link} = Typography; const {Text, Link} = Typography;
@@ -275,7 +276,7 @@ class PluginContainer extends PureComponent<Props, State> {
} }
if (!pluginIsEnabled) { if (!pluginIsEnabled) {
return this.renderPluginEnabler(); return this.renderPluginInfo();
} }
if (!pendingMessages || pendingMessages.length === 0) { if (!pendingMessages || pendingMessages.length === 0) {
return this.renderPlugin(); return this.renderPlugin();
@@ -283,41 +284,8 @@ class PluginContainer extends PureComponent<Props, State> {
return this.renderPluginLoader(); return this.renderPluginLoader();
} }
renderPluginEnabler() { renderPluginInfo() {
const activePlugin = this.props.activePlugin!; return <PluginInfo />;
return (
<View grow>
<Waiting>
<VBox>
<FlexRow>
<Label
style={{
fontSize: '16px',
color: colors.light30,
textTransform: 'uppercase',
}}>
{activePlugin.title}
</Label>
</FlexRow>
</VBox>
<VBox>
<ToggleButton
toggled={false}
onClick={() => {
this.props.enablePlugin({
plugin: activePlugin,
selectedApp: (this.props.target as Client)?.query?.app,
});
}}
large
/>
</VBox>
<VBox>
<SmallText>Click to enable this plugin</SmallText>
</VBox>
</Waiting>
</View>
);
} }
renderPluginLoader() { renderPluginLoader() {

View File

@@ -0,0 +1,98 @@
/**
* 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, {useCallback, useMemo} from 'react';
import {Label, ToggleButton, SmallText, styled, Layout} from '../ui';
import {useDispatch, useStore} from '../utils/useStore';
import {switchPlugin} from '../reducers/pluginManager';
import {isPluginEnabled} from '../reducers/connections';
import {theme} from 'flipper-plugin';
import {PluginDefinition} from '../plugin';
const Waiting = styled(Layout.Container)({
width: '100%',
height: '100%',
flexGrow: 1,
alignItems: 'center',
justifyContent: 'center',
textAlign: 'center',
});
export default function PluginInfo() {
const pluginId = useStore((state) => state.connections.selectedPlugin);
const enabledPlugins = useStore((state) => state.connections.enabledPlugins);
const enabledDevicePlugins = useStore(
(state) => state.connections.enabledDevicePlugins,
);
const activeClient = useStore((state) => state.connections.activeClient);
const clientPlugins = useStore((state) => state.plugins.clientPlugins);
const devicePlugins = useStore((state) => state.plugins.devicePlugins);
const selectedClientId = activeClient?.id ?? null;
const selectedApp = activeClient?.query.app ?? null;
const disabledPlugin = useMemo(
() =>
pluginId &&
!isPluginEnabled(
enabledPlugins,
enabledDevicePlugins,
selectedClientId,
pluginId,
)
? clientPlugins.get(pluginId) ?? devicePlugins.get(pluginId)
: undefined,
[
pluginId,
enabledPlugins,
enabledDevicePlugins,
selectedClientId,
clientPlugins,
devicePlugins,
],
);
return disabledPlugin ? (
<PluginEnabler plugin={disabledPlugin} selectedApp={selectedApp} />
) : null;
}
function PluginEnabler({
plugin,
selectedApp,
}: {
plugin: PluginDefinition;
selectedApp: string | null;
}) {
const dispatch = useDispatch();
const enablePlugin = useCallback(() => {
dispatch(switchPlugin({plugin, selectedApp: selectedApp ?? undefined}));
}, [dispatch, plugin, selectedApp]);
return (
<Layout.Container grow>
<Waiting>
<Layout.Container>
<Layout.Horizontal>
<Label
style={{
fontSize: '16px',
color: theme.textColorSecondary,
textTransform: 'uppercase',
}}>
{plugin.title}
</Label>
</Layout.Horizontal>
</Layout.Container>
<Layout.Container>
<ToggleButton toggled={false} onClick={enablePlugin} large />
</Layout.Container>
<Layout.Container>
<SmallText>Click to enable this plugin</SmallText>
</Layout.Container>
</Waiting>
</Layout.Container>
);
}