Skip to content

Nuestro primer componente

Introducción

En este tutorial, vamos a crear un componente simple y generar su PDF.

Para crear un componente, necesitamos 3 elementos:

  • Crear el componente
  • Crear el archivo de configuración del componente para la vista previa
  • Crear el endpoint que recibirá los datos del PDF

¡Vamos a empezar!

Creando el componente

Accede a la carpeta

packages > templates > lib > templates

y crea una carpeta llamada:

first-component

Que será el nombre de nuestro primer componente.

Crea un archivo index.tsx dentro de la carpeta.

Importa las 3 dependencias necesarias para crear un componente.

tsx
import Text from "templates/lib/components/Text";
import useAssets from "templates/lib/hooks/useAssets";
import createPropsValidation from "templates/lib/utils/createPropsValidation";

Explicaciones sobre las dependencias:

  • Text: Componente responsable de renderizar textos
  • useAssets: Hook responsable de cargar las fuentes e imágenes
  • createPropsValidation: Función responsable de validar las props del componente

Ahora vamos a crear el componente.

tsx
import { JSONSchemaType } from "ajv";

import Text from "templates/lib/components/Text";
import useAssets from "templates/lib/hooks/useAssets";
import createPropsValidation from "templates/lib/utils/createPropsValidation";

type ExamplePropsType = {
  title: string;
};

const FirstComponent = ({ title }: ExamplePropsType) => {
  const reactLogo = useAssets("react.svg");

  return (
    <div>
      <Text color="primaryBase">
        Example: {title} {reactLogo}
      </Text>

      <img src={reactLogo} alt="logo" />
    </div>
  );
};

const propsSchema: JSONSchemaType<ExamplePropsType> = {
  type: "object",
  properties: {
    title: {
      type: "string",
      minLength: 1,
      maxLength: 10,
    },
  },
  required: ["title"],
};

FirstComponent.validate = createPropsValidation(propsSchema);

export default FirstComponent;

Por último, exporta este componente en el archivo

templates > lib > index.ts

tsx
export { default as FirstComponent } from "./FirstComponent";

Listo, ahora vamos a crear la visualización de este componente en storybook.

Ejecuta la aplicación con el comando yarn dev o npm run dev y accede al enlace http://localhost:6006/

Ahora vamos a crear el archivo de configuración del componente.

Creando el archivo storybook

Crea un archivo llamado FirstComponent.stories.tsx en la carpeta

packages > preview > src > templates > first-component

tsx
import type { Meta, StoryObj } from "@storybook/react";

import { Templates } from "templates/lib";

const meta = {
  title: "FirstComponent",
  component: Templates.FirstComponent,
  parameters: {
    layout: "centered",
  },
  tags: ["autodocs"],
  argTypes: {},
} satisfies Meta<typeof Templates.FirstComponent>;

type Story = StoryObj<typeof meta>;

export const Preview: Story = {
  args: {
    title: "Hello, World! First Component",
  },
};

export default meta;

Puedes saber más sobre storybook en la Documentación oficial de storybook

Ahora deberías poder visualizar tu componente renderizado en storybook.

Accede al enlace http://localhost:6006/ y ve tu componente.

First Component

Generando el PDF vía API

Importante

Debes enviar en el Header de la solicitud el formato que deseas para el documento:

  • application/pdf
  • text/html

Easy Docs puede retornar en cualquiera de estos dos formatos, basado en el header enviado.

Temas

Puedes crear temas personalizados para las plantillas, veremos esto más adelante. Por ahora, usaremos el tema por defecto llamado "Sample"

Ejemplo de solicitud

Aquí haremos un ejemplo de solicitud. Es importante que verifiques el Accept en el header, debe ser application/pdf o text/html

En templateProps, debes enviar las props del componente que fue creado.

Props creadas anteriormente

tsx
// Props que definimos en el componente
const propsSchema: JSONSchemaType<ExamplePropsType> = {
  type: "object",
  properties: {
    title: {
      type: "string",
      minLength: 1,
      maxLength: 10,
    },
  },
  required: ["title"],
};

FirstComponent.validate = createPropsValidation(propsSchema);

export default FirstComponent;

Ejemplo de solicitud usando Curl

sh
curl -X POST http://localhost:3000/template/render \
  -H "Content-Type: application/json" \
  -H "Accept: application/pdf" \
  -d '{
    "theme": "Sample",
    "templateName": "FirstComponent",
    "templateProps": {
        "title": "First "
    }
}'