diff --git a/apps/common-app/src/examples/InvalidValueAccessExample.tsx b/apps/common-app/src/examples/InvalidValueAccessExample.tsx new file mode 100644 index 00000000000..ff9c5dad966 --- /dev/null +++ b/apps/common-app/src/examples/InvalidValueAccessExample.tsx @@ -0,0 +1,89 @@ +import { Text, StyleSheet, View, Button } from 'react-native'; + +import React, { useEffect } from 'react'; +import Animated, { + configureReanimatedLogger, + useAnimatedStyle, + useSharedValue, + withTiming, +} from 'react-native-reanimated'; + +configureReanimatedLogger({ + // change to `false` or remove the `configureReanimatedLogger` call to + // disable the warning + strict: true, +}); + +export default function InvalidValueAccessExample() { + const [counter, setCounter] = React.useState(0); + const [updateFromUseEffect, setUpdateFromUseEffect] = React.useState(false); + const sv = useSharedValue(0); + + if (!updateFromUseEffect) { + // logs writing to `value`... warning + sv.value = counter; + // logs reading from `value`... warning + console.log('shared value:', sv.value); + } + + useEffect(() => { + if (updateFromUseEffect) { + // no warning is logged + sv.value = counter; + // no warning is logged + console.log('useEffect shared value:', sv.value); + } + }, [sv, counter, updateFromUseEffect]); + + const reRender = () => { + setCounter((prev) => prev + 1); + }; + + const animatedBarStyle = useAnimatedStyle(() => ({ + transform: [{ scaleX: withTiming(Math.sin((sv.value * Math.PI) / 10)) }], + })); + + return ( + + + + Update from:{' '} + + {updateFromUseEffect ? 'useEffect' : 'component'} + + +