Skip to content

Commit 57bc847

Browse files
authored
implement prepare publish (create only) (#285)
1 parent c07a36d commit 57bc847

File tree

15 files changed

+274
-115
lines changed

15 files changed

+274
-115
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import {
2+
preparePublish,
3+
publishOps,
4+
useCreateEntity,
5+
useHypergraphApp,
6+
useQuery,
7+
useSpaces,
8+
} from '@graphprotocol/hypergraph-react';
9+
import { useState } from 'react';
10+
import { Event } from '../../schema';
11+
import { Button } from '../ui/button';
12+
import { Input } from '../ui/input';
13+
14+
export const Events = () => {
15+
const { data: eventsLocalData } = useQuery(Event, { mode: 'private' });
16+
const createEvent = useCreateEntity(Event);
17+
const { getSmartSessionClient } = useHypergraphApp();
18+
const { data: spaces } = useSpaces({ mode: 'public' });
19+
const [selectedSpace, setSelectedSpace] = useState<string>('');
20+
21+
const handlePublish = async (event: Event) => {
22+
if (!selectedSpace) {
23+
alert('No space selected');
24+
return;
25+
}
26+
const { ops } = await preparePublish({ entity: event, publicSpace: selectedSpace });
27+
const smartSessionClient = await getSmartSessionClient();
28+
if (!smartSessionClient) {
29+
throw new Error('Missing smartSessionClient');
30+
}
31+
const publishResult = await publishOps({
32+
ops,
33+
space: selectedSpace,
34+
name: 'Publish Event',
35+
walletClient: smartSessionClient,
36+
});
37+
console.log(publishResult, ops);
38+
};
39+
40+
return (
41+
<>
42+
<h2 className="text-2xl font-bold">Events (Local)</h2>
43+
{eventsLocalData.map((event) => (
44+
<div key={event.id} className="flex flex-row items-center gap-2">
45+
<h2>{event.name}</h2>
46+
<div className="text-xs">{event.id}</div>
47+
<select
48+
value={selectedSpace}
49+
onChange={(e) => setSelectedSpace(e.target.value)}
50+
className="border border-gray-300 rounded-md p-2"
51+
>
52+
<option value="">Select a space</option>
53+
{spaces?.map((space) => (
54+
<option key={space.id} value={space.id}>
55+
{space.name}
56+
</option>
57+
))}
58+
</select>
59+
<Button variant="secondary" size="sm" onClick={() => handlePublish(event)}>
60+
Publish
61+
</Button>
62+
</div>
63+
))}
64+
<form
65+
onSubmit={(e) => {
66+
e.preventDefault();
67+
const formData = new FormData(e.target as HTMLFormElement);
68+
const name = formData.get('name') as string;
69+
createEvent({ name });
70+
}}
71+
>
72+
<Input type="text" name="name" />
73+
<Button type="submit">Create Event</Button>
74+
</form>
75+
</>
76+
);
77+
};

apps/events/src/components/todo/todos-public.tsx

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,4 @@
1-
import { Id } from '@graphprotocol/grc-20';
2-
import {
3-
_generateDeleteOps,
4-
publishOps,
5-
useCreateEntity,
6-
_useGenerateCreateOps as useGenerateCreateOps,
7-
useHypergraphApp,
8-
useQuery,
9-
useSpace,
10-
} from '@graphprotocol/hypergraph-react';
1+
import { _generateDeleteOps, publishOps, useHypergraphApp, useQuery, useSpace } from '@graphprotocol/hypergraph-react';
112
import { Todo2 } from '../../schema';
123
import { Spinner } from '../spinner';
134
import { Button } from '../ui/button';
@@ -24,9 +15,6 @@ export const TodosPublic = () => {
2415
include: { assignees: {} },
2516
});
2617

27-
const createTodo = useCreateEntity(Todo2);
28-
const generateCreateOps = useGenerateCreateOps(Todo2);
29-
3018
return (
3119
<>
3220
<div className="flex flex-row gap-4 items-center">
@@ -69,36 +57,6 @@ export const TodosPublic = () => {
6957
</Button>
7058
</div>
7159
))}
72-
<Button
73-
onClick={async () => {
74-
const smartSessionClient = await getSmartSessionClient();
75-
if (!smartSessionClient) {
76-
throw new Error('Missing smartSessionClient');
77-
}
78-
const userId = Id.Id('8zPJjTGLBDPtUcj6q2tghg');
79-
const todo = createTodo({
80-
name: 'New Todo 22',
81-
checked: false,
82-
assignees: [userId],
83-
due: new Date('2025-08-20'),
84-
amount: 200,
85-
point: [12.34, 56.78],
86-
website: new URL('https://example.com'),
87-
});
88-
console.log('todo', todo);
89-
const { ops } = generateCreateOps(todo);
90-
console.log('ops', ops);
91-
const result = await publishOps({
92-
ops,
93-
walletClient: smartSessionClient,
94-
space: spaceId,
95-
name: 'Create Todo',
96-
});
97-
console.log('result', result);
98-
}}
99-
>
100-
Create
101-
</Button>
10260
</>
10361
);
10462
};

