@taktikorg/totam-tempora-sit v7.6.82
Define your async methods. Use them synchronously in React. Instantly mutate the data and automatically update all usages.
For REST, GraphQL, Websockets+SSE and more
๐ Website
๐Read The Docs ย |ย ๐Getting Started ย |ย ๐ฎTodo Demo ย |ย ๐ฎGithub Demo ย |ย ๐ฎNextJS SSR Demo
Installation
npm install --save @data-client/react @taktikorg/totam-tempora-sit @data-client/test @data-client/hooks
For more details, see the Installation docs page.
Usage
Simple TypeScript definition
class User extends Entity {
id = '';
username = '';
pk() {
return this.id;
}
}
class Article extends Entity {
id = '';
title = '';
body = '';
author = User.fromJS();
createdAt = Temporal.Instant.fromEpochSeconds(0);
pk() {
return this.id;
}
static schema = {
author: User,
createdAt: Temporal.Instant.from,
};
}
Create collection of API Endpoints
const UserResource = createResource({
path: '/users/:id',
schema: User,
optimistic: true,
});
const ArticleResource = createResource({
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>
);
Reactive Mutations
const ctrl = useController();
return (
<CreateProfileForm
onSubmit={data => ctrl.fetch(UserResource.getList.push, { id }, data)}
/>
<ProfileForm
onSubmit={data => ctrl.fetch(UserResource.update, { id }, data)}
/>
<button onClick={() => ctrl.fetch(UserResource.delete, { id })}>Delete</button>
);
Subscriptions
const price = useLive(PriceResource.get, { symbol });
return price.value;
Type-safe Imperative Actions
const ctrl = useController();
ctrl.expireAll(ArticleResource.getList);
ctrl.invalidate(ArticleResource.get, { id });
ctrl.invalidateAll(ArticleResource.getList);
ctrl.setResponse(ArticleResource.get, { id }, articleData);
ctrl.fetch(ArticleResource.get, { id });
Programmatic queries
const queryTotalVotes = new schema.Query(
new schema.All(Post),
(posts, { userId } = {}) => {
if (userId !== undefined)
posts = posts.filter(post => post.userId === userId);
return posts.reduce((total, post) => total + post.votes, 0);
},
);
const totalVotes = useQuery(queryTotalVotes);
const totalVotesForUser = useQuery(queryTotalVotes, { userId });
Powerful Middlewares
class LoggingManager implements Manager {
getMiddleware = (): Middleware => controller => next => async action => {
console.log('before', action, controller.getState());
await next(action);
console.log('after', action, controller.getState());
};
cleanup() {}
}
Integrated data mocking
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
- Strong Typescript inference
- ๐ React Suspense support
- ๐งต React 18 Concurrent mode compatible
- ๐ฆ Partial Hydration Server Side Rendering
- ๐ฃ Declarative API
- ๐ Composition over configuration
- ๐ฐ Normalized caching
- ๐ฅ Tiny bundle footprint
- ๐ Automatic overfetching elimination
- โจ Optimistic updates
- ๐ง Flexible to fit any API design (one size fits all)
- ๐ง Debugging and inspection via browser extension
- ๐ณ Tree-shakable (only use what you need)
- ๐ Subscriptions
- โป๏ธ Optional redux integration
- ๐ Storybook mocking
- ๐ฑ React Native support
- โ๏ธ NextJS support
- ๐ฏ Declarative cache lifetime policy
- ๐ง Composable middlewares
- ๐ฝ Global data consistency guarantees
- ๐ Automatic race condition elimination
- ๐ฏ Global referential equality guarantees
Examples
API
Reactive Applications
- Rendering: useSuspense(), useLive(), useCache(), useDLE(), useQuery()
- Event handling: useController() returns Controller
- Components: <CacheProvider/>, <AsyncBoundary/>, <ErrorBoundary/>, <MockResolver/>
- Data Mocking: Fixture, Interceptor, renderDataClient()
- Middleware: LogoutManager, NetworkManager, SubscriptionManager, PollingSubscription, DevToolsManager
Define Data
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago