123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /**
- * 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
- * @flow
- */
- 'use strict';
- const BoxInspector = require('./BoxInspector');
- const React = require('react');
- const StyleInspector = require('./StyleInspector');
- const StyleSheet = require('../StyleSheet/StyleSheet');
- const Text = require('../Text/Text');
- const TouchableHighlight = require('../Components/Touchable/TouchableHighlight');
- const TouchableWithoutFeedback = require('../Components/Touchable/TouchableWithoutFeedback');
- const View = require('../Components/View/View');
- const flattenStyle = require('../StyleSheet/flattenStyle');
- const mapWithSeparator = require('../Utilities/mapWithSeparator');
- const openFileInEditor = require('../Core/Devtools/openFileInEditor');
- import type {ViewStyleProp} from '../StyleSheet/StyleSheet';
- type Props = $ReadOnly<{|
- hierarchy: Array<{|name: string|}>,
- style?: ?ViewStyleProp,
- source?: ?{
- fileName?: string,
- lineNumber?: number,
- ...
- },
- frame?: ?Object,
- selection?: ?number,
- setSelection?: number => mixed,
- |}>;
- class ElementProperties extends React.Component<Props> {
- render(): React.Node {
- const style = flattenStyle(this.props.style);
- const selection = this.props.selection;
- let openFileButton;
- const source = this.props.source;
- const {fileName, lineNumber} = source || {};
- if (fileName && lineNumber) {
- const parts = fileName.split('/');
- const fileNameShort = parts[parts.length - 1];
- openFileButton = (
- <TouchableHighlight
- style={styles.openButton}
- onPress={openFileInEditor.bind(null, fileName, lineNumber)}>
- <Text style={styles.openButtonTitle} numberOfLines={1}>
- {fileNameShort}:{lineNumber}
- </Text>
- </TouchableHighlight>
- );
- }
- // Without the `TouchableWithoutFeedback`, taps on this inspector pane
- // would change the inspected element to whatever is under the inspector
- return (
- <TouchableWithoutFeedback>
- <View style={styles.info}>
- <View style={styles.breadcrumb}>
- {mapWithSeparator(
- this.props.hierarchy,
- (hierarchyItem, i) => (
- <TouchableHighlight
- key={'item-' + i}
- style={[styles.breadItem, i === selection && styles.selected]}
- // $FlowFixMe found when converting React.createClass to ES6
- onPress={() => this.props.setSelection(i)}>
- <Text style={styles.breadItemText}>{hierarchyItem.name}</Text>
- </TouchableHighlight>
- ),
- i => (
- <Text key={'sep-' + i} style={styles.breadSep}>
- ▸
- </Text>
- ),
- )}
- </View>
- <View style={styles.row}>
- <View style={styles.col}>
- <StyleInspector style={style} />
- {openFileButton}
- </View>
- {<BoxInspector style={style} frame={this.props.frame} />}
- </View>
- </View>
- </TouchableWithoutFeedback>
- );
- }
- }
- const styles = StyleSheet.create({
- breadSep: {
- fontSize: 8,
- color: 'white',
- },
- breadcrumb: {
- flexDirection: 'row',
- flexWrap: 'wrap',
- alignItems: 'flex-start',
- marginBottom: 5,
- },
- selected: {
- borderColor: 'white',
- borderRadius: 5,
- },
- breadItem: {
- borderWidth: 1,
- borderColor: 'transparent',
- marginHorizontal: 2,
- },
- breadItemText: {
- fontSize: 10,
- color: 'white',
- marginHorizontal: 5,
- },
- row: {
- flexDirection: 'row',
- alignItems: 'center',
- justifyContent: 'space-between',
- },
- col: {
- flex: 1,
- },
- info: {
- padding: 10,
- },
- openButton: {
- padding: 10,
- backgroundColor: '#000',
- marginVertical: 5,
- marginRight: 5,
- borderRadius: 2,
- },
- openButtonTitle: {
- color: 'white',
- fontSize: 8,
- },
- });
- module.exports = ElementProperties;
|