/** * 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 type {RNTesterModuleExample} from '../../../types/RNTesterTypes'; import type {PointerEvent} from 'react-native'; import * as React from 'react'; import {useState} from 'react'; import {StyleSheet, Text, View} from 'react-native'; const styles = StyleSheet.create({ container: {height: '30%', width: '100%', backgroundColor: 'black'}, properties: {}, property: {borderWidth: 1, margin: 10}, }); function getModifiersText(evt: PointerEvent['nativeEvent']): string { const modifiers = []; if (evt.ctrlKey === true) { modifiers.push('Ctrl'); } if (evt.shiftKey === true) { modifiers.push('Shift'); } if (evt.altKey === true) { modifiers.push('Alt'); } if (evt.metaKey === true) { modifiers.push('Meta'); } if (modifiers.length > 0) { return modifiers.join(', '); } return ''; } function ManyPointersPropertiesExample(): React.Node { const [data, setData] = useState<{}>({}); const onPointerMove = (event: PointerEvent) => { const pointerId = event.nativeEvent.pointerId; // $FlowFixMe[invalid-computed-prop] // $FlowFixMe[incompatible-type] setData({...data, [pointerId]: event.nativeEvent}); }; return ( <> {Object.entries(data).map( //$FlowFixMe[incompatible-type] can't supply generic for Object.entries ([key, evt]: [string, PointerEvent['nativeEvent']]) => ( PointerID: {evt.pointerId} Offset: [{evt.offsetX.toPrecision(3)},{' '} {evt.offsetY.toPrecision(3)}] Coordinates: [{evt.clientX.toPrecision(3)},{' '} {evt.clientY.toPrecision(3)}] Screen Coordinates: [{evt.screenX?.toPrecision(3)},{' '} {evt.screenY?.toPrecision(3)}] Button: {evt.button} Pressure: {evt.pressure} Modifiers: {getModifiersText(evt)} ), )} ); } export default ({ name: 'many_pointers_properties_example', description: 'Display of properties for multiple pointers', title: 'Display Properties of many pointers', render(): React.Node { return ; }, }: RNTesterModuleExample);