- {availableAccounts.map((invitee) => {
- return (
-
- );
- })}
-
*/}
diff --git a/apps/events/src/routes/space/$spaceId/playground.tsx b/apps/events/src/routes/space/$spaceId/playground.tsx
index 72956372..42ef49c3 100644
--- a/apps/events/src/routes/space/$spaceId/playground.tsx
+++ b/apps/events/src/routes/space/$spaceId/playground.tsx
@@ -1,6 +1,7 @@
+import { InviteToSpace } from '@/components/invite-to-space';
+import { TodosPublic } from '@/components/todo/todos-public';
import { HypergraphSpaceProvider, useHypergraphApp } from '@graphprotocol/hypergraph-react';
import { createFileRoute } from '@tanstack/react-router';
-import { TodosPublic } from '@/components/todo/todos-public';
export const Route = createFileRoute('/space/$spaceId/playground')({
component: PlaygroundRouteComponent,
@@ -17,6 +18,8 @@ function PlaygroundRouteComponent() {
return (
+
+
diff --git a/apps/privy-login-example/src/routes/space/$spaceId/index.tsx b/apps/privy-login-example/src/routes/space/$spaceId/index.tsx
index dd0b1443..dd61a5d9 100644
--- a/apps/privy-login-example/src/routes/space/$spaceId/index.tsx
+++ b/apps/privy-login-example/src/routes/space/$spaceId/index.tsx
@@ -1,12 +1,12 @@
-import { HypergraphSpaceProvider, useHypergraphApp } from '@graphprotocol/hypergraph-react';
-import { createFileRoute } from '@tanstack/react-router';
-import { useState } from 'react';
import { DevTool } from '@/components/dev-tool';
import { Todos } from '@/components/todos';
import { TodosReadOnly } from '@/components/todos-read-only';
import { TodosReadOnlyFilter } from '@/components/todos-read-only-filter';
import { Button } from '@/components/ui/button';
import { Users } from '@/components/users';
+import { HypergraphSpaceProvider, useHypergraphApp } from '@graphprotocol/hypergraph-react';
+import { createFileRoute } from '@tanstack/react-router';
+import { useState } from 'react';
export const Route = createFileRoute('/space/$spaceId/')({
component: Space,
@@ -29,24 +29,6 @@ function Space() {
{show2ndTodos &&
}
- {/*
Invite people
-
- {availableAccounts.map((invitee) => {
- return (
-
- );
- })}
-
*/}
diff --git a/apps/server/src/websocket.ts b/apps/server/src/websocket.ts
index e3abac73..8e03a5be 100644
--- a/apps/server/src/websocket.ts
+++ b/apps/server/src/websocket.ts
@@ -259,17 +259,10 @@ export const WebSocketLayer = HttpLayerRouter.add(
keyBoxes: [], // No keyBoxes needed for accepting invitations
});
- // Get the updated space data
- const space = yield* spacesService.getSpace({
- spaceId: request.spaceId,
- accountAddress,
- appIdentityAddress: address,
- });
-
// Send the updated space back to the client
- const outgoingMessage: Messages.ResponseSpace = {
- type: 'space',
- ...space,
+ const outgoingMessage: Messages.ResponseInvitationAccepted = {
+ type: 'invitation-accepted',
+ invitationId: request.event.transaction.id,
};
yield* responseMailbox.offer(Messages.serializeV2(outgoingMessage));
diff --git a/docs/docs/space-invitations.md b/docs/docs/space-invitations.md
index 7fdd712d..a03ca809 100644
--- a/docs/docs/space-invitations.md
+++ b/docs/docs/space-invitations.md
@@ -9,9 +9,7 @@ const { inviteToSpace } = useHypergraphApp();
inviteToSpace({
space: "space-id",
- invitee: {
- accountAddress: "0x1234567890123456789012345678901234567890",
- },
+ inviteeAccountAddress: "0x1234567890123456789012345678901234567890"
});
```
diff --git a/packages/hypergraph-react/src/HypergraphAppContext.tsx b/packages/hypergraph-react/src/HypergraphAppContext.tsx
index e50eb65e..2cc7b998 100644
--- a/packages/hypergraph-react/src/HypergraphAppContext.tsx
+++ b/packages/hypergraph-react/src/HypergraphAppContext.tsx
@@ -1,10 +1,10 @@
'use client';
-import { automergeWasmBase64 } from '@automerge/automerge/automerge.wasm.base64';
-import * as automerge from '@automerge/automerge/slim';
import type { DocHandle } from '@automerge/automerge-repo';
-import { Repo } from '@automerge/automerge-repo/slim';
import { RepoContext } from '@automerge/automerge-repo-react-hooks';
+import { Repo } from '@automerge/automerge-repo/slim';
+import { automergeWasmBase64 } from '@automerge/automerge/automerge.wasm.base64';
+import * as automerge from '@automerge/automerge/slim';
import { Graph } from '@graphprotocol/grc-20';
import {
Connect,
@@ -91,7 +91,7 @@ export type HypergraphAppCtx = {
listInvitations(): void;
acceptInvitation(params: Readonly<{ invitation: Messages.Invitation }>): Promise;
subscribeToSpace(params: Readonly<{ spaceId: string }>): void;
- inviteToSpace(params: Readonly<{ space: SpaceStorageEntry; invitee: { accountAddress: Address } }>): Promise;
+ inviteToSpace(params: Readonly<{ space: string; inviteeAccountAddress: Address }>): Promise;
getVerifiedIdentity(
accountAddress: string,
publicKey: string | null,
@@ -927,6 +927,13 @@ export function HypergraphAppProvider({
});
break;
}
+ case 'invitation-accepted': {
+ store.send({
+ type: 'invitationAccepted',
+ id: response.invitationId,
+ });
+ break;
+ }
default: {
Utils.assertExhaustive(response);
}
@@ -1313,16 +1320,14 @@ export function HypergraphAppProvider({
const inviteToSpace = useCallback(
async ({
- space,
- invitee,
+ space: spaceId,
+ inviteeAccountAddress,
}: Readonly<{
- space: SpaceStorageEntry;
- invitee: {
- accountAddress: string;
- };
+ space: string;
+ inviteeAccountAddress: Address;
}>) => {
if (!identity && !privyIdentity) {
- throw new Error('No identity found');
+ throw new Error('No identity found');
}
const encryptionPrivateKey = identity?.encryptionPrivateKey || privyIdentity?.encryptionPrivateKey;
const encryptionPublicKey = identity?.encryptionPublicKey || privyIdentity?.encryptionPublicKey;
@@ -1338,12 +1343,13 @@ export function HypergraphAppProvider({
) {
throw new Error('Missing keys');
}
- if (!space.state) {
- console.error('No state found for space');
+ const space = store.getSnapshot().context.spaces.find((s) => s.id === spaceId);
+ if (space === undefined || space.state === undefined) {
+ console.error('No space or space state found', spaceId);
return;
}
const inviteeWithKeys = await Identity.getVerifiedIdentity(
- invitee.accountAddress,
+ inviteeAccountAddress,
null,
appId,
syncServerUri,
@@ -1378,7 +1384,7 @@ export function HypergraphAppProvider({
ciphertext: Utils.bytesToHex(keyBox.keyBoxCiphertext),
nonce: Utils.bytesToHex(keyBox.keyBoxNonce),
authorPublicKey: encryptionPublicKey,
- accountAddress: invitee.accountAddress,
+ accountAddress: inviteeAccountAddress,
};
});
diff --git a/packages/hypergraph/src/connect/parse-auth-params.ts b/packages/hypergraph/src/connect/parse-auth-params.ts
index 633a1170..8e7a9169 100644
--- a/packages/hypergraph/src/connect/parse-auth-params.ts
+++ b/packages/hypergraph/src/connect/parse-auth-params.ts
@@ -24,7 +24,6 @@ export const parseAuthParams = (
}
try {
- console.log('data', data);
const result = decodePayload(data as ConnectAuthPayload);
if (Either.isLeft(result)) {
diff --git a/packages/hypergraph/src/messages/types.ts b/packages/hypergraph/src/messages/types.ts
index d2332e8e..f2ef0952 100644
--- a/packages/hypergraph/src/messages/types.ts
+++ b/packages/hypergraph/src/messages/types.ts
@@ -367,6 +367,13 @@ export const ResponseUpdateConfirmed = Schema.Struct({
spaceId: Schema.String,
});
+export const ResponseInvitationAccepted = Schema.Struct({
+ type: Schema.Literal('invitation-accepted'),
+ invitationId: Schema.String,
+});
+
+export type ResponseInvitationAccepted = Schema.Schema.Type;
+
export type ResponseUpdateConfirmed = Schema.Schema.Type;
export const ResponseUpdatesNotification = Schema.Struct({
@@ -433,6 +440,7 @@ export const ResponseMessage = Schema.Union(
ResponseAccountInboxMessage,
ResponseAccountInboxMessages,
ResponseAccountInboxes,
+ ResponseInvitationAccepted,
);
export type ResponseMessage = Schema.Schema.Type;
diff --git a/packages/hypergraph/src/store.ts b/packages/hypergraph/src/store.ts
index 6f24a500..aa6b550a 100644
--- a/packages/hypergraph/src/store.ts
+++ b/packages/hypergraph/src/store.ts
@@ -92,6 +92,7 @@ const initialStoreContext: StoreContext = {
type StoreEvent =
| { type: 'setInvitations'; invitations: Invitation[] }
+ | { type: 'invitationAccepted'; id: string }
| { type: 'setMapping'; mapping: Mapping }
| { type: 'reset' }
| { type: 'addUpdateInFlight'; updateId: string }
@@ -171,6 +172,12 @@ export const store: Store = create
invitations: event.invitations,
};
},
+ invitationAccepted: (context, event: { id: string }) => {
+ return {
+ ...context,
+ invitations: context.invitations.filter((invitation) => invitation.id !== event.id),
+ };
+ },
setMapping: (context, event: { mapping: Mapping }) => {
return {
...context,