30 lines
738 B
TypeScript
30 lines
738 B
TypeScript
import { createAction } from '@reduxjs/toolkit';
|
|
|
|
export { createAction } from '@reduxjs/toolkit';
|
|
|
|
interface WithPayload {
|
|
<P>(): (input: P) => { payload: P };
|
|
<P, A extends any[]>(prepare: (...args: A) => P): (...input: A) => {
|
|
payload: P;
|
|
};
|
|
}
|
|
|
|
export const withPayload: WithPayload = ((prepare) =>
|
|
(...input) => ({
|
|
payload: prepare ? prepare(...input) : input[0],
|
|
})) as any;
|
|
|
|
const id = (x) => x;
|
|
export const createPayloadAction = <
|
|
P extends any = any,
|
|
T extends string = string,
|
|
F extends (...args: any[]) => P = (input: P) => P,
|
|
>(
|
|
type: T,
|
|
prepare?: F,
|
|
) =>
|
|
createAction(
|
|
type,
|
|
withPayload<ReturnType<F>, Parameters<F>>(prepare ?? (id as any)),
|
|
);
|