react-native-xenon
Version:
A powerful in-app debugging tool for React Native.
117 lines (116 loc) • 3.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = Bubble;
var _react = require("react");
var _reactNative = require("react-native");
var _contexts = require("../../../contexts");
var _icons = _interopRequireDefault(require("../../../theme/icons"));
var _colors = _interopRequireDefault(require("../../../theme/colors"));
var _utils = require("../../../core/utils");
var _jsxRuntime = require("react/jsx-runtime");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function Bubble({
bubbleSize,
idleBubbleOpacity,
pan,
screenWidth,
screenHeight
}) {
const iconSize = bubbleSize * 0.65;
const {
setDebuggerState
} = (0, _react.useContext)(_contexts.MainContext);
const [idleOpacity, setIdleOpacity] = (0, _react.useState)(idleBubbleOpacity);
const opacityTimer = (0, _react.useRef)(null);
const panResponder = (0, _react.useMemo)(() => {
const clearTimer = () => {
if (opacityTimer.current) clearTimeout(opacityTimer.current);
opacityTimer.current = null;
};
return _reactNative.PanResponder.create({
onStartShouldSetPanResponder: () => true,
onMoveShouldSetPanResponder: () => true,
onPanResponderGrant: () => {
pan.current.setOffset({
// @ts-ignore
x: pan.current.x._value,
// @ts-ignore
y: pan.current.y._value
});
pan.current.setValue({
x: 0,
y: 0
});
clearTimer();
setIdleOpacity(1);
},
onPanResponderMove: _reactNative.Animated.event([null, {
dx: pan.current.x,
dy: pan.current.y
}], {
useNativeDriver: false
}),
onPanResponderRelease: (_, gesture) => {
const isTapGesture = gesture.dx > -10 && gesture.dx < 10 && gesture.dy > -10 && gesture.dy < 10;
if (isTapGesture) setDebuggerState(draft => {
draft.visibility = 'panel';
});
pan.current.flattenOffset();
const finalX = gesture.moveX < (screenWidth - bubbleSize) / 2 ? 0 : screenWidth - bubbleSize;
const verticalSafeMargin = (0, _utils.getVerticalSafeMargin)(screenHeight);
const finalY = (0, _utils.clamp)(gesture.moveY, verticalSafeMargin, screenHeight - verticalSafeMargin - bubbleSize);
_reactNative.Animated.spring(pan.current, {
toValue: {
x: finalX,
y: finalY
},
useNativeDriver: false
}).start(({
finished
}) => {
if (!finished) return;
opacityTimer.current = setTimeout(() => {
setIdleOpacity(0.5);
clearTimer();
}, 1000);
});
}
});
}, [bubbleSize, pan, screenHeight, screenWidth, setDebuggerState]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
style: styles.bubbleBackdrop,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
...panResponder.panHandlers,
style: [styles.bubble, {
width: bubbleSize,
height: bubbleSize,
borderRadius: bubbleSize / 2,
transform: pan.current.getTranslateTransform(),
opacity: idleOpacity
}],
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
source: _icons.default.bug,
style: {
width: iconSize,
height: iconSize
}
})
})
});
}
const styles = _reactNative.StyleSheet.create({
bubbleBackdrop: {
flex: 1,
..._reactNative.StyleSheet.absoluteFillObject,
pointerEvents: 'box-none'
},
bubble: {
backgroundColor: _colors.default.lightGray,
position: 'absolute',
justifyContent: 'center',
alignItems: 'center'
}
});
//# sourceMappingURL=Bubble.js.map