Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
279 changes: 273 additions & 6 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,121 @@ export const useWorker = <TArgs extends readonly any[], TRet>(
return { callback, error, isLoading, setError, setIsLoading };
};

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1>(
effect: (oldState: [T1]) => void | (() => void),
dependencies: [T1],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2>(
effect: (oldState: [T1, T2]) => void | (() => void),
dependencies: [T1, T2],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2, T3>(
effect: (oldState: [T1, T2, T3]) => void | (() => void),
dependencies: [T1, T2, T3],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
* @category Effects
*/
export function useEffectUpdate<T1, T2, T3, T4>(
effect: (oldState: [T1, T2, T3, T4]) => void | (() => void),
dependencies: [T1, T2, T3, T4],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2, T3, T4, T5>(
effect: (oldState: [T1, T2, T3, T4, T5]) => void | (() => void),
dependencies: [T1, T2, T3, T4, T5],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2, T3, T4, T5, T6>(
effect: (oldState: [T1, T2, T3, T4, T5, T6]) => void | (() => void),
dependencies: [T1, T2, T3, T4, T5, T6],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2, T3, T4, T5, T6, T7>(
effect: (oldState: [T1, T2, T3, T4, T5, T6, T7]) => void | (() => void),
dependencies: [T1, T2, T3, T4, T5, T6, T7],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2, T3, T4, T5, T6, T7, T8>(
effect: (oldState: [T1, T2, T3, T4, T5, T6, T7, T8]) => void | (() => void),
dependencies: [T1, T2, T3, T4, T5, T6, T7, T8],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
effect: (
oldState: [T1, T2, T3, T4, T5, T6, T7, T8, T9],
) => void | (() => void),
dependencies: [T1, T2, T3, T4, T5, T6, T7, T8, T9],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
* @param effect The effect to be executed. Receives the dependencies' previous state as arguments.
* @param dependencies The effect's dependencies.
*/
export function useEffectUpdate<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
effect: (
oldState: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10],
) => void | (() => void),
dependencies: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10],
): void;

/**
* Executes a effect and sends to its callback the previous state.
*
Expand All @@ -93,10 +208,15 @@ export const useWorker = <TArgs extends readonly any[], TRet>(
* the effect is executed.
* @category Effects
*/
export const useEffectUpdate = <Dependencies extends readonly any[]>(
export function useEffectUpdate<Dependencies extends readonly any[]>(
effect: (oldState: Dependencies) => void | (() => void),
dependencies: Dependencies,
) => {
): void;

export function useEffectUpdate<Dependencies extends readonly any[]>(
effect: (oldState: Dependencies) => void | (() => void),
dependencies: Dependencies,
): void {
const oldState = useRef<Dependencies>([] as any);
useEffect(() => {
try {
Expand All @@ -105,7 +225,149 @@ export const useEffectUpdate = <Dependencies extends readonly any[]>(
oldState.current = dependencies;
}
}, dependencies);
};
}

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1>(
evalCondition: (oldState: [T1]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2>(
evalCondition: (oldState: [T1, T2]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3>(
evalCondition: (oldState: [T1, T2, T3]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3, T4>(
evalCondition: (oldState: [T1, T2, T3, T4]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3, T4],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3, T4, T5>(
evalCondition: (oldState: [T1, T2, T3, T4, T5]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3, T4, T5],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3, T4, T5, T6>(
evalCondition: (oldState: [T1, T2, T3, T4, T5, T6]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3, T4, T5, T6],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3, T4, T5, T6, T7>(
evalCondition: (oldState: [T1, T2, T3, T4, T5, T6, T7]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3, T4, T5, T6, T7],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3, T4, T5, T6, T7, T8>(
evalCondition: (oldState: [T1, T2, T3, T4, T5, T6, T7, T8]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3, T4, T5, T6, T7, T8],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
evalCondition: (oldState: [T1, T2, T3, T4, T5, T6, T7, T8, T9]) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3, T4, T5, T6, T7, T8, T9],
): void;

/**
* Conditionally executes an effect.
*
* @param evalCondition A function that receives the dependencies' previous state as argument and
* returns a boolean defining if the effect should be executed.
* @param effect The effect callback to be executed.
* @param dependencies The effect's dependencies.
*/
export function useConditionalEffect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
evalCondition: (
oldState: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10],
) => boolean,
effect: () => (() => void) | void,
dependencies: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10],
): void;

/**
* Conditionally executes an effect.
Expand All @@ -118,16 +380,21 @@ export const useEffectUpdate = <Dependencies extends readonly any[]>(
* the effect is evaluating if it should be executed.
* @category Effects
*/
export const useConditionalEffect = <Dependencies extends readonly any[]>(
export function useConditionalEffect<Dependencies extends readonly any[]>(
evalCondition: (oldState: Dependencies) => boolean,
effect: () => (() => void) | void,
dependencies: Dependencies,
) => {
): void;
export function useConditionalEffect<Dependencies extends readonly any[]>(
evalCondition: (oldState: Dependencies) => boolean,
effect: () => (() => void) | void,
dependencies: Dependencies,
): void {
useEffectUpdate(
oldState => (evalCondition(oldState) ? effect() : undefined),
dependencies,
);
};
}

/**
* Runs an effect when the component gets mounted.
Expand Down