Block Protocol – Graph service
This package implements the Block Protocol Graph service for blocks and embedding applications.
If you are a block author, we have several templates available to get you started:
npx create-block-app --help
If you want to roll your own, to get started:
yarn add @blockprotocol/graph
or npm install @blockprotocol/graph
- Follow the instructions to use the graph service as a block or an embedding application
Blocks
To create a GraphBlockHandler, pass the constructor an element in your block, along with any callbacks you wish to register to handle incoming messages.
React example
For React, we provide a useGraphBlockService
hook, which accepts a ref
to an element, and optionally any callbacks
you wish to provide on initialization.
See npx create-block-app my-block --template react
for an example.
Custom elements
For custom elements, this package exports a BlockElementBase
class
which uses the Lit framework, and sets graphService
on the instance.
See npx create-block-app my-block --template custom-element
for an example.
Embedding applications
To create a GraphEmbedderHandler, pass the constructor:
- An
element
wrapping your block callbacks
to respond to messages from the block- The starting values for any of the following messages you implement:
blockEntity
blockGraph
linkedAggregations
These starting values should also be passed in a graph
property object, if the block can be passed or assigned properties.
import { GraphEmbedderHandler } from "@blockprotocol/graph";
const graphService = new GraphEmbedderHandler({
blockEntity: { entityId: "123", properties: { name: "Bob" } },
callbacks: {
updateEntity: ({ data }) => updateEntityInYourDatastore(data),
},
element: elementWrappingTheBlock,
});
React
For React embedding applications, we provide a useGraphEmbedderService
hook, which accepts a ref
to an element, and optionally any additional constructor arguments you wish to pass.
import React from "react";
import { useGraphEmbedderService } from "@blockprotocol/graph";
export const App = () => {
const wrappingRef = React.useRef < HTMLDivElement > null;
const blockEntity = { entityId: "123", properties: { name: "Bob" } };
const { graphService } = useGraphEmbedderService(blockRef, {
blockEntity,
});
return (
<div ref={wrappingRef}>
<Block graph={{ blockEntity }} />
</div>
);
};