Saltar al contenido principal

Implementar un formulario de React Formik con el hook useFormConfig.

En este ejemplo, demostramos cómo implementar un formulario de React Formik utilizando el hook useFormConfig de OneEntry.

✅ Propósito del escenario:

  • Implementar un formulario de Formik utilizando el hook useFormConfig de OneEntry.
  • Asegurarse de que los datos estén correctamente formateados y validados antes de la presentación.

✅ Lo que necesitas:

  • Una PROJECT_URL y APP_TOKEN válidos para la autenticación con la API de OneEntry.
  • Un entorno de desarrollo configurado con React.js habilitado (por ejemplo, Next.js, Create React App).
  • Configurado en la interfaz de usuario de OneEntry con el marcador "contact_us".

📌 Importante:

  • Estos ejemplos no incluyen manejo de errores.
  • Puedes gestionar errores utilizando un bloque try-catch o empleando una construcción como await Promise.catch((error) => error).
  • Asegúrate de que el marcador del formulario (por ejemplo, "contact_us") utilizado en Forms.getFormByMarker coincida con un formulario existente en tu proyecto de OneEntry.

Escenario

1. Importar oneEntry y definir url y token

Ejemplo:

import { defineOneEntry } from 'oneentry';

const PROJECT_URL = 'your-project-url';
const APP_TOKEN = 'your-app-token';

2. Crear un cliente API con la función defineOneEntry()

Ejemplo:

const { Forms } = defineOneEntry(PROJECT_URL, {
token: APP_TOKEN,
});

Obtener datos del formulario de oneentry

Ejemplo:

const formData = await Forms.getFormByMarker('contact_us');
Resultado:
{
"id": 3,
"attributeSetId": 2,
"type": "data",
"localizeInfos": {
"title": "Contáctanos",
"titleForSite": "",
"successMessage": "Mensaje sobre el procesamiento exitoso de datos",
"unsuccessMessage": "Mensaje sobre el procesamiento fallido de datos",
"urlAddress": "",
"database": "0",
"script": "0"
},
"version": 5,
"position": 1,
"identifier": "contact_us",
"processingType": "script",
"templateId": null,
"attributes": [
{
"type": "string",
"marker": "first_name",
"isLogin": null,
"isSignUp": null,
"position": 1,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "Nombre"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "string",
"marker": "email",
"isLogin": null,
"isSignUp": null,
"position": 2,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
},
"emailInspectionValidator": true
},
"localizeInfos": {
"title": "Correo electrónico"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "string",
"marker": "surname",
"isLogin": null,
"isSignUp": null,
"position": 3,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {
"stringInspectionValidator": {
"stringMax": 0,
"stringMin": 0,
"stringLength": 0
}
},
"localizeInfos": {
"title": "Apellido"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "list",
"marker": "topic",
"isLogin": null,
"isSignUp": null,
"position": 4,
"settings": {},
"isVisible": true,
"listTitles": [
{
"title": "Artículo",
"value": "article",
"extended": {
"type": null,
"value": null
},
"position": 1
},
{
"title": "Artículo-2",
"value": "article-2",
"extended": {
"type": null,
"value": null
},
"position": 2
}
],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "Tema"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "text",
"marker": "text",
"isLogin": null,
"isSignUp": null,
"position": 5,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Texto"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "spam",
"marker": "spam",
"isLogin": null,
"isSignUp": null,
"position": 6,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "¿No eres un robot?"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "button",
"marker": "send",
"isLogin": null,
"isSignUp": null,
"position": 7,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Enviar"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
}
]
}

Usar el hook useFormConfig

Este hook proporciona datos de configuración del formulario.

Ejemplo:

const {
fields,
initialValues,
validationSchema,
} = useFormConfig(formData?.attributes);

Integración con Formik

Ejemplo:

<Formik initialValues={initialValues} validationSchema={validationSchema} onSubmit={() => {}}>
{({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting,
}) => {
return (
<form onSubmit={handleSubmit}>
<input
type="email"
name="email"
onChange={handleChange}
onBlur={handleBlur}
value={values?.email}
/>
<input
type="text"
name="first_name"
onChange={handleChange}
onBlur={handleBlur}
value={values?.first_name}
/>
<input
type="text"
name="surname"
onChange={handleChange}
onBlur={handleBlur}
value={values?.surname}
/>
<button type="submit" disabled={isSubmitting}>
Enviar
</button>
</form>
);
}}
</Formik>

Ejemplo final

// 1. Importar defineOneEntry, Formik y useFormConfig
import { defineOneEntry } from 'oneentry';
import { Formik } from 'formik';
import useFormConfig from './useFormConfig';

// 1.1 definir PROJECT_URL y APP_TOKEN
const PROJECT_URL = 'your-project-url';
const APP_TOKEN = 'your-app-token';

// 2. Crear un cliente API
const { Forms, FormData } = defineOneEntry(PROJECT_URL, {
token: APP_TOKEN,
});

// 3. Obtener datos del formulario de OneEntry
const formData = await Forms.getFormByMarker('contact_us');

// 4. Extraer la configuración del formulario con el hook react useFormConfig
const {
fields,
initialValues,
validationSchema,
} = useFormConfig(formData?.attributes);

// 5. Crear el formulario con Formik y los datos de useFormConfig
return (
<Formik initialValues={initialValues} validationSchema={validationSchema} onSubmit={() => {}}>
{({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting,
}) => {
return (
<form onSubmit={handleSubmit}>
<input
type="email"
name="email"
onChange={handleChange}
onBlur={handleBlur}
value={values?.email}
/>
<input
type="text"
name="first_name"
onChange={handleChange}
onBlur={handleBlur}
value={values?.first_name}
/>
<input
type="text"
name="surname"
onChange={handleChange}
onBlur={handleBlur}
value={values?.surname}
/>
<button type="submit" disabled={isSubmitting}>
Enviar
</button>
</form>
);
}}
</Formik>
);