Enforce using named imports from 'react' (#10259)

This commit is contained in:
DS Boyce
2026-04-15 10:11:09 -07:00
committed by GitHub
parent 19e2dc939a
commit b9561f78ee
5 changed files with 25 additions and 17 deletions
+8
View File
@@ -250,6 +250,14 @@ export default defineConfig(
'@typescript-eslint/prefer-promise-reject-errors': 'warn', '@typescript-eslint/prefer-promise-reject-errors': 'warn',
'@typescript-eslint/await-thenable': 'warn', '@typescript-eslint/await-thenable': 'warn',
"no-restricted-imports": ["error", {
"paths": [{
"name": "react",
"importNames": ["React", "default"],
"message": "React is already in the global type namespace. Use named imports for runtime modules."
}]
}],
/** /**
* Turn off rules that we haven't enforced thus far * Turn off rules that we haven't enforced thus far
*/ */
+3 -3
View File
@@ -1,12 +1,12 @@
import * as React from 'react' import {useRef} from 'react'
import {Animated} from 'react-native' import {Animated} from 'react-native'
export function useAnimatedValue(initialValue: number) { export function useAnimatedValue(initialValue: number) {
const lazyRef = React.useRef<Animated.Value>(undefined) const lazyRef = useRef<Animated.Value>(undefined)
if (lazyRef.current === undefined) { if (lazyRef.current === undefined) {
lazyRef.current = new Animated.Value(initialValue) lazyRef.current = new Animated.Value(initialValue)
} }
return lazyRef.current as Animated.Value return lazyRef.current
} }
+5 -5
View File
@@ -1,13 +1,13 @@
import * as React from 'react' import {useCallback, useEffect, useRef} from 'react'
/** /**
* Helper hook to run persistent timers on views * Helper hook to run persistent timers on views
*/ */
export function useTimer(time: number, handler: () => void) { export function useTimer(time: number, handler: () => void) {
const timer = React.useRef<undefined | NodeJS.Timeout>(undefined) const timer = useRef<undefined | NodeJS.Timeout>(undefined)
// function to restart the timer // function to restart the timer
const reset = React.useCallback(() => { const reset = useCallback(() => {
if (timer.current) { if (timer.current) {
clearTimeout(timer.current) clearTimeout(timer.current)
} }
@@ -15,7 +15,7 @@ export function useTimer(time: number, handler: () => void) {
}, [time, timer, handler]) }, [time, timer, handler])
// function to cancel the timer // function to cancel the timer
const cancel = React.useCallback(() => { const cancel = useCallback(() => {
if (timer.current) { if (timer.current) {
clearTimeout(timer.current) clearTimeout(timer.current)
timer.current = undefined timer.current = undefined
@@ -23,7 +23,7 @@ export function useTimer(time: number, handler: () => void) {
}, [timer]) }, [timer])
// start the timer immediately // start the timer immediately
React.useEffect(() => { useEffect(() => {
reset() reset()
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []) }, [])
+6 -6
View File
@@ -1,4 +1,4 @@
import * as React from 'react' import {forwardRef, memo, useCallback, useState} from 'react'
import {type JSX} from 'react' import {type JSX} from 'react'
import {type ScrollView, View} from 'react-native' import {type ScrollView, View} from 'react-native'
import {useAnimatedRef} from 'react-native-reanimated' import {useAnimatedRef} from 'react-native-reanimated'
@@ -35,7 +35,7 @@ export interface PagerWithHeaderProps {
onPageSelected?: (index: number) => void onPageSelected?: (index: number) => void
onCurrentPageSelected?: (index: number) => void onCurrentPageSelected?: (index: number) => void
} }
export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( export const PagerWithHeader = forwardRef<PagerRef, PagerWithHeaderProps>(
function PageWithHeaderImpl( function PageWithHeaderImpl(
{ {
children, children,
@@ -49,9 +49,9 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
}: PagerWithHeaderProps, }: PagerWithHeaderProps,
ref, ref,
) { ) {
const [currentPage, setCurrentPage] = React.useState(0) const [currentPage, setCurrentPage] = useState(0)
const renderTabBar = React.useCallback( const renderTabBar = useCallback(
(props: RenderTabBarFnProps) => { (props: RenderTabBarFnProps) => {
return ( return (
<PagerTabBar <PagerTabBar
@@ -76,7 +76,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
], ],
) )
const onPageSelectedInner = React.useCallback( const onPageSelectedInner = useCallback(
(index: number) => { (index: number) => {
setCurrentPage(index) setCurrentPage(index)
onPageSelected?.(index) onPageSelected?.(index)
@@ -162,7 +162,7 @@ let PagerTabBar = ({
</> </>
) )
} }
PagerTabBar = React.memo(PagerTabBar) PagerTabBar = memo(PagerTabBar)
function PagerItem({ function PagerItem({
isFocused, isFocused,
@@ -1,4 +1,4 @@
import * as React from 'react' import {useEffect, useRef} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
// Based on @react-navigation/native-stack/src/navigators/createNativeStackNavigator.ts // Based on @react-navigation/native-stack/src/navigators/createNativeStackNavigator.ts
// MIT License // MIT License
@@ -82,7 +82,7 @@ function NativeStackNavigator({
UNSTABLE_router, UNSTABLE_router,
}) })
React.useEffect( useEffect(
() => () =>
// @ts-expect-error: there may not be a tab navigator in parent // @ts-expect-error: there may not be a tab navigator in parent
navigation?.addListener?.('tabPress', (e: any) => { navigation?.addListener?.('tabPress', (e: any) => {
@@ -110,7 +110,7 @@ function NativeStackNavigator({
// --- our custom logic starts here --- // --- our custom logic starts here ---
// Web LRU: tracks route keys in most-recently-focused order // Web LRU: tracks route keys in most-recently-focused order
const lruKeysRef = React.useRef<string[]>([]) const lruKeysRef = useRef<string[]>([])
const {hasSession, currentAccount} = useSession() const {hasSession, currentAccount} = useSession()
const activeRoute = state.routes[state.index] const activeRoute = state.routes[state.index]
const activeDescriptor = descriptors[activeRoute.key] const activeDescriptor = descriptors[activeRoute.key]