no client/device
Summary: Plugin debugger is now supporting 3 different scenarios: - no devices connected - device connected, but no app for the selected device is connected - apps are connected Added button to the sidebar to open plugin debugger. Reviewed By: passy Differential Revision: D13608749 fbshipit-source-id: d5ba04882590dace78e4ef0b17799d5a394dc3c4
This commit is contained in:
committed by
Facebook Github Bot
parent
36b109ecc6
commit
422ab99d29
@@ -21,6 +21,7 @@ import {
|
||||
Text,
|
||||
Glyph,
|
||||
styled,
|
||||
FlexColumn,
|
||||
GK,
|
||||
FlipperPlugin,
|
||||
FlipperDevicePlugin,
|
||||
@@ -29,6 +30,7 @@ import {
|
||||
import React from 'react';
|
||||
import NotificationsHub from '../NotificationsHub.js';
|
||||
import {selectPlugin} from '../reducers/connections.js';
|
||||
import {setActiveSheet} from '../reducers/application.js';
|
||||
import {connect} from 'react-redux';
|
||||
|
||||
const ListItem = styled('div')(({active}) => ({
|
||||
@@ -97,6 +99,20 @@ const PluginName = styled(Text)(props => ({
|
||||
},
|
||||
}));
|
||||
|
||||
const Plugins = styled(FlexColumn)({
|
||||
flexGrow: 1,
|
||||
});
|
||||
|
||||
const PluginDebugger = styled(FlexBox)(props => ({
|
||||
color: colors.blackAlpha50,
|
||||
borderTop: `1px solid ${colors.blackAlpha10}`,
|
||||
alignItems: 'center',
|
||||
padding: 10,
|
||||
whiteSpace: 'nowrap',
|
||||
overflow: 'hidden',
|
||||
textOverflow: 'ellipsis',
|
||||
}));
|
||||
|
||||
function PluginIcon({
|
||||
isActive,
|
||||
backgroundColor,
|
||||
@@ -188,6 +204,7 @@ type MainSidebarProps = {|
|
||||
numNotifications: number,
|
||||
devicePlugins: Map<string, Class<FlipperDevicePlugin<>>>,
|
||||
clientPlugins: Map<string, Class<FlipperPlugin<>>>,
|
||||
setActiveSheet: (activeSheet: ?string) => any,
|
||||
|};
|
||||
|
||||
class MainSidebar extends PureComponent<MainSidebarProps> {
|
||||
@@ -216,98 +233,111 @@ class MainSidebar extends PureComponent<MainSidebarProps> {
|
||||
backgroundColor={
|
||||
process.platform === 'darwin' && windowIsFocused ? 'transparent' : ''
|
||||
}>
|
||||
{!GK.get('flipper_disable_notifications') && (
|
||||
<ListItem
|
||||
active={selectedPlugin === 'notifications'}
|
||||
onClick={() =>
|
||||
selectPlugin({
|
||||
selectedPlugin: 'notifications',
|
||||
selectedApp: null,
|
||||
deepLinkPayload: null,
|
||||
})
|
||||
}>
|
||||
<PluginIcon
|
||||
color={colors.light50}
|
||||
name={
|
||||
numNotifications > 0
|
||||
? NotificationsHub.icon || 'bell'
|
||||
: 'bell-null'
|
||||
}
|
||||
isActive={selectedPlugin === NotificationsHub.id}
|
||||
/>
|
||||
<PluginName
|
||||
count={numNotifications}
|
||||
isActive={selectedPlugin === NotificationsHub.id}>
|
||||
{NotificationsHub.title}
|
||||
</PluginName>
|
||||
</ListItem>
|
||||
)}
|
||||
{selectedDevice && (
|
||||
<SidebarHeader>{selectedDevice.title}</SidebarHeader>
|
||||
)}
|
||||
{selectedDevice &&
|
||||
Array.from(this.props.devicePlugins.values())
|
||||
.filter(plugin => plugin.supportsDevice(selectedDevice))
|
||||
.map((plugin: Class<FlipperDevicePlugin<>>) => (
|
||||
<PluginSidebarListItem
|
||||
key={plugin.id}
|
||||
isActive={plugin.id === selectedPlugin}
|
||||
onClick={() =>
|
||||
selectPlugin({
|
||||
selectedPlugin: plugin.id,
|
||||
selectedApp: null,
|
||||
deepLinkPayload: null,
|
||||
})
|
||||
<Plugins>
|
||||
{!GK.get('flipper_disable_notifications') && (
|
||||
<ListItem
|
||||
active={selectedPlugin === 'notifications'}
|
||||
onClick={() =>
|
||||
selectPlugin({
|
||||
selectedPlugin: 'notifications',
|
||||
selectedApp: null,
|
||||
deepLinkPayload: null,
|
||||
})
|
||||
}>
|
||||
<PluginIcon
|
||||
color={colors.light50}
|
||||
name={
|
||||
numNotifications > 0
|
||||
? NotificationsHub.icon || 'bell'
|
||||
: 'bell-null'
|
||||
}
|
||||
plugin={plugin}
|
||||
isActive={selectedPlugin === NotificationsHub.id}
|
||||
/>
|
||||
<PluginName
|
||||
count={numNotifications}
|
||||
isActive={selectedPlugin === NotificationsHub.id}>
|
||||
{NotificationsHub.title}
|
||||
</PluginName>
|
||||
</ListItem>
|
||||
)}
|
||||
{selectedDevice && (
|
||||
<SidebarHeader>{selectedDevice.title}</SidebarHeader>
|
||||
)}
|
||||
{selectedDevice &&
|
||||
Array.from(this.props.devicePlugins.values())
|
||||
.filter(plugin => plugin.supportsDevice(selectedDevice))
|
||||
.map((plugin: Class<FlipperDevicePlugin<>>) => (
|
||||
<PluginSidebarListItem
|
||||
key={plugin.id}
|
||||
isActive={plugin.id === selectedPlugin}
|
||||
onClick={() =>
|
||||
selectPlugin({
|
||||
selectedPlugin: plugin.id,
|
||||
selectedApp: null,
|
||||
deepLinkPayload: null,
|
||||
})
|
||||
}
|
||||
plugin={plugin}
|
||||
/>
|
||||
))}
|
||||
{clients
|
||||
.filter(
|
||||
(client: Client) =>
|
||||
(selectedDevice &&
|
||||
client.query.device_id === selectedDevice.serial) ||
|
||||
// Old android sdk versions don't know their device_id
|
||||
// Display their plugins under all selected devices until they die out
|
||||
client.query.device_id === 'unknown',
|
||||
)
|
||||
.map((client: Client) => (
|
||||
<React.Fragment key={client.id}>
|
||||
<SidebarHeader>{client.query.app}</SidebarHeader>
|
||||
{Array.from(this.props.clientPlugins.values())
|
||||
.filter(
|
||||
(p: Class<FlipperPlugin<>>) =>
|
||||
client.plugins.indexOf(p.id) > -1,
|
||||
)
|
||||
.map((plugin: Class<FlipperPlugin<>>) => (
|
||||
<PluginSidebarListItem
|
||||
key={plugin.id}
|
||||
isActive={
|
||||
plugin.id === selectedPlugin &&
|
||||
selectedApp === client.id
|
||||
}
|
||||
onClick={() =>
|
||||
selectPlugin({
|
||||
selectedPlugin: plugin.id,
|
||||
selectedApp: client.id,
|
||||
deepLinkPayload: null,
|
||||
})
|
||||
}
|
||||
plugin={plugin}
|
||||
app={client.query.app}
|
||||
/>
|
||||
))}
|
||||
</React.Fragment>
|
||||
))}
|
||||
{clients
|
||||
.filter(
|
||||
(client: Client) =>
|
||||
(selectedDevice &&
|
||||
client.query.device_id === selectedDevice.serial) ||
|
||||
// Old android sdk versions don't know their device_id
|
||||
// Display their plugins under all selected devices until they die out
|
||||
client.query.device_id === 'unknown',
|
||||
)
|
||||
.map((client: Client) => (
|
||||
<React.Fragment key={client.id}>
|
||||
<SidebarHeader>{client.query.app}</SidebarHeader>
|
||||
{Array.from(this.props.clientPlugins.values())
|
||||
.filter(
|
||||
(p: Class<FlipperPlugin<>>) =>
|
||||
client.plugins.indexOf(p.id) > -1,
|
||||
)
|
||||
.map((plugin: Class<FlipperPlugin<>>) => (
|
||||
<PluginSidebarListItem
|
||||
key={plugin.id}
|
||||
isActive={
|
||||
plugin.id === selectedPlugin && selectedApp === client.id
|
||||
}
|
||||
onClick={() =>
|
||||
selectPlugin({
|
||||
selectedPlugin: plugin.id,
|
||||
selectedApp: client.id,
|
||||
deepLinkPayload: null,
|
||||
})
|
||||
}
|
||||
plugin={plugin}
|
||||
app={client.query.app}
|
||||
/>
|
||||
))}
|
||||
{uninitializedClients.map(entry => (
|
||||
<React.Fragment key={JSON.stringify(entry.client)}>
|
||||
<SidebarHeader>{entry.client.appName}</SidebarHeader>
|
||||
{entry.errorMessage ? (
|
||||
<ErrorIndicator name={'mobile-cross'} size={16} />
|
||||
) : (
|
||||
<Spinner size={16} />
|
||||
)}
|
||||
</React.Fragment>
|
||||
))}
|
||||
{uninitializedClients.map(entry => (
|
||||
<React.Fragment key={JSON.stringify(entry.client)}>
|
||||
<SidebarHeader>{entry.client.appName}</SidebarHeader>
|
||||
{entry.errorMessage ? (
|
||||
<ErrorIndicator name={'mobile-cross'} size={16} />
|
||||
) : (
|
||||
<Spinner size={16} />
|
||||
)}
|
||||
</React.Fragment>
|
||||
))}
|
||||
</Plugins>
|
||||
<PluginDebugger
|
||||
onClick={() => this.props.setActiveSheet('PLUGIN_DEBUGGER')}>
|
||||
<Glyph
|
||||
name="question-circle"
|
||||
size={16}
|
||||
variant="outline"
|
||||
color={colors.blackAlpha30}
|
||||
/>
|
||||
Plugin not showing?
|
||||
</PluginDebugger>
|
||||
</Sidebar>
|
||||
);
|
||||
}
|
||||
@@ -347,5 +377,6 @@ export default connect(
|
||||
}),
|
||||
{
|
||||
selectPlugin,
|
||||
setActiveSheet,
|
||||
},
|
||||
)(MainSidebar);
|
||||
|
||||
@@ -9,9 +9,17 @@ import type {FlipperDevicePlugin, FlipperPlugin} from '../plugin';
|
||||
import type {PluginDefinition} from '../dispatcher/plugins';
|
||||
import type Client from '../Client';
|
||||
|
||||
import {Component} from 'react';
|
||||
import {Component, Fragment} from 'react';
|
||||
import {connect} from 'react-redux';
|
||||
import {FlexColumn, Button, Text, ManagedTable, styled, colors} from 'flipper';
|
||||
import {
|
||||
FlexColumn,
|
||||
Button,
|
||||
Text,
|
||||
ManagedTable,
|
||||
styled,
|
||||
colors,
|
||||
Link,
|
||||
} from 'flipper';
|
||||
import {remote} from 'electron';
|
||||
|
||||
const Container = styled(FlexColumn)({
|
||||
@@ -20,7 +28,8 @@ const Container = styled(FlexColumn)({
|
||||
});
|
||||
|
||||
const InfoText = styled(Text)({
|
||||
lineHeight: '140%',
|
||||
lineHeight: '130%',
|
||||
marginBottom: 8,
|
||||
});
|
||||
|
||||
const Title = styled('div')({
|
||||
@@ -67,6 +76,7 @@ type Props = {|
|
||||
disabledPlugins: Array<PluginDefinition>,
|
||||
failedPlugins: Array<[PluginDefinition, string]>,
|
||||
clients: Array<Client>,
|
||||
selectedDevice: ?string,
|
||||
onHide: () => mixed,
|
||||
|};
|
||||
|
||||
@@ -217,22 +227,74 @@ class PluginDebugger extends Component<Props> {
|
||||
}
|
||||
|
||||
render() {
|
||||
let content = null;
|
||||
|
||||
if (!this.props.selectedDevice) {
|
||||
content = (
|
||||
<InfoText>
|
||||
We can't find any device connected to your computer. Is an
|
||||
emulator/simulator currently running on your system, or is there a
|
||||
development device connected via USB? There are some devices/emulators
|
||||
known to have problems connecting to Flipper. Check out the{' '}
|
||||
<Link href="https://fbflipper.com/docs/troubleshooting.html#known-incompatibilities">
|
||||
known incompatibilities
|
||||
</Link>.
|
||||
</InfoText>
|
||||
);
|
||||
} else if (
|
||||
!this.props.clients.some(
|
||||
(client: Client) =>
|
||||
client.query.device_id === this.props.selectedDevice,
|
||||
)
|
||||
) {
|
||||
// no clients for selected device
|
||||
content = (
|
||||
<Fragment>
|
||||
<InfoText>
|
||||
While Flipper was able to connect to your device, it wasn't able to
|
||||
connect to the app you are running on your device. For this reason,
|
||||
app-specific plugins will not show up.
|
||||
</InfoText>
|
||||
{this.props.clients.length > 0 && (
|
||||
// we have clients, but not for this device
|
||||
<InfoText>
|
||||
Make sure you selected the correct device from the dropdown button
|
||||
in the upper left corner. Only plugins for the selected device are
|
||||
shown in the sidebar.
|
||||
</InfoText>
|
||||
)}
|
||||
<InfoText>
|
||||
To debug why Flipper couldn't establish a connection to the app,
|
||||
check out our documentation about{' '}
|
||||
<Link href="https://fbflipper.com/docs/troubleshooting.html#connection-issues">
|
||||
connection issues
|
||||
</Link>.
|
||||
</InfoText>
|
||||
</Fragment>
|
||||
);
|
||||
} else {
|
||||
content = (
|
||||
<Fragment>
|
||||
<InfoText>
|
||||
The table lists all plugins known to Flipper. Some of them might be
|
||||
blocked by GKs, others may not show up, because none of the
|
||||
connected apps is supporting it.
|
||||
</InfoText>
|
||||
<TableContainer>
|
||||
<ManagedTable
|
||||
columns={COLUMNS}
|
||||
rows={this.getRows()}
|
||||
highlightableRows={false}
|
||||
columnSizes={COLUMNS_SIZES}
|
||||
/>
|
||||
</TableContainer>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<Container>
|
||||
<Title>Plugin Status</Title>
|
||||
<InfoText>
|
||||
The table lists all plugins known to Flipper. Some of them might be
|
||||
blocked by GKs, others may not show up, because none of the connected
|
||||
apps is supporting it.
|
||||
</InfoText>
|
||||
<TableContainer>
|
||||
<ManagedTable
|
||||
columns={COLUMNS}
|
||||
rows={this.getRows()}
|
||||
highlightableRows={false}
|
||||
columnSizes={COLUMNS_SIZES}
|
||||
/>
|
||||
</TableContainer>
|
||||
{content}
|
||||
<Row>
|
||||
<Button compact padded onClick={this.props.onHide}>
|
||||
Close
|
||||
@@ -253,7 +315,7 @@ export default connect(
|
||||
disabledPlugins,
|
||||
failedPlugins,
|
||||
},
|
||||
connections: {selectedPlugin, clients},
|
||||
connections: {selectedPlugin, clients, selectedDevice},
|
||||
}) => ({
|
||||
devicePlugins: Array.from(devicePlugins.values()),
|
||||
clientPlugins: Array.from(clientPlugins.values()),
|
||||
@@ -261,5 +323,6 @@ export default connect(
|
||||
clients,
|
||||
disabledPlugins,
|
||||
failedPlugins,
|
||||
selectedDevice: selectedDevice?.serial,
|
||||
}),
|
||||
)(PluginDebugger);
|
||||
|
||||
Reference in New Issue
Block a user