Add Button to Expand or Collapse Left Panel

Summary:
- Add `show more` and `show less` button to expand and collapse
- The element to show depends on its usage rank from Flipper dashboard (manually copied)

Reviewed By: danielbuechele

Differential Revision: D16917952

fbshipit-source-id: fc37d5c640be33794694e302341fa08849b8f97f
This commit is contained in:
Chaiwat Ekkaewnumchai
2019-08-21 08:48:25 -07:00
committed by Facebook Github Bot
parent d1b17d3ecd
commit afd7634fd6
4 changed files with 86 additions and 1 deletions

View File

@@ -100,6 +100,7 @@ export default class Client extends EventEmitter {
sdkVersion: number; sdkVersion: number;
messageIdCounter: number; messageIdCounter: number;
plugins: Plugins; plugins: Plugins;
showAllPlugins: boolean;
connection: RSocketClientSocket<any, any> | null | undefined; connection: RSocketClientSocket<any, any> | null | undefined;
responder: Partial<Responder<any, any>>; responder: Partial<Responder<any, any>>;
store: Store; store: Store;
@@ -130,6 +131,7 @@ export default class Client extends EventEmitter {
super(); super();
this.connected = true; this.connected = true;
this.plugins = plugins ? plugins : []; this.plugins = plugins ? plugins : [];
this.showAllPlugins = false;
this.connection = conn; this.connection = conn;
this.id = id; this.id = id;
this.query = query; this.query = query;

View File

@@ -13,6 +13,7 @@ import {FlipperBasePlugin} from '../plugin';
import {PluginNotification} from '../reducers/notifications'; import {PluginNotification} from '../reducers/notifications';
import {ActiveSheet} from '../reducers/application'; import {ActiveSheet} from '../reducers/application';
import {State as Store} from '../reducers'; import {State as Store} from '../reducers';
import {isTopUsedPlugin} from '../fb-stubs/pluginUsage';
import { import {
Sidebar, Sidebar,
@@ -30,7 +31,7 @@ import {
} from 'flipper'; } from 'flipper';
import React, {Component, PureComponent} from 'react'; import React, {Component, PureComponent} from 'react';
import NotificationsHub from '../NotificationsHub'; import NotificationsHub from '../NotificationsHub';
import {selectPlugin} from '../reducers/connections'; import {selectPlugin, showMoreOrLessPlugins} from '../reducers/connections';
import {setActiveSheet} from '../reducers/application'; import {setActiveSheet} from '../reducers/application';
import UserAccount from './UserAccount'; import UserAccount from './UserAccount';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
@@ -116,6 +117,13 @@ const PluginDebugger = styled(FlexBox)(props => ({
textOverflow: 'ellipsis', textOverflow: 'ellipsis',
})); }));
const PluginShowMoreOrLess = styled(ListItem)({
color: colors.blue,
fontSize: 10,
lineHeight: '10px',
paddingBottom: 5,
});
function PluginIcon({ function PluginIcon({
isActive, isActive,
backgroundColor, backgroundColor,
@@ -214,6 +222,8 @@ type DispatchFromProps = {
}) => void; }) => void;
setActiveSheet: (activeSheet: ActiveSheet) => void; setActiveSheet: (activeSheet: ActiveSheet) => void;
showMoreOrLessPlugins: (payload: string) => void;
}; };
type Props = OwnProps & StateFromProps & DispatchFromProps; type Props = OwnProps & StateFromProps & DispatchFromProps;
@@ -310,6 +320,10 @@ class MainSidebar extends PureComponent<Props> {
(p: typeof FlipperDevicePlugin) => (p: typeof FlipperDevicePlugin) =>
client.plugins.indexOf(p.id) > -1, client.plugins.indexOf(p.id) > -1,
) )
.filter(
(p: typeof FlipperDevicePlugin) =>
client.showAllPlugins || isTopUsedPlugin(p.title, 5),
)
.sort(byPluginNameOrId) .sort(byPluginNameOrId)
.map((plugin: typeof FlipperDevicePlugin) => ( .map((plugin: typeof FlipperDevicePlugin) => (
<PluginSidebarListItem <PluginSidebarListItem
@@ -329,6 +343,10 @@ class MainSidebar extends PureComponent<Props> {
app={client.query.app} app={client.query.app}
/> />
))} ))}
<PluginShowMoreOrLess
onClick={() => this.props.showMoreOrLessPlugins(client.id)}>
{client.showAllPlugins ? 'Show less' : 'Show more'}
</PluginShowMoreOrLess>
</React.Fragment> </React.Fragment>
))} ))}
{uninitializedClients.map(entry => ( {uninitializedClients.map(entry => (
@@ -389,5 +407,6 @@ export default connect<StateFromProps, DispatchFromProps, OwnProps, Store>(
{ {
selectPlugin, selectPlugin,
setActiveSheet, setActiveSheet,
showMoreOrLessPlugins,
}, },
)(MainSidebar); )(MainSidebar);

View File

@@ -0,0 +1,42 @@
/**
* Copyright 2018-present Facebook.
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
* @format
*/
// copied from Flipper dashboard
const pluginRanking = [
'DeviceLogs',
'Inspector',
'Network',
'AnalyticsLogging',
'GraphQL',
'oculus-service-logs',
'UIPerf',
'CrashReporter',
'Msys',
'React',
'Databases',
'notifications',
'MobileConfig',
'FunnelLogger',
'Fresco',
'MScreen',
'Preferences',
'DeviceCPU',
'Hermesdebugger',
'vros-event-profiler',
'Mobileboost',
'Sections',
'Composer',
'Stories',
'DesignOverlay',
];
export function isTopUsedPlugin(pluginName: string, range: number): boolean {
const rank = pluginRanking.findIndex((name: string) => {
return name === pluginName;
});
return rank >= 0 && rank < range;
}

View File

@@ -92,6 +92,10 @@ export type Action =
| { | {
type: 'CLIENT_SETUP_ERROR'; type: 'CLIENT_SETUP_ERROR';
payload: {client: UninitializedClient; error: Error}; payload: {client: UninitializedClient; error: Error};
}
| {
type: 'CLIENT_SHOW_MORE_OR_LESS';
payload: string;
}; };
const DEFAULT_PLUGIN = 'DeviceLogs'; const DEFAULT_PLUGIN = 'DeviceLogs';
@@ -336,6 +340,19 @@ const reducer = (state: State = INITAL_STATE, action: Action): State => {
error: `Client setup error: ${errorMessage}`, error: `Client setup error: ${errorMessage}`,
}; };
} }
case 'CLIENT_SHOW_MORE_OR_LESS': {
const {payload} = action;
return {
...state,
clients: state.clients.map((client: Client) => {
if (client.id === payload) {
client.showAllPlugins = !client.showAllPlugins;
}
return client;
}),
};
}
default: default:
return state; return state;
} }
@@ -382,6 +399,11 @@ export const selectPlugin = (payload: {
payload, payload,
}); });
export const showMoreOrLessPlugins = (payload: string): Action => ({
type: 'CLIENT_SHOW_MORE_OR_LESS',
payload,
});
export const userPreferredPlugin = (payload: string): Action => ({ export const userPreferredPlugin = (payload: string): Action => ({
type: 'SELECT_USER_PREFERRED_PLUGIN', type: 'SELECT_USER_PREFERRED_PLUGIN',
payload, payload,