UNPKG

react-server-actions

Version:

A package for working with actions in React and Next.js

87 lines 3.42 kB
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