Appearance
Ogma + React/Redux
The following tutorial aims to help you create your own apps with Ogma and React/Redux.
You may also want to check out the ogma-react
wrapper for seamless integration between Ogma and React.
Have a look to the React tutorial to get an introduction on how to wrap Ogma into a React component.
Here we will see how to create slices with Ogma and Redux.
Your first slice
Most of Ogma's API methods are asynchronus, due to animations. So we will need to use createAsyncThunk quite often. The idea is to call the API of Ogma inside this Thunks
and then update the state of the application on reject
, pending
, fulfilled
. Let's start with the setGraph
method. What we need to do is
- wrap
setGraph
into aThunk
- handle
reject
,pending
,fullfilled
and update the state of the app.
js
export const setGraph = createAsyncThunk('ogma/setGraph', graph => {
return ogma.parse
.neo4j(graph)
.then(graph => {
return ogma.setGraph(graph);
})
.then(() => ogma.layouts.force({ locate: true }))
.then(() => ogma.export.json({ download: false }));
});
Here this Thunk
parses a graph, sets it in Ogma and returns a stringify version of the state of Ogma. This method is simple but is not the most efficient or large graphs, as it stringifies and parses graphs at each change of the state.
Now that we have created our Thunk
, we hook to its events and update the state accordingly:
js
export const ogmaSlice = createSlice({
name: 'ogma',
initialState,
reducers: {},
extraReducers: builder => {
builder.addCase(setGraph.fulfilled, (state, action) => {
const { nodes, edges } = JSON.parse(action.payload);
state.nodes = nodes;
state.edges = edges;
state.animating = false;
});
builder.addCase(setGraph.pending, (state, action) => {
state.animating = true;
});
builder.addCase(setGraph.rejected, (state, action) => {
state.animating = false;
});
})
In the piece of code above, we say:
- When we start adding a graph (
pending
), we switch to theanimating
state. - When the graph is set, or when an error is triggered, we can switch back to the non
animating
state. - If the
setGraph
was successfull, we can update the state and assign the new nodes and edges to it.
Adding new features
Now that you know how to set a graph, you can wrap up any function from Ogma API into React-Redux
by creating Thunks
and hook to pending
, rejected
and fullfilled
to update your state.
How to go further in the design
This example is very small and aims to give you a quick start while letting you room for making your own decisions about the design. Let's see what you can take in consideration to build your solution.
Storing less data
If you are working with huge graphs, you might want to avoid stringiying and parsing the graph on each interraction. There are many ways and designs you can adopt, and everything depends on your needs and use.
You can choose for example, instead of storing the whole graph with data and attributes, to store only the data
of your nodes and edges. You could even store only their ids
and then work with NodeList
and EdgeList
, which are optimised, to avoid unnecessary copies of data.
Split logic and state
In this example, there are two places where the logic is written:
ogma.jsx
, which wraps the Ogma instance into aReact
componentogmaSlice.js
which wraps the Ogma API into aRedux
state managment system.
As Ogma
contains both logic and state, it will be your choice to handle features on one of the other part of the app
.
For example, in the React tutorial, the changes of layout are handled in the component via changes of the state, while in the current example, changes of layout are triggered by actions
in the state. It is all a matter of design and how you organise things.