Skip to content

enonic/npm-react-components

Repository files navigation

Enonic React Components

Library of React components for handling Enonic XP data.

Install

npm install --save @enonic/react-components

RichText

Here is an example using the RichText component to render RichTextData in a React component named MyComponent.

Typically the RichTextData would be fetched from Enonic XP via the Guillotine GraphQL API.

import type {
  ImageComponent,
  LinkComponent,
  MacroComponent,
  RichTextData
} from '@enonic/react-components';
import {RichText} from '@enonic/react-components';

interface RestProps {
  myCustomProp: string
}

const Image: ImageComponent = ({
  alt,
  sizes,
  src,
  srcSet,
  style,
}) => {
  return <img
    alt={alt}
    sizes={sizes}
    src={src}
    srcSet={srcSet}
    style={style}
  />;
}

const Link: LinkComponent = ({
  // children, // in aProps
    content: _content,
    media: _media,
    // href, // in aProps
    // target, // in aProps
    // title, // in aProps
    uri: _uri,
    ...aProps
}) => {
    return <a {...aProps} />;
}

const HelloWorldMacro = ({
  config,
    children,
  myCustomProp
}: {
  config: Record<string,any>
  myCustomProp: RestProps['myCustomProp']
}) => {
  return (
      <>
          <h1>Hello, World! < /h1>
    {
        children
    }
    </>
  );
}

const Macro: MacroComponent<RestProps> = ({
  config,
  descriptor,
    children,
  ...rest
}) => {
  if (descriptor === 'com.enonic.app.example:helloworld') {
    const props = {...rest, config};
      return <HelloWorldMacro {...props} > {children} < /HelloWorldMacro>;
  }
  throw new Error(`Macro not found: ${descriptor}`);
}

export function MyComponent({data}: {data: RichTextData}) {
  return (
    <RichText<RestProps>
      className='someclass'
      data={data}
      Image={Image}
      Link={Link}
      Macro={Macro}
      tag='mytag'
      myCustomProp='lorum ipsum'
    />
  );
}

Regions

The Regions, Region, Layout, Page and ComponentTag components, are typically used with React4xp.

Here is an example using the Regions component:

Page controller

import { getContent } from '/lib/xp/portal';
import { render } from '/lib/enonic/react4xp';

export function get(request) {
  const content = getContent();
  const react4xpId = `react4xp_${content._id}`;
  return render(
    entry,
    props: {
      regionsData: content.page.regions,
      names: "main",
      tag: "main",
    },
    request, {
      body: `<!DOCTYPE html><html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>${content.displayName}</title>
  </head>
  <body>
    <div id="${react4xpId}"></div>
  </body>
</html>`,
      id: react4xpId,
    }
  );
}

React4XP Entry

import React from 'react';
import { Regions } from '@enonic/react-components';

function Page (props) {
  return (
    <div>
      <Regions {...props} />
    </div>
  );
}

export default (props) => <Page {...props}/>;