react-native-login-screen
Version:
Fully Customizable & Ready to use Login Screen for React Native
40 lines (32 loc) • 937 B
text/typescript
import {
useRef,
useState,
useEffect,
useCallback,
SetStateAction,
} from "react";
type Callback<T> = (value?: any) => void;
type DispatchWithCallback<T> = (value: any, callback?: Callback<any>) => void;
function useStateWithCallback<T>(
initialState: any | (() => any),
): [any, DispatchWithCallback<SetStateAction<any>>] {
const [state, _setState] = useState(initialState);
const callbackRef = useRef<Callback<any>>();
const isFirstCallbackCall = useRef<boolean>(true);
const setState = useCallback(
(setStateAction: SetStateAction<any>, callback?: Callback<any>): void => {
callbackRef.current = callback;
_setState(setStateAction);
},
[],
);
useEffect(() => {
if (isFirstCallbackCall.current) {
isFirstCallbackCall.current = false;
return;
}
callbackRef.current?.(state);
}, [state]);
return [state, setState];
}
export default useStateWithCallback;