apps/events/src/routeTree.gen.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { Route as SpaceSpaceIdIndexImport } from './routes/space/$spaceId/index'
2222
import { Route as SpaceSpaceIdUsersImport } from './routes/space/$spaceId/users'
2323
import { Route as SpaceSpaceIdPublicIntegrationImport } from './routes/space/$spaceId/public-integration'
2424
import { Route as SpaceSpaceIdPlaygroundImport } from './routes/space/$spaceId/playground'
25+
import { Route as SpaceSpaceIdEventsImport } from './routes/space/$spaceId/events'
2526
import { Route as SpaceSpaceIdChatImport } from './routes/space/$spaceId/chat'
2627

2728
// Create Virtual Routes
@@ -98,6 +99,12 @@ const SpaceSpaceIdPlaygroundRoute = SpaceSpaceIdPlaygroundImport.update({
9899
getParentRoute: () => SpaceSpaceIdRoute,
99100
} as any)
100101

102+
const SpaceSpaceIdEventsRoute = SpaceSpaceIdEventsImport.update({
103+
id: '/events',
104+
path: '/events',
105+
getParentRoute: () => SpaceSpaceIdRoute,
106+
} as any)
107+
101108
const SpaceSpaceIdChatRoute = SpaceSpaceIdChatImport.update({
102109
id: '/chat',
103110
path: '/chat',
@@ -164,6 +171,13 @@ declare module '@tanstack/react-router' {
164171
preLoaderRoute: typeof SpaceSpaceIdChatImport
165172
parentRoute: typeof SpaceSpaceIdImport
166173
}
174+
'/space/$spaceId/events': {
175+
id: '/space/$spaceId/events'
176+
path: '/events'
177+
fullPath: '/space/$spaceId/events'
178+
preLoaderRoute: typeof SpaceSpaceIdEventsImport
179+
parentRoute: typeof SpaceSpaceIdImport
180+
}
167181
'/space/$spaceId/playground': {
168182
id: '/space/$spaceId/playground'
169183
path: '/playground'
@@ -199,6 +213,7 @@ declare module '@tanstack/react-router' {
199213

200214
interface SpaceSpaceIdRouteChildren {
201215
SpaceSpaceIdChatRoute: typeof SpaceSpaceIdChatRoute
216+
SpaceSpaceIdEventsRoute: typeof SpaceSpaceIdEventsRoute
202217
SpaceSpaceIdPlaygroundRoute: typeof SpaceSpaceIdPlaygroundRoute
203218
SpaceSpaceIdPublicIntegrationRoute: typeof SpaceSpaceIdPublicIntegrationRoute
204219
SpaceSpaceIdUsersRoute: typeof SpaceSpaceIdUsersRoute
@@ -207,6 +222,7 @@ interface SpaceSpaceIdRouteChildren {
207222

208223
const SpaceSpaceIdRouteChildren: SpaceSpaceIdRouteChildren = {
209224
SpaceSpaceIdChatRoute: SpaceSpaceIdChatRoute,
225+
SpaceSpaceIdEventsRoute: SpaceSpaceIdEventsRoute,
210226
SpaceSpaceIdPlaygroundRoute: SpaceSpaceIdPlaygroundRoute,
211227
SpaceSpaceIdPublicIntegrationRoute: SpaceSpaceIdPublicIntegrationRoute,
212228
SpaceSpaceIdUsersRoute: SpaceSpaceIdUsersRoute,
@@ -226,6 +242,7 @@ export interface FileRoutesByFullPath {
226242
'/friends/$accountId': typeof FriendsAccountIdRoute
227243
'/space/$spaceId': typeof SpaceSpaceIdRouteWithChildren
228244
'/space/$spaceId/chat': typeof SpaceSpaceIdChatRoute
245+
'/space/$spaceId/events': typeof SpaceSpaceIdEventsRoute
229246
'/space/$spaceId/playground': typeof SpaceSpaceIdPlaygroundRoute
230247
'/space/$spaceId/public-integration': typeof SpaceSpaceIdPublicIntegrationRoute
231248
'/space/$spaceId/users': typeof SpaceSpaceIdUsersRoute
@@ -240,6 +257,7 @@ export interface FileRoutesByTo {
240257
'/account-inbox/$inboxId': typeof AccountInboxInboxIdRoute
241258
'/friends/$accountId': typeof FriendsAccountIdRoute
242259
'/space/$spaceId/chat': typeof SpaceSpaceIdChatRoute
260+
'/space/$spaceId/events': typeof SpaceSpaceIdEventsRoute
243261
'/space/$spaceId/playground': typeof SpaceSpaceIdPlaygroundRoute
244262
'/space/$spaceId/public-integration': typeof SpaceSpaceIdPublicIntegrationRoute
245263
'/space/$spaceId/users': typeof SpaceSpaceIdUsersRoute
@@ -256,6 +274,7 @@ export interface FileRoutesById {
256274
'/friends/$accountId': typeof FriendsAccountIdRoute
257275
'/space/$spaceId': typeof SpaceSpaceIdRouteWithChildren
258276
'/space/$spaceId/chat': typeof SpaceSpaceIdChatRoute
277+
'/space/$spaceId/events': typeof SpaceSpaceIdEventsRoute
259278
'/space/$spaceId/playground': typeof SpaceSpaceIdPlaygroundRoute
260279
'/space/$spaceId/public-integration': typeof SpaceSpaceIdPublicIntegrationRoute
261280
'/space/$spaceId/users': typeof SpaceSpaceIdUsersRoute
@@ -273,6 +292,7 @@ export interface FileRouteTypes {
273292
| '/friends/$accountId'
274293
| '/space/$spaceId'
275294
| '/space/$spaceId/chat'
295+
| '/space/$spaceId/events'
276296
| '/space/$spaceId/playground'
277297
| '/space/$spaceId/public-integration'
278298
| '/space/$spaceId/users'
@@ -286,6 +306,7 @@ export interface FileRouteTypes {
286306
| '/account-inbox/$inboxId'
287307
| '/friends/$accountId'
288308
| '/space/$spaceId/chat'
309+
| '/space/$spaceId/events'
289310
| '/space/$spaceId/playground'
290311
| '/space/$spaceId/public-integration'
291312
| '/space/$spaceId/users'
@@ -300,6 +321,7 @@ export interface FileRouteTypes {
300321
| '/friends/$accountId'
301322
| '/space/$spaceId'
302323
| '/space/$spaceId/chat'
324+
| '/space/$spaceId/events'
303325
| '/space/$spaceId/playground'
304326
| '/space/$spaceId/public-integration'
305327
| '/space/$spaceId/users'
@@ -368,6 +390,7 @@ export const routeTree = rootRoute
368390
"filePath": "space/$spaceId.tsx",
369391
"children": [
370392
"/space/$spaceId/chat",
393+
"/space/$spaceId/events",
371394
"/space/$spaceId/playground",
372395
"/space/$spaceId/public-integration",
373396
"/space/$spaceId/users",
@@ -378,6 +401,10 @@ export const routeTree = rootRoute
378401
"filePath": "space/$spaceId/chat.tsx",
379402
"parent": "/space/$spaceId"
380403
},
404+
"/space/$spaceId/events": {
405+
"filePath": "space/$spaceId/events.tsx",
406+
"parent": "/space/$spaceId"
407+
},
381408
"/space/$spaceId/playground": {
382409
"filePath": "space/$spaceId/playground.tsx",
383410
"parent": "/space/$spaceId"

apps/events/src/routes/space/$spaceId.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ function RouteComponent() {
2424
>
2525
Home
2626
</Link>
27+
<Link to={'/space/$spaceId/events'} params={{ spaceId }} className="px-3 py-2 text-sm font-medium rounded-md">
28+
Events
29+
</Link>
2730
<Link
2831
to={'/space/$spaceId/public-integration'}
2932
params={{ spaceId }}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Events } from '@/components/events/events';
2+
import { HypergraphSpaceProvider, useHypergraphApp } from '@graphprotocol/hypergraph-react';
3+
import { createFileRoute } from '@tanstack/react-router';
4+
export const Route = createFileRoute('/space/$spaceId/events')({
5+
component: RouteComponent,
6+
});
7+
8+
function RouteComponent() {
9+
const { spaceId } = Route.useParams();
10+
const { isConnecting, isLoadingSpaces } = useHypergraphApp();
11+
12+
if (isConnecting || isLoadingSpaces[spaceId]) {
13+
return <div className="flex justify-center items-center h-screen">Loading …</div>;
14+
}
15+
16+
return (
17+
<div className="flex flex-col gap-4 max-w-(--breakpoint-sm) mx-auto py-8">
18+
<HypergraphSpaceProvider space={spaceId}>
19+
<Events />
20+
</HypergraphSpaceProvider>
21+
</div>
22+
);
23+
}

packages/hypergraph-react/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ export {
2525
export { generateDeleteOps as _generateDeleteOps } from './internal/generate-delete-ops.js';
2626
export { useCreateEntityPublic as _useCreateEntityPublic } from './internal/use-create-entity-public.js';
2727
export { useDeleteEntityPublic as _useDeleteEntityPublic } from './internal/use-delete-entity-public.js';
28-
export { useGenerateCreateOps as _useGenerateCreateOps } from './internal/use-generate-create-ops.js';
2928
export { useQueryPublic as _useQueryPublic } from './internal/use-query-public.js';
29+
export { preparePublish } from './prepare-publish.js';
3030
export { publishOps } from './publish-ops.js';
3131
export type * from './types.js';
3232
export { useQuery } from './use-query.js';

packages/hypergraph-react/src/internal/use-generate-create-ops.tsx

Lines changed: 0 additions & 63 deletions
This file was deleted.

packages/hypergraph-react/src/internal/use-query-public.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ export const parseResult = <S extends Entity.AnyNoContext>(
312312
});
313313

314314
if (Either.isRight(decodeResult)) {
315-
data.push(decodeResult.right);
315+
data.push({ ...decodeResult.right, __schema: type });
316316
} else {
317317
invalidEntities.push(rawEntity);
318318
}

0 commit comments

Comments
 (0)