Skip to content

Commit 5da2aae

Browse files
committed
flatten the query result
1 parent fae9b9c commit 5da2aae

File tree

4 files changed

+59
-173
lines changed

4 files changed

+59
-173
lines changed

apps/events/src/components/events.tsx

Lines changed: 39 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -16,106 +16,48 @@ export const Events: React.FC = () => {
1616

1717
console.log("Rendering Events", events);
1818

19-
// const entities = useQuery({
20-
// where: {
21-
// name: {
22-
// equals: "Alice",
23-
// },
24-
// // TODO include it a where clause
25-
// types: {
26-
// contains: ["Person"] as const,
27-
// },
28-
// select: {
29-
// name: true,
30-
// friends: {
31-
// // where: {},
32-
// select: {
33-
// name: true,
34-
// },
35-
// },
36-
// },
37-
// },
38-
// });
39-
40-
// useEffect(() => {
41-
// // createEntity({
42-
// // types: ["Event"],
43-
// // data: {
44-
// // name: "Silvester in NY",
45-
// // },
46-
// // });
47-
48-
// // TODO create - can be an object or an array
49-
// createEntity({
50-
// types: ["Person", "User"], // TODO can types be inferred if they are located in data?
51-
// data: {
52-
// name: "Alice",
53-
// age: 30,
54-
// email: "[email protected]",
55-
// // isActive: true,
56-
// // friends: ["abc", "def"], // ids to connect
57-
// // friends: [
58-
// // { id: "abc", name: "abc" },
59-
// // { id: "def", name: "lala" },
60-
// // ], // create objects or overwrite existing ones
61-
// // friends: ["abc", { id: "def", name: "lala" }], // mix between connect and create
62-
// },
63-
// });
64-
65-
// // createEntity(["Person", "User"], {
66-
// // name: "Alice",
67-
// // age: 30,
68-
// // email: "[email protected]",
69-
// // isActive: true,
70-
// // });
71-
// }, []);
72-
73-
// TODO different API for setting a Triple with a value on a entities
74-
7519
return (
7620
<div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
77-
{events &&
78-
Object.keys(events).map((eventId) => {
79-
const event = events[eventId];
80-
return (
81-
<Card key={eventId}>
82-
<CardHeader>
83-
<CardTitle>
84-
<Input
85-
className="edit"
86-
onChange={() => {
87-
// changeDoc((doc) => {
88-
// doc.events[event.id].value = evt.target.value;
89-
// });
90-
}}
91-
value={event.name}
92-
/>
93-
</CardTitle>
94-
</CardHeader>
95-
<CardContent>
96-
<p>by {event.author.name}</p>
97-
<p>Participants:</p>
98-
<ul>
99-
{event.participants.map((participant) => (
100-
<li key={participant.id}>
101-
{participant.name} ({participant.badge.name})
102-
</li>
103-
))}
104-
</ul>
105-
</CardContent>
106-
<CardFooter className="flex gap-2">
107-
<Button
108-
onClick={(evt) => {
109-
evt.preventDefault();
110-
deleteEntity(eventId);
21+
{events.map((event) => {
22+
return (
23+
<Card key={event.id}>
24+
<CardHeader>
25+
<CardTitle>
26+
<Input
27+
className="edit"
28+
onChange={() => {
29+
// changeDoc((doc) => {
30+
// doc.events[event.id].value = evt.target.value;
31+
// });
11132
}}
112-
>
113-
Delete
114-
</Button>
115-
</CardFooter>
116-
</Card>
117-
);
118-
})}
33+
value={event.name}
34+
/>
35+
</CardTitle>
36+
</CardHeader>
37+
<CardContent>
38+
<p>by {event.author.name}</p>
39+
<p>Participants:</p>
40+
<ul>
41+
{event.participants.map((participant) => (
42+
<li key={participant.id}>
43+
{participant.name} ({participant.badge.name})
44+
</li>
45+
))}
46+
</ul>
47+
</CardContent>
48+
<CardFooter className="flex gap-2">
49+
<Button
50+
onClick={(evt) => {
51+
evt.preventDefault();
52+
deleteEntity(event.id);
53+
}}
54+
>
55+
Delete
56+
</Button>
57+
</CardFooter>
58+
</Card>
59+
);
60+
})}
11961
</div>
12062
);
12163
};

apps/events/src/components/users.tsx

Lines changed: 3 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -7,69 +7,11 @@ export const Users: React.FC = () => {
77

88
console.log("Rendering Users", users);
99

10-
// const entities = useQuery({
11-
// where: {
12-
// name: {
13-
// equals: "Alice",
14-
// },
15-
// // TODO include it a where clause
16-
// types: {
17-
// contains: ["Person"] as const,
18-
// },
19-
// select: {
20-
// name: true,
21-
// friends: {
22-
// // where: {},
23-
// select: {
24-
// name: true,
25-
// },
26-
// },
27-
// },
28-
// },
29-
// });
30-
31-
// useEffect(() => {
32-
// // createEntity({
33-
// // types: ["Event"],
34-
// // data: {
35-
// // name: "Silvester in NY",
36-
// // },
37-
// // });
38-
39-
// // TODO create - can be an object or an array
40-
// createEntity({
41-
// types: ["Person", "User"], // TODO can types be inferred if they are located in data?
42-
// data: {
43-
// name: "Alice",
44-
// age: 30,
45-
// email: "[email protected]",
46-
// // isActive: true,
47-
// // friends: ["abc", "def"], // ids to connect
48-
// // friends: [
49-
// // { id: "abc", name: "abc" },
50-
// // { id: "def", name: "lala" },
51-
// // ], // create objects or overwrite existing ones
52-
// // friends: ["abc", { id: "def", name: "lala" }], // mix between connect and create
53-
// },
54-
// });
55-
56-
// // createEntity(["Person", "User"], {
57-
// // name: "Alice",
58-
// // age: 30,
59-
// // email: "[email protected]",
60-
// // isActive: true,
61-
// // });
62-
// }, []);
63-
64-
// TODO different API for setting a Triple with a value on a entities
65-
6610
return (
6711
<div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
68-
{users &&
69-
Object.keys(users).map((userId) => {
70-
const user = users[userId];
71-
return <User name={user.name} key={userId} />;
72-
})}
12+
{users.map((user) => {
13+
return <User key={user.id} name={user.name} />;
14+
})}
7315
</div>
7416
);
7517
};

packages/graph-framework/src/context.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ export function createFunctions<T extends SchemaDefinition>(schema: T) {
337337
}: {
338338
types: [...K];
339339
}) {
340-
const prevEntitiesRef = useRef<any>({});
340+
const prevEntitiesRef = useRef<MergedEntityType<T, K, BaseEntity>[]>([]);
341341
const id = useSpaceId();
342342
const repo = useRepo();
343343

@@ -365,14 +365,14 @@ export function createFunctions<T extends SchemaDefinition>(schema: T) {
365365

366366
const entities = useSyncExternalStore(
367367
subscribe,
368-
(): Record<string, MergedEntityType<T, K, BaseEntity>> => {
368+
(): MergedEntityType<T, K, BaseEntity>[] => {
369369
const doc = handle?.docSync();
370370
if (!doc) {
371-
if (fastDeepEqual(prevEntitiesRef.current, {})) {
371+
if (fastDeepEqual(prevEntitiesRef.current, [])) {
372372
return prevEntitiesRef.current;
373373
} else {
374-
prevEntitiesRef.current = {};
375-
return {};
374+
prevEntitiesRef.current = [];
375+
return prevEntitiesRef.current;
376376
}
377377
}
378378

@@ -406,10 +406,12 @@ export function createFunctions<T extends SchemaDefinition>(schema: T) {
406406
filteredEntities[entityId] = resolvedEntity;
407407
}
408408

409-
if (fastDeepEqual(prevEntitiesRef.current, filteredEntities)) {
409+
const filteredEntitiesArray = Object.values(filteredEntities);
410+
411+
if (fastDeepEqual(prevEntitiesRef.current, filteredEntitiesArray)) {
410412
return prevEntitiesRef.current;
411413
} else {
412-
prevEntitiesRef.current = filteredEntities;
414+
prevEntitiesRef.current = filteredEntitiesArray;
413415
return prevEntitiesRef.current;
414416
}
415417

packages/graph-framework/src/index.test.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ describe("Library Tests", () => {
105105
});
106106

107107
const events = queryResult.current;
108-
expect(Object.keys(events)).toHaveLength(1);
108+
expect(events).toHaveLength(1);
109109
});
110110

111111
it("should create and query entities with relations", () => {
@@ -144,9 +144,9 @@ describe("Library Tests", () => {
144144

145145
// Wait for the hook to update
146146
const events = queryResult.current;
147-
expect(Object.keys(events)).toHaveLength(1);
147+
expect(events).toHaveLength(1);
148148

149-
const event = Object.values(events)[0];
149+
const event = events[0];
150150
if (!event) {
151151
throw new Error("Event not found");
152152
}
@@ -235,9 +235,9 @@ describe("Library Tests", () => {
235235

236236
// Wait for the hook to update
237237
const people = queryResult.current;
238-
expect(Object.keys(people)).toHaveLength(1);
238+
expect(people).toHaveLength(1);
239239

240-
const person = Object.values(people)[0];
240+
const person = people[0];
241241
if (!person) {
242242
throw new Error("Person not found");
243243
}
@@ -273,8 +273,8 @@ describe("Library Tests", () => {
273273

274274
act(() => {
275275
const badges = queryResult.current;
276-
expect(Object.keys(badges)).toHaveLength(1);
277-
badgeId = Object.keys(badges)[0];
276+
expect(badges).toHaveLength(1);
277+
badgeId = badges[0]?.id;
278278
});
279279

280280
act(() => {
@@ -284,7 +284,7 @@ describe("Library Tests", () => {
284284

285285
act(() => {
286286
const badgesAfterDelete = queryResult.current;
287-
expect(Object.keys(badgesAfterDelete)).toHaveLength(0);
287+
expect(badgesAfterDelete).toHaveLength(0);
288288
});
289289
});
290290
});

0 commit comments

Comments
 (0)