Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

reactive/data-client

Repository files navigation

Installation

npm install --save @data-client/react @data-client/rest @data-client/test

For more details, see the Installation docs page.

Usage

class User extends Entity {
 id = '';
 username = '';
}
class Article extends Entity {
 id = '';
 title = '';
 body = '';
 author = User.fromJS();
 createdAt = Temporal.Instant.fromEpochMilliseconds(0);
 static schema = {
 author: User,
 createdAt: Temporal.Instant.from,
 };
}
const UserResource = resource({
 path: '/users/:id',
 schema: User,
 optimistic: true,
});
const ArticleResource = resource({
 path: '/articles/:id',
 schema: Article,
 searchParams: {} as { author?: string },
 optimistic: true,
 paginationField: 'cursor',
});

One line data binding

const article = useSuspense(ArticleResource.get, { id });
return (
 <article>
 <h2>
 {article.title} by {article.author.username}
 </h2>
 <p>{article.body}</p>
 </article>
);
const ctrl = useController();
return (
 <>
 <CreateArticleForm
 onSubmit={article =>
 ctrl.fetch(ArticleResource.getList.push, { id }, article)
 }
 />
 <ProfileForm
 onSubmit={user =>
 ctrl.fetch(UserResource.update, { id: article.author.id }, user)
 }
 />
 <button onClick={() => ctrl.fetch(ArticleResource.delete, { id })}>
 Delete
 </button>
 </>
);
const price = useLive(PriceResource.get, { symbol });
return price.value;
const ctrl = useController();
await ctrl.fetch(ArticleResource.update, { id }, articleData);
await ctrl.fetchIfStale(ArticleResource.get, { id });
ctrl.expireAll(ArticleResource.getList);
ctrl.invalidate(ArticleResource.get, { id });
ctrl.invalidateAll(ArticleResource.getList);
ctrl.setResponse(ArticleResource.get, { id }, articleData);
ctrl.set(Article, { id }, articleData);
const queryTotalVotes = new schema.Query(
 new schema.Collection([BlogPost]),
 posts => posts.reduce((total, post) => total + post.votes, 0),
);
const totalVotes = useQuery(queryTotalVotes);
const totalVotesForUser = useQuery(queryTotalVotes, { userId });
const groupTodoByUser = new schema.Query(
 TodoResource.getList.schema,
 todos => Object.groupBy(todos, todo => todo.userId),
);
const todosByUser = useQuery(groupTodoByUser);
class LoggingManager implements Manager {
 middleware: Middleware = controller => next => async action => {
 console.log('before', action, controller.getState());
 await next(action);
 console.log('after', action, controller.getState());
 };
 cleanup() {}
}
class TickerStream implements Manager {
 middleware: Middleware = controller => {
 this.handleMsg = msg => {
 controller.set(Ticker, { id: msg.id }, msg);
 };
 return next => action => next(action);
 };
 init() {
 this.websocket = new WebSocket('wss://ws-feed.myexchange.com');
 this.websocket.onmessage = event => {
 const msg = JSON.parse(event.data);
 this.handleMsg(msg);
 };
 }
 cleanup() {
 this.websocket.close();
 }
}
const fixtures = [
 {
 endpoint: ArticleResource.getList,
 args: [{ maxResults: 10 }] as const,
 response: [
 {
 id: '5',
 title: 'first post',
 body: 'have a merry christmas',
 author: { id: '10', username: 'bob' },
 createdAt: new Date(0).toISOString(),
 },
 {
 id: '532',
 title: 'second post',
 body: 'never again',
 author: { id: '10', username: 'bob' },
 createdAt: new Date(0).toISOString(),
 },
 ],
 },
 {
 endpoint: ArticleResource.update,
 response: ({ id }, body) => ({
 ...body,
 id,
 }),
 },
];
const Story = () => (
 <MockResolver fixtures={options[result]}>
 <ArticleList maxResults={10} />
 </MockResolver>
);

...all typed ...fast ...and consistent

For the small price of 9kb gziped. 🏁Get started now

Features

Examples

API

Reactive Applications

Networking definition

Data model
Data Type Mutable Schema Description Queryable
Object Entity, EntityMixin single unique object
Union(Entity) polymorphic objects (A | B)
🛑 Object statically known keys 🛑
Invalidate(Entity) delete an entity 🛑
List Collection(Array) growable lists
🛑 Array immutable lists 🛑
All list of all entities of a kind
Map Collection(Values) growable maps
🛑 Values immutable maps 🛑
any Query(Queryable) memoized custom transforms

Sponsor this project

Packages

No packages published

Contributors 40

AltStyle によって変換されたページ (->オリジナル) /