90 lines
2.4 KiB
JavaScript
90 lines
2.4 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||
|
*
|
||
|
* This source code is licensed under the MIT license found in the
|
||
|
* LICENSE file in the root directory of this source tree.
|
||
|
*
|
||
|
* @flow strict-local
|
||
|
* @format
|
||
|
*/
|
||
|
|
||
|
import Keyboard from '../../Components/Keyboard/Keyboard';
|
||
|
import View from '../../Components/View/View';
|
||
|
import StyleSheet from '../../StyleSheet/StyleSheet';
|
||
|
import * as LogBoxData from '../Data/LogBoxData';
|
||
|
import LogBoxLog, {type LogLevel} from '../Data/LogBoxLog';
|
||
|
import LogBoxInspectorBody from './LogBoxInspectorBody';
|
||
|
import LogBoxInspectorFooter from './LogBoxInspectorFooter';
|
||
|
import LogBoxInspectorHeader from './LogBoxInspectorHeader';
|
||
|
import * as LogBoxStyle from './LogBoxStyle';
|
||
|
import * as React from 'react';
|
||
|
import {useEffect} from 'react';
|
||
|
|
||
|
type Props = $ReadOnly<{
|
||
|
onDismiss: () => void,
|
||
|
onChangeSelectedIndex: (index: number) => void,
|
||
|
onMinimize: () => void,
|
||
|
logs: $ReadOnlyArray<LogBoxLog>,
|
||
|
selectedIndex: number,
|
||
|
fatalType?: ?LogLevel,
|
||
|
}>;
|
||
|
|
||
|
export default function LogBoxInspector(props: Props): React.Node {
|
||
|
const {logs, selectedIndex} = props;
|
||
|
let log = logs[selectedIndex];
|
||
|
|
||
|
useEffect(() => {
|
||
|
if (log) {
|
||
|
LogBoxData.symbolicateLogNow(log);
|
||
|
}
|
||
|
}, [log]);
|
||
|
|
||
|
useEffect(() => {
|
||
|
// Optimistically symbolicate the last and next logs.
|
||
|
if (logs.length > 1) {
|
||
|
const selected = selectedIndex;
|
||
|
const lastIndex = logs.length - 1;
|
||
|
const prevIndex = selected - 1 < 0 ? lastIndex : selected - 1;
|
||
|
const nextIndex = selected + 1 > lastIndex ? 0 : selected + 1;
|
||
|
LogBoxData.symbolicateLogLazy(logs[prevIndex]);
|
||
|
LogBoxData.symbolicateLogLazy(logs[nextIndex]);
|
||
|
}
|
||
|
}, [logs, selectedIndex]);
|
||
|
|
||
|
useEffect(() => {
|
||
|
Keyboard.dismiss();
|
||
|
}, []);
|
||
|
|
||
|
function _handleRetry() {
|
||
|
LogBoxData.retrySymbolicateLogNow(log);
|
||
|
}
|
||
|
|
||
|
if (log == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
return (
|
||
|
<View style={styles.root}>
|
||
|
<LogBoxInspectorHeader
|
||
|
onSelectIndex={props.onChangeSelectedIndex}
|
||
|
selectedIndex={selectedIndex}
|
||
|
total={logs.length}
|
||
|
level={log.level}
|
||
|
/>
|
||
|
<LogBoxInspectorBody log={log} onRetry={_handleRetry} />
|
||
|
<LogBoxInspectorFooter
|
||
|
onDismiss={props.onDismiss}
|
||
|
onMinimize={props.onMinimize}
|
||
|
level={log.level}
|
||
|
/>
|
||
|
</View>
|
||
|
);
|
||
|
}
|
||
|
|
||
|
const styles = StyleSheet.create({
|
||
|
root: {
|
||
|
flex: 1,
|
||
|
backgroundColor: LogBoxStyle.getTextColor(),
|
||
|
},
|
||
|
});
|