sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
40 lines (37 loc) • 1.09 kB
text/typescript
import {useEffect} from 'react'
import shallowEquals from 'shallow-equals'
import {usePrevious} from './usePrevious'
/**
* A hook for doing side effects as a response to a change in a hook value between renders
*
* @example
* ```ts
* useDidUpdate(hasFocus, (hadFocus, hasFocus) => {
* if (hasFocus) {
* scrollIntoView(elementRef.current)
* }
* })
* ```
*
* @beta
* @hidden
*/
export function useDidUpdate<T>(
/** The value you want to respond to changes in. */
current: T,
/** Callback to run when the value changes. */
didUpdate: (previous: T | undefined, current: T) => void,
compare?: (previous: T | undefined, current: T) => boolean,
): void
export function useDidUpdate<T>(
current: T,
didUpdate: (previous: T | undefined, current: T | undefined) => void,
compare: (previous: T | undefined, current: T) => boolean = shallowEquals,
): void {
const previous = usePrevious<T | undefined>(current)
useEffect(() => {
if (!compare(previous, current)) {
didUpdate(previous, current)
}
}, [didUpdate, current, previous, compare])
}