handle error when device disconected

Summary: Log views were being generated, this seems like a reasonable solution.

Reviewed By: zats

Differential Revision: D49547368

fbshipit-source-id: 575dd81a7c9b9a831d1dfb46088c2f5e1d731f22
This commit is contained in:
Luke De Feo
2023-09-25 02:02:26 -07:00
committed by Facebook GitHub Bot
parent f2e402e6e9
commit 10d5a2933a
6 changed files with 40 additions and 28 deletions

View File

@@ -19,6 +19,10 @@ export type Events = {
setTraversalMode: SetTraversalModeEvent; setTraversalMode: SetTraversalModeEvent;
}; };
export type Methods = {
onTraversalModeChange(params: {mode: TraversalMode}): Promise<void>;
};
export type SetTraversalModeEvent = { export type SetTraversalModeEvent = {
mode: TraversalMode; mode: TraversalMode;
}; };

View File

@@ -46,7 +46,7 @@ export type UIState = {
filterMainThreadMonitoring: Atom<boolean>; filterMainThreadMonitoring: Atom<boolean>;
supportedTraversalModes: Atom<TraversalMode[]>; supportedTraversalModes: Atom<TraversalMode[]>;
currentTraversalMode: Atom<TraversalMode>; traversalMode: Atom<TraversalMode>;
}; };
//enumerates the keys of input type and casts each to ReadOnlyAtom, this is so we only expose read only atoms to the UI //enumerates the keys of input type and casts each to ReadOnlyAtom, this is so we only expose read only atoms to the UI
@@ -113,7 +113,7 @@ export type UIActions = {
onCollapseAllNonAncestors: (nodeId: Id) => void; onCollapseAllNonAncestors: (nodeId: Id) => void;
onCollapseAllRecursively: (nodeId: Id) => void; onCollapseAllRecursively: (nodeId: Id) => void;
ensureAncestorsExpanded: (nodeId: Id) => void; ensureAncestorsExpanded: (nodeId: Id) => void;
setCurrentTraversalMode: (mode: TraversalMode) => void; onSetTraversalMode: (mode: TraversalMode) => void;
}; };
export type SelectionSource = export type SelectionSource =

View File

