123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /**
- * 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.
- *
- * @flow strict-local
- * @format
- */
- 'use strict';
- import Animated from '../../Animated/src/Animated';
- import Easing from '../../Animated/src/Easing';
- import * as React from 'react';
- import StyleSheet from '../../StyleSheet/StyleSheet';
- import Text from '../../Text/Text';
- import LogBoxButton from './LogBoxButton';
- import * as LogBoxStyle from './LogBoxStyle';
- import type {PressEvent} from '../../Types/CoreEventTypes';
- type Props = $ReadOnly<{|
- onPress?: ?(event: PressEvent) => void,
- status: 'COMPLETE' | 'FAILED' | 'NONE' | 'PENDING',
- |}>;
- function LogBoxInspectorSourceMapStatus(props: Props): React.Node {
- const [state, setState] = React.useState({
- animation: null,
- rotate: null,
- });
- React.useEffect(() => {
- if (props.status === 'PENDING') {
- if (state.animation == null) {
- const animated = new Animated.Value(0);
- const animation = Animated.loop(
- Animated.timing(animated, {
- duration: 2000,
- easing: Easing.linear,
- toValue: 1,
- useNativeDriver: true,
- }),
- );
- setState({
- animation,
- rotate: animated.interpolate({
- inputRange: [0, 1],
- /* $FlowFixMe(>=0.38.0) - Flow error detected during the deployment
- * of v0.38.0. To see the error, remove this comment and run flow
- */
- outputRange: ['0deg', '360deg'],
- }),
- });
- animation.start();
- }
- } else {
- if (state.animation != null) {
- state.animation.stop();
- setState({
- animation: null,
- rotate: null,
- });
- }
- }
- return () => {
- if (state.animation != null) {
- state.animation.stop();
- }
- };
- }, [props.status, state.animation]);
- let image;
- let color;
- switch (props.status) {
- case 'FAILED':
- image = require('./LogBoxImages/alert-triangle.png');
- color = LogBoxStyle.getErrorColor(1);
- break;
- case 'PENDING':
- image = require('./LogBoxImages/loader.png');
- color = LogBoxStyle.getWarningColor(1);
- break;
- }
- if (props.status === 'COMPLETE' || image == null) {
- return null;
- }
- return (
- <LogBoxButton
- backgroundColor={{
- default: 'transparent',
- pressed: LogBoxStyle.getBackgroundColor(1),
- }}
- hitSlop={{bottom: 8, left: 8, right: 8, top: 8}}
- onPress={props.onPress}
- style={styles.root}>
- <Animated.Image
- source={image}
- style={[
- styles.image,
- {tintColor: color},
- state.rotate == null || props.status !== 'PENDING'
- ? null
- : {transform: [{rotate: state.rotate}]},
- ]}
- />
- <Text style={[styles.text, {color}]}>Source Map</Text>
- </LogBoxButton>
- );
- }
- const styles = StyleSheet.create({
- root: {
- alignItems: 'center',
- borderRadius: 12,
- flexDirection: 'row',
- height: 24,
- paddingHorizontal: 8,
- },
- image: {
- height: 14,
- width: 16,
- marginEnd: 4,
- tintColor: LogBoxStyle.getTextColor(0.4),
- },
- text: {
- fontSize: 12,
- includeFontPadding: false,
- lineHeight: 16,
- },
- });
- export default LogBoxInspectorSourceMapStatus;
|