Enty is a normalized cache for managing data requested from back-ends. Instead of you manually storing requested data, Enty uses schemas to describe relationships and stores the data in a normalized form.
Components declare which entities they would like, and Enty manages fetching and storing their relationships. Because the entities are stored in a normalized graph, you don't have to worry about how they are updated.
Enty has two parts: Schemas and request hooks.
The first step in implementing Enty is to define your schemas. A schema is the information about how entities are related to each other. In this example a users has a list of friends which are also users.
// ./schemas.js
import {ObjectSchema, ArraySchema, EntitySchema} from 'react-enty';
export const UserSchema = new EntitySchema('user');
export const UserListSchema = new ArraySchema(user);
UserSchema.shape = new ObjectSchema({friendList: UserListSchema});
The second thing we need to do is to create a request hook to fetch users
// api.js
import {createRequestHook} from 'react-enty';
import {UserSchema} from './schemas';
export const user = createRequestHook({
name: 'user',
schema: UserSchema,
request: (id) => request(`/user/${id}`)
});
// index.js
import {React} from 'react';
import {EntityProvider} from 'react-enty';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<EntityProvider>
<App />
</EntityProvider>,
document.getElementById('app'),
);
// ./App.js
import {React} from 'react';
import * as api from './api';
import Spinner from './components/Spinner';
export default function App(props) {
const message = api.user.useRequest({key: props.id});
// request a new user when props.id changes
useEffect(() => {
message.request(props.id);
}, [props.id]);
if (message.isEmpty || message.isPending) return <Spinner />;
if (message.isError) throw message.requestError;
return <img src={user.avatar} />;
}