@@ -52,7 +52,7 @@ export const TreeControls: React.FC = () => {
const frameworkEventMetadata = useValue(instance.frameworkEventMetadata); const frameworkEventMetadata = useValue(instance.frameworkEventMetadata);
const currentTraversalMode = useValue(instance.uiState.currentTraversalMode); const currentTraversalMode = useValue(instance.uiState.traversalMode);
const supportedTraversalModes = useValue( const supportedTraversalModes = useValue(
instance.uiState.supportedTraversalModes, instance.uiState.supportedTraversalModes,
); );
@@ -65,6 +65,8 @@ export const TreeControls: React.FC = () => {
} }
}; };
const isConnected = useValue(instance.uiState.isConnected);
const menus = supportedTraversalModes.map((mode) => ({ const menus = supportedTraversalModes.map((mode) => ({
key: mode, key: mode,
label: labelForMode(mode), label: labelForMode(mode),
@@ -74,18 +76,18 @@ export const TreeControls: React.FC = () => {
<Layout.Horizontal gap="medium" pad="medium"> <Layout.Horizontal gap="medium" pad="medium">
{supportedTraversalModes.length > 1 ? ( {supportedTraversalModes.length > 1 ? (
<Dropdown <Dropdown
disabled={!isConnected}
menu={{ menu={{
selectable: true, selectable: true,
selectedKeys: [currentTraversalMode], selectedKeys: [currentTraversalMode],
items: menus, items: menus,
onSelect: async (event) => { onSelect: async (event) => {
const mode = event.selectedKeys[0] as TraversalMode; const mode = event.selectedKeys[0] as TraversalMode;
instance.uiActions.setCurrentTraversalMode(mode); // update UI instance.uiActions.onSetTraversalMode(mode); // update UI
await instance.onTraversalModeChange(mode); // update mobile client
}, },
}}> }}>
<Tooltip title="Debugger Mode"> <Tooltip title={isConnected ? 'Debugger Mode' : 'App disconnected'}>
<Button shape="circle"> <Button disabled={!isConnected} shape="circle">
<AppstoreOutlined /> <AppstoreOutlined />
</Button> </Button>
</Tooltip> </Tooltip>

View File

@@ -51,7 +51,7 @@ export const Visualization2D: React.FC<
const hoveredNodes = useValue(instance.uiState.hoveredNodes); const hoveredNodes = useValue(instance.uiState.hoveredNodes);
const hoveredNodeId = head(hoveredNodes); const hoveredNodeId = head(hoveredNodes);
const wireFrameMode = useValue(instance.uiState.wireFrameMode); const wireFrameMode = useValue(instance.uiState.wireFrameMode);
const traversalMode = useValue(instance.uiState.currentTraversalMode); const traversalMode = useValue(instance.uiState.traversalMode);
const [targetMode, setTargetMode] = useState<TargetModeState>({ const [targetMode, setTargetMode] = useState<TargetModeState>({
state: 'disabled', state: 'disabled',

View File

@@ -19,6 +19,7 @@ import {
SnapshotInfo, SnapshotInfo,
ClientNode, ClientNode,
FrameworkEventMetadata, FrameworkEventMetadata,
Methods,
} from './ClientTypes'; } from './ClientTypes';
import { import {
UIState, UIState,
@@ -40,14 +41,6 @@ import {uiActions} from './plugin/uiActions';
import {first} from 'lodash'; import {first} from 'lodash';
import {getNode} from './utils/map'; import {getNode} from './utils/map';
type TraversalModeChangeEvent = {
mode: TraversalMode;
};
export type Methods = {
onTraversalModeChange(params: TraversalModeChangeEvent): Promise<void>;
};
export function plugin(client: PluginClient<Events, Methods>) { export function plugin(client: PluginClient<Events, Methods>) {
const rootId = createState<Id | undefined>(undefined); const rootId = createState<Id | undefined>(undefined);
const metadata = createState<Map<MetadataId, Metadata>>(new Map()); const metadata = createState<Map<MetadataId, Metadata>>(new Map());
@@ -82,6 +75,7 @@ export function plugin(client: PluginClient<Events, Methods>) {
nodesAtom, nodesAtom,
snapshot, snapshot,
mutableLiveClientData, mutableLiveClientData,
client,
); );
const perfEvents = createDataSource<PerformanceStatsEvent, 'txId'>([], { const perfEvents = createDataSource<PerformanceStatsEvent, 'txId'>([], {
@@ -107,7 +101,7 @@ export function plugin(client: PluginClient<Events, Methods>) {
event.currentTraversalMode && event.currentTraversalMode &&
uiState.supportedTraversalModes.get().includes(event.currentTraversalMode) uiState.supportedTraversalModes.get().includes(event.currentTraversalMode)
) { ) {
uiState.currentTraversalMode.set(event.currentTraversalMode); uiState.traversalMode.set(event.currentTraversalMode);
console.log( console.log(
`[ui-debugger] Unsupported debugger mode ${event.currentTraversalMode}.`, `[ui-debugger] Unsupported debugger mode ${event.currentTraversalMode}.`,
); );
@@ -285,9 +279,6 @@ export function plugin(client: PluginClient<Events, Methods>) {
}); });
client.onMessage('frameScan', processFrame); client.onMessage('frameScan', processFrame);
const onTraversalModeChange = async (mode: TraversalMode) =>
client.send('onTraversalModeChange', {mode});
return { return {
rootId, rootId,
uiState: uiState as ReadOnlyUIState, uiState: uiState as ReadOnlyUIState,
@@ -300,7 +291,6 @@ export function plugin(client: PluginClient<Events, Methods>) {
metadata, metadata,
perfEvents, perfEvents,
os: client.device.os, os: client.device.os,
onTraversalModeChange,
}; };
} }
@@ -343,6 +333,6 @@ function createUIState(): UIState {
// view-hierarchy is the default state so we start with it until we fetch supported modes from the client // view-hierarchy is the default state so we start with it until we fetch supported modes from the client
supportedTraversalModes: createState<TraversalMode[]>(['view-hierarchy']), supportedTraversalModes: createState<TraversalMode[]>(['view-hierarchy']),
currentTraversalMode: createState<TraversalMode>('view-hierarchy'), traversalMode: createState<TraversalMode>('view-hierarchy'),
}; };
} }

View File

@@ -7,9 +7,16 @@
* @format * @format
*/ */
import {Atom} from 'flipper-plugin'; import {Atom, PluginClient} from 'flipper-plugin';
import {debounce} from 'lodash'; import {debounce} from 'lodash';
import {ClientNode, FrameworkEventType, Id, SnapshotInfo} from '../ClientTypes'; import {
ClientNode,
Events,
FrameworkEventType,
Id,
Methods,
SnapshotInfo,
} from '../ClientTypes';
import { import {
TraversalMode, TraversalMode,
LiveClientState, LiveClientState,
@@ -27,6 +34,7 @@ export function uiActions(
nodes: Atom<Map<Id, ClientNode>>, nodes: Atom<Map<Id, ClientNode>>,
snapshot: Atom<SnapshotInfo | null>, snapshot: Atom<SnapshotInfo | null>,
liveClientData: LiveClientState, liveClientData: LiveClientState,
client: PluginClient<Events, Methods>,
): UIActions { ): UIActions {
const onExpandNode = (node: Id) => { const onExpandNode = (node: Id) => {
uiState.expandedNodes.update((draft) => { uiState.expandedNodes.update((draft) => {
@@ -190,9 +198,17 @@ export function uiActions(
searchTermUpdatedDebounced(searchTerm); searchTermUpdatedDebounced(searchTerm);
}; };
const setCurrentTraversalMode = (mode: TraversalMode) => { const onSetTraversalMode = (newMode: TraversalMode) => {
tracker.track('traversal-mode-updated', {mode}); tracker.track('traversal-mode-updated', {mode: newMode});
uiState.currentTraversalMode.set(mode); const currentMode = uiState.traversalMode.get();
uiState.traversalMode.set(newMode);
try {
client.send('onTraversalModeChange', {mode: newMode});
} catch (err) {
console.warn('[ui-debugger] Unable to set traversal mode', err);
uiState.traversalMode.set(currentMode);
}
}; };
return { return {
@@ -213,6 +229,6 @@ export function uiActions(
onExpandAllRecursively, onExpandAllRecursively,
onCollapseAllRecursively, onCollapseAllRecursively,
ensureAncestorsExpanded, ensureAncestorsExpanded,
setCurrentTraversalMode, onSetTraversalMode,
}; };
} }