react-server-actions
Version:
A package for working with actions in React and Next.js
87 lines • 3.42 kB
JavaScript
import { z } from 'zod';
import { decodeFormData, serialize } from './decode_form.js';
import { error, failure, isErrorActionResult, isFailureActionResult, success, } from './helpers.js';
import {} from './types.js';
export class ActionClient {
handleError;
constructor(options = { handleError: true }) {
this.handleError = options.handleError;
}
// ** Action wrapper
action = (schema, fn) => {
return async (_prevState, data) => {
const formData = decodeFormData(data);
const parsedData = await schema.safeParseAsync(formData);
if (!parsedData.success) {
return failure(serialize(formData), parsedData.error.flatten().fieldErrors);
}
try {
const actionResponse = await fn({
data: parsedData.data,
formData: data,
});
if (actionResponse && isFailureActionResult(actionResponse)) {
// Permit to return a FailureActionResult from the action for custom validations
return actionResponse;
}
if (actionResponse && isErrorActionResult(actionResponse)) {
// Permit to return a ErrorActionResult from the action for custom errors
return actionResponse;
}
return success(serialize(parsedData.data), actionResponse);
}
catch (e) {
if (this.handleError) {
if (e instanceof Error &&
(e.message === 'NEXT_REDIRECT' || e.message === 'NEXT_NOT_FOUND')) {
throw e;
}
else {
return error(serialize(parsedData.data), e);
}
}
else {
throw e;
}
}
};
};
actionWithParam = (schema, fn) => {
return async (param, _prevState, data) => {
const formData = decodeFormData(data);
const parsedData = await schema.safeParseAsync(formData);
if (!parsedData.success) {
return failure(serialize(formData), parsedData.error.flatten().fieldErrors);
}
try {
const actionResponse = await fn({
param,
data: parsedData.data,
formData: data,
});
if (actionResponse && isFailureActionResult(actionResponse)) {
return actionResponse;
}
if (actionResponse && isErrorActionResult(actionResponse)) {
return actionResponse;
}
return success(serialize(parsedData.data), actionResponse);
}
catch (e) {
if (this.handleError) {
if (e instanceof Error &&
(e.message === 'NEXT_REDIRECT' || e.message === 'NEXT_NOT_FOUND')) {
throw e;
}
else {
return error(serialize(parsedData.data), e);
}
}
else {
throw e;
}
}
};
};
}
//# sourceMappingURL=actions.js.map