Skip to content

Readme React sample #18

@maartenhvdh

Description

@maartenhvdh

Brief bug description

React sample in the readme didn't work for me

Repro steps

  1. Install
  2. Copy paste React sample
  3. Gives multiple errors, mainly on naming

Expected behavior

This is the working React sample:

import { PortableText, PortableTextReactComponents } from "@portabletext/react";
import {
  browserParse,
  transformToPortableText,
} from '@kontent-ai/rich-text-resolver';
import { useMemo } from "react";

const createPortableTextComponents = (linkedItems) => {
  const portableTextComponents: Partial<PortableTextReactComponents> = {
    types: {
      component: (block) => {
        const item = linkedItems.find(
          (item) => item.system.codename === block.value.component._ref
        );
        return <div>{item?.elements.text_element.value}</div>;
      },
      table: ({ value }) => {
        const table = (
          <table>
            {value.rows.map((row) => (
              <tr>
                {row.cells.map((cell) => {
                  return (
                    <td>
                      <PortableText
                        value={cell.content}
                        components={portableTextComponents}
                      />
                    </td>
                  );
                })}
              </tr>
            ))}
          </table>
        );
        return table;
      },
      image: ({ value }) => {
        // It is possible to use images from the rich text element response same as for linked items
        // const image = images.find(image => image.image_id === value.asset._ref)
        return <img src={value.asset.url}></img>;
      },
    },
    marks: {
      link: ({ value, children }) => {
        const target = (value?.href || "").startsWith("http")
          ? "_blank"
          : undefined;
        return (
          <a
            href={value?.href}
            target={target}
            rel={value?.rel}
            title={value?.title}
            data-new-window={value["data-new-window"]}
          >
            {children}
          </a>
        );
      },
      internalLink: ({ value, children }) => {
        // It is possible to use links from the rich text element response same as for linked items
        // const item = links.find(link => link.link_id === value.reference._ref);
        return (
          <a href={"https://somerandomwebsite.xyz/" + value.reference._ref}>
            {children}
          </a>
        );
      },
    },
  };

  const MyComponent = ({ props }) => {
    // https://github.com/portabletext/react-portabletext#customizing-components
    const parsedTree = browserParse(props.element.value);
    const portableText = transformToPortableText(parsedTree);

    return (
      <PortableText value={portableText} components={portableTextComponents} />
    );
  }
};

Test environment

n/a

Additional context

n/a

Screenshots

n/a

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions