import { useEffect, useState } from 'react' /** * Returns the last value of type T that passes a filter function * @param value changing value * @param filterFn function that determines whether a given value should be considered for the last value */ export default function useLast( value: T | undefined | null, filterFn?: (value: T | null | undefined) => boolean ): T | null | undefined { const [last, setLast] = useState(filterFn && filterFn(value) ? value : undefined) useEffect(() => { setLast(last => { const shouldUse: boolean = filterFn ? filterFn(value) : true if (shouldUse) return value return last }) }, [filterFn, value]) return last } function isDefined(x: T | null | undefined): x is T { return x !== null && x !== undefined } /** * Returns the last truthy value of type T * @param value changing value */ export function useLastTruthy(value: T | undefined | null): T | null | undefined { return useLast(value, isDefined) }