chore: enable React correctness lints (#17285)

* chore: enable React correctness lints

* chore: enable additional safe lint rules
This commit is contained in:
Neil
2026-08-29 21:02:11 -07:00
committed by GitHub
parent df8467247d
commit 7e7f241ec6
4 changed files with 18 additions and 11 deletions
+7 -5
View File
@@ -40,18 +40,18 @@
"react/no-string-refs": "error",
"react/no-unescaped-entities": "error",
"react/require-render-return": "error",
"react/error-boundaries": "off",
"react/globals": "off",
"react/error-boundaries": "error",
"react/globals": "error",
"react/immutability": "off",
"react/incompatible-library": "off",
"react/preserve-manual-memoization": "off",
"react/purity": "off",
"react/refs": "off",
"react/set-state-in-effect": "off",
"react/set-state-in-render": "off",
"react/set-state-in-render": "error",
"react/static-components": "off",
"react/use-memo": "off",
"react/void-use-memo": "off",
"react/use-memo": "error",
"react/void-use-memo": "error",
"react/jsx-curly-brace-presence": [
"error",
{ "props": "never", "children": "never", "propElementValues": "always" }
@@ -74,6 +74,7 @@
"typescript/consistent-type-definitions": ["error", "type"],
"typescript/consistent-type-imports": "error",
"typescript/no-explicit-any": ["error", { "ignoreRestArgs": true }],
"typescript/no-confusing-non-null-assertion": "error",
"typescript/no-import-type-side-effects": "error",
"typescript/no-unnecessary-boolean-literal-compare": "error",
"typescript/no-unnecessary-template-expression": "error",
@@ -143,6 +144,7 @@
{
"files": ["**/*.test.*", "**/*.spec.*", "**/*-benchmark.*"],
"rules": {
"react/globals": "off",
"quadratic-buffer-concat/no-loop-carried-concat": "off",
"renderer-scrollbar-style/require-styled-vertical-scrollbar": "off"
}
@@ -95,7 +95,7 @@ describe('useMobileDictation source invariants', () => {
/import \{[^}]*createMobileDictationKeepAwakeOwner[^}]*\} from '\.\/mobile-dictation-keep-awake'/
)
expect(source).toContain(
'const keepAwakeOwner = useMemo(createMobileDictationKeepAwakeOwner, [])'
'const keepAwakeOwner = useMemo(() => createMobileDictationKeepAwakeOwner(), [])'
)
expect(keepAwakeSource).toContain('activateKeepAwakeAsync')
expect(keepAwakeSource).toContain('deactivateKeepAwake')
+1 -1
View File
@@ -26,7 +26,7 @@ export type { UseMobileDictationResult } from './mobile-dictation-session-state'
export function useMobileDictation(options: UseMobileDictationOptions): UseMobileDictationResult {
const { client, enabled, onTranscript, onError } = options
const keepAwakeOwner = useMemo(createMobileDictationKeepAwakeOwner, [])
const keepAwakeOwner = useMemo(() => createMobileDictationKeepAwakeOwner(), [])
const [status, setStatus] = useState<DictationStatus>('idle')
const [error, setError] = useState<string | null>(null)
const activeIdRef = useRef<string | null>(null)
@@ -16,6 +16,10 @@ type PairedMobileDevicesSnapshot = {
error: boolean
}
type RefreshPairedMobileDevicesOptions = {
force?: boolean
}
const EMPTY_SNAPSHOT: PairedMobileDevicesSnapshot = {
devices: [],
loaded: false,
@@ -80,9 +84,7 @@ export function replacePairedMobileDevices(devices: readonly PairedMobileDevice[
export function refreshPairedMobileDevices({
force = false
}: {
force?: boolean
} = {}): Promise<readonly PairedMobileDevice[]> {
}: RefreshPairedMobileDevicesOptions = {}): Promise<readonly PairedMobileDevice[]> {
if (activeRequest && !force) {
return activeRequest.promise
}
@@ -173,7 +175,10 @@ export function usePairedMobileDevices({
refresh: typeof refreshPairedMobileDevices
} {
const currentSnapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)
const refresh = useCallback(refreshPairedMobileDevices, [])
const refresh = useCallback(
(options?: RefreshPairedMobileDevicesOptions) => refreshPairedMobileDevices(options),
[]
)
useEffect(() => {
if (!enabled || !refreshOnMount || currentSnapshot.loaded || currentSnapshot.loading) {