--- name: reviewing-hook-patterns description: Review React hook usage for React 19 compliance and best practices review: true allowed-tools: Read, Grep, Glob version: 1.0.0 --- # Review: React Hook Patterns Reviews React hook patterns for React 19 compliance, deprecated APIs, and best practices. **Activates:** Code reviews, compliance validation, React 19 migration checks, hook-related PRs **Scope:** New hooks (`use()`, `useActionState`, `useOptimistic`), deprecated patterns (forwardRef, propTypes, defaultProps), hook rules, best practices, TypeScript compliance **Focus:** Correctness, security (Server Actions), performance (re-renders), React 19 compliance ## Review Process ### Phase 1: Find Deprecated APIs Use Grep (output_mode: "content"): - `forwardRef` - `\.propTypes\s*=` (removed in React 19) - `\.defaultProps\s*=` (deprecated on function components) ### Phase 2: Validate Hook Usage **use() API** - ✅ Promises or Context, Suspense-wrapped (Promises), Error Boundary (Promises) - ❌ NOT in try-catch; Promises must be stable (outside component) **useActionState** - ✅ Server Action receives (previousState, formData), returns serializable values, has error handling, validates inputs server-side - ❌ Missing authentication checks **useOptimistic** - ✅ Pure update function, paired with startTransition, visual pending indicator - ❌ NOT for critical operations **Standard Hooks** (useState, useEffect, etc.) - ✅ Top-level calls, all dependencies included, cleanup functions for effects - ❌ Missing dependencies, direct state mutation ### Phase 3: TypeScript Validation **useRef** requires initial value: ```typescript // ✅ Correct const ref = useRef(null); // ❌ Incorrect (React 19) const ref = useRef(); ``` **Ref as prop** typed correctly: ```typescript // ✅ Correct interface Props { ref?: Ref; } // ❌ Incorrect (using forwardRef) const Comp = forwardRef(...); ``` ### Phase 4: Identify Anti-Patterns **Array index as key:** ```javascript // ❌ Bad { items.map((item, index) =>
{item}
); } // ✅ Good { items.map((item) =>
{item}
); } ``` **Direct state mutation:** ```javascript // ❌ Bad const [items, setItems] = useState([]); items.push(newItem); setItems(items); // ✅ Good setItems([...items, newItem]); ``` **Missing dependencies:** ```javascript // ❌ Bad useEffect(() => { fetchData(userId); }, []); // ✅ Good useEffect(() => { fetchData(userId); }, [userId]); ``` **Missing cleanup:** ```javascript // ❌ Bad useEffect(() => { const timer = setInterval(() => {}, 1000); }, []); // ✅ Good useEffect(() => { const timer = setInterval(() => {}, 1000); return () => clearInterval(timer); }, []); ``` ## Report Format ### ✅ Compliant Patterns List correct React 19 usage, good practices, proper hooks. ### ⚠️ Warnings (Non-blocking) Deprecated APIs still functional but require migration: forwardRef, manual memoization (when React Compiler available), patterns with better React 19 alternatives. ### ❌ Issues (Must Fix) - **Removed APIs:** propTypes, defaultProps on function components, string refs - **Security:** Unvalidated Server Actions, missing authentication, XSS vulnerabilities - **Hook Rules:** Conditional calls, missing dependencies, hooks outside components ### 📝 Recommendations Migration paths, performance improvements, best practices, relevant skill references. ## Example Review: Form Component **Code:** ```javascript import { useState } from 'react'; function ContactForm() { const [email, setEmail] = useState(''); const [message, setMessage] = useState(''); async function handleSubmit(e) { e.preventDefault(); await fetch('/api/contact', { method: 'POST', body: JSON.stringify({ email, message }), }); } return (
setEmail(e.target.value)} />