Skip to content

Commit 57949f1

Browse files
committed
docs: Update Query's groupby example
1 parent 6c49728 commit 57949f1

File tree

1 file changed

+51
-23
lines changed

1 file changed

+51
-23
lines changed

docs/rest/api/Query.md

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,12 @@ render(<UsersPage />);
105105
```ts title="resources/User" collapsed
106106
export class User extends Entity {
107107
id = 0;
108+
username = '';
108109
name = '';
109110
email = '';
110111
website = '';
111112
pk() {
112-
return `${this.id}`;
113+
return this.id;
113114
}
114115
}
115116
export const UserResource = resource({
@@ -124,15 +125,19 @@ import { User } from './User';
124125

125126
export class Todo extends Entity {
126127
id = 0;
127-
userId = User.fromJS({});
128+
userId = 0;
129+
user? = User.fromJS({});
128130
title = '';
129131
completed = false;
130132
pk() {
131-
return `${this.id}`;
133+
return this.id;
132134
}
133135
static schema = {
134-
userId: User,
136+
user: User,
135137
};
138+
static process(input) {
139+
return { ...input, user: input.userId };
140+
}
136141
}
137142
export const TodoResource = resource({
138143
urlPrefix: 'https://jsonplaceholder.typicode.com',
@@ -142,17 +147,49 @@ export const TodoResource = resource({
142147
});
143148
```
144149

150+
```tsx title="TodoByUser" collapsed
151+
import { useQuery } from '@data-client/react';
152+
import { User } from './resources/User';
153+
import type { Todo } from './resources/Todo';
154+
155+
export default function TodoByUser({ userId, todos }: Props) {
156+
const user = useQuery(User, { id: userId });
157+
// don't bother if no user is loaded yet
158+
if (!user) return null;
159+
return (
160+
<div>
161+
<h3>
162+
{user.name} has {tasksRemaining(todos)} tasks left
163+
</h3>
164+
{todos.slice(0, 3).map(todo => (
165+
<div key={todo.pk()}>
166+
{todo.title} by {todo.user === user ? todo.user.name : ''}
167+
</div>
168+
))}
169+
</div>
170+
);
171+
}
172+
function tasksRemaining(todos: Todo[]) {
173+
return todos.filter(({ completed }) => !completed).length;
174+
}
175+
interface Props {
176+
userId: string;
177+
todos: Todo[];
178+
}
179+
```
180+
145181
```tsx title="TodoJoined"
146182
import { schema } from '@data-client/rest';
147183
import { useQuery, useFetch } from '@data-client/react';
148184
import { TodoResource, Todo } from './resources/Todo';
149185
import { UserResource } from './resources/User';
186+
import TodoByUser from './TodoByUser';
150187

151188
const groupTodoByUser = new schema.Query(
152189
TodoResource.getList.schema,
153190
todos => {
154-
return Object.groupBy(todos, todo => todo?.userId?.username) as Record<
155-
string,
191+
return Object.groupBy(todos, todo => todo.userId) as Record<
192+
number,
156193
Todo[]
157194
>;
158195
},
@@ -162,30 +199,21 @@ function TodosPage() {
162199
useFetch(UserResource.getList);
163200
useSuspense(TodoResource.getList);
164201
useSuspense(UserResource.getList);
165-
const todoByUser = useQuery(groupTodoByUser);
166-
if (!todoByUser) return <div>Todos not found</div>;
202+
const todosByUser = useQuery(groupTodoByUser);
203+
if (!todosByUser) return <div>Todos not found</div>;
167204
return (
168205
<div>
169-
{Object.keys(todoByUser).map(username => (
170-
<div key={username}>
171-
<h3>
172-
{username} has {tasksRemaining(todoByUser[username])} tasks
173-
left
174-
</h3>
175-
{todoByUser[username].slice(0, 3).map(todo => (
176-
<div key={todo.pk()}>
177-
{todo.title} by {todo?.userId?.name}
178-
</div>
179-
))}
180-
</div>
206+
{Object.keys(todosByUser).map(userId => (
207+
<TodoByUser
208+
key={userId}
209+
userId={userId}
210+
todos={todosByUser[userId]}
211+
/>
181212
))}
182213
</div>
183214
);
184215
}
185216

186-
function tasksRemaining(todos: Todo[]) {
187-
return todos.filter(({ completed }) => !completed).length;
188-
}
189217
render(<TodosPage />);
190218
```
191219

0 commit comments

Comments
 (0)