Los custom hooks te permiten extraer comportamiento de UI con estado - offsets de keyboard, estado de sheet abierto, búsqueda debounced, headers impulsados por scroll - en funciones reutilizables que cualquier pantalla o componente de presentación puede llamar. Mantienes JSX en componentes y mueves el "cómo funciona" a hooks, lo que reduce prop drilling sin ocultar reglas de negocio en árboles visuales.
Llamar hooks condicionalmente - if (show) useFoo() viola las Reglas de Hooks y causa crash en dev. Fix: Llama el hook incondicionalmente; controla el comportamiento dentro de él o en el consumidor.
Devolver objetos inestables en cada renderizado - return { open, close, state: { isOpen } } donde el objeto interno se recrea causa re-renderizados innecesarios de hijos. Fix: Memoiza objetos anidados o aplana la forma de retorno; estabiliza callbacks con useCallback.
Mezclar data fetching en UI hooks - useProductSheet que obtiene y gestiona la altura del keyboard es difícil de testear y reutilizar. Fix: Divide en useProductQuery + useBottomSheet; compón a nivel de pantalla.
Olvidar limpieza de listeners nativos - Los listeners de Keyboard y Dimensions se fugan si se omite remove(). Fix: Devuelve una función de limpieza desde useEffect y llama .remove() en suscripciones.
Compartir refs mutables entre instancias - Module-level let lastOffset = 0 pasa estado entre pantallas. Fix: Mantén valores mutables en useRef dentro del cuerpo del hook.
Hooks que devuelven JSX - Un hook que devuelve <Modal /> es un componente, no un hook. Fix: Devuelve estado + manejadores; deja que el llamador renderice JSX (patrón headless - ver Headless Components).
Sobre-abstraer lógica de un solo uso - Un hook usado exactamente una vez añade indirección sin reutilización. Fix: Inlina hasta que aparezca el segundo consumidor; entonces extrae con un nombre que describe el comportamiento, no la pantalla.