yup-server-action
Version:
Server actions powered by Yup
64 lines (63 loc) • 1.59 kB
JavaScript
// src/create-server-action.ts
function internalBuilder(inputSchema) {
const obj = {
input(schema) {
return internalBuilder(schema);
},
handle(fn) {
return {
_inputType: void 0,
_resultType: void 0,
run: async (rawInput) => {
const parsedInput = inputSchema ? await inputSchema.validate(rawInput, { abortEarly: false }) : void 0;
const ctx = inputSchema ? { input: parsedInput } : {};
return fn(ctx);
}
};
}
};
return obj;
}
function createServerAction(schema) {
return schema ? internalBuilder(schema) : internalBuilder();
}
// src/use-server-action.ts
import { useState } from "react";
function useServerAction(action, options) {
const [isPending, setIsPending] = useState(false);
const [isSuccess, setIsSuccess] = useState(false);
const [isError, setIsError] = useState(false);
const [data, setData] = useState(void 0);
const [error, setError] = useState(void 0);
const execute = async (...args) => {
setIsPending(true);
setIsSuccess(false);
setIsError(false);
try {
const result = await action.run(...args);
options?.onSuccess?.(result);
setIsSuccess(true);
setData(result);
} catch (error2) {
options?.onError?.(error2);
setIsError(true);
setError(error2);
throw error2;
} finally {
setIsPending(false);
}
};
return {
execute,
isPending,
isSuccess,
isError,
data,
error
};
}
export {
createServerAction,
useServerAction
};
//# sourceMappingURL=index.mjs.map