Skip to content

Commit 7dd7f11

Browse files
committed
fix: simpler api for login
1 parent bde594d commit 7dd7f11

File tree

3 files changed

+113
-55
lines changed

3 files changed

+113
-55
lines changed

apps/events/src/routes/authenticate-success.tsx

Lines changed: 5 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,54 +16,14 @@ export const Route = createFileRoute('/authenticate-success')({
1616

1717
function RouteComponent() {
1818
const { ciphertext, nonce } = Route.useSearch();
19-
const { setIdentity } = useHypergraphApp();
19+
const { processConnectAuthSuccess } = useHypergraphApp();
2020
const navigate = useNavigate();
2121

2222
useEffect(() => {
23-
const storedNonce = localStorage.getItem('geo-connect-auth-nonce');
24-
const storedExpiry = Number.parseInt(localStorage.getItem('geo-connect-auth-expiry') ?? '0', 10);
25-
const storedSecretKey = localStorage.getItem('geo-connect-auth-secret-key');
26-
const storedPublicKey = localStorage.getItem('geo-connect-auth-public-key');
27-
if (!storedNonce || !storedExpiry || !storedSecretKey || !storedPublicKey) {
28-
alert('Failed to authenticate due missing data in the local storage');
29-
return;
30-
}
31-
32-
try {
33-
const parsedAuthParams = Effect.runSync(
34-
Connect.parseCallbackParams({
35-
ciphertext,
36-
nonce,
37-
storedNonce,
38-
storedExpiry,
39-
storedSecretKey,
40-
storedPublicKey,
41-
}),
42-
);
43-
44-
setIdentity({
45-
address: parsedAuthParams.appIdentityAddress,
46-
addressPrivateKey: parsedAuthParams.appIdentityAddressPrivateKey,
47-
accountAddress: parsedAuthParams.accountAddress,
48-
permissionId: parsedAuthParams.permissionId,
49-
signaturePublicKey: parsedAuthParams.signaturePublicKey,
50-
signaturePrivateKey: parsedAuthParams.signaturePrivateKey,
51-
encryptionPublicKey: parsedAuthParams.encryptionPublicKey,
52-
encryptionPrivateKey: parsedAuthParams.encryptionPrivateKey,
53-
sessionToken: parsedAuthParams.sessionToken,
54-
sessionTokenExpires: parsedAuthParams.sessionTokenExpires,
55-
});
56-
localStorage.removeItem('geo-connect-auth-nonce');
57-
localStorage.removeItem('geo-connect-auth-expiry');
58-
localStorage.removeItem('geo-connect-auth-secret-key');
59-
localStorage.removeItem('geo-connect-auth-public-key');
60-
console.log('redirecting to /');
61-
navigate({ to: '/', replace: true });
62-
} catch (error) {
63-
console.error(error);
64-
alert('Failed to authenticate due invalid callback');
65-
}
66-
}, [ciphertext, nonce, setIdentity, navigate]);
23+
processConnectAuthSuccess({ storage: localStorage, ciphertext, nonce });
24+
console.log('redirecting to /');
25+
navigate({ to: '/', replace: true });
26+
}, [ciphertext, nonce, processConnectAuthSuccess, navigate]);
6727

6828
return <div>Authenticating …</div>;
6929
}

apps/events/src/routes/login.lazy.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import { Button } from '@/components/ui/button';
2-
import { Connect } from '@graphprotocol/hypergraph';
2+
import { useHypergraphApp } from '@graphprotocol/hypergraph-react';
33
import { createLazyFileRoute } from '@tanstack/react-router';
44

55
export const Route = createLazyFileRoute('/login')({
66
component: () => <Login />,
77
});
88

99
function Login() {
10+
const { redirectToConnect } = useHypergraphApp();
1011
return (
1112
<div className="flex flex-1 justify-center items-center flex-col gap-4">
1213
<Button
1314
onClick={() => {
14-
const { url, nonce, expiry, secretKey, publicKey } = Connect.createAuthUrl({
15-
connectUrl: 'http://localhost:5180/authenticate',
16-
redirectUrl: 'http://localhost:5173/authenticate-success',
15+
redirectToConnect({
16+
storage: localStorage,
17+
connectUrl: 'http://localhost:5180',
18+
successUrl: 'http://localhost:5173/authenticate-success',
1719
appId: '93bb8907-085a-4a0e-83dd-62b0dc98e793',
20+
redirectFn: (url: URL) => {
21+
window.location.href = url.toString();
22+
},
1823
});
19-
localStorage.setItem('geo-connect-auth-nonce', nonce);
20-
localStorage.setItem('geo-connect-auth-expiry', expiry.toString());
21-
localStorage.setItem('geo-connect-auth-secret-key', secretKey);
22-
localStorage.setItem('geo-connect-auth-public-key', publicKey);
23-
window.location.href = url.toString();
2424
}}
2525
>
2626
Authenticate with Connect

packages/hypergraph-react/src/HypergraphAppContext.tsx

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,18 @@ export type HypergraphAppCtx = {
103103
authPolicy?: Inboxes.InboxSenderAuthPolicy;
104104
index?: number;
105105
}): Promise<string>;
106+
redirectToConnect(params: {
107+
storage: Identity.Storage;
108+
successUrl: string;
109+
appId: string;
110+
connectUrl: string;
111+
redirectFn: (url: URL) => void;
112+
}): void;
113+
processConnectAuthSuccess(params: {
114+
storage: Identity.Storage;
115+
ciphertext: string;
116+
nonce: string;
117+
}): void;
106118
};
107119

108120
export const HypergraphAppContext = createContext<HypergraphAppCtx>({
@@ -175,6 +187,18 @@ export const HypergraphAppContext = createContext<HypergraphAppCtx>({
175187
async ensureSpaceInbox() {
176188
throw new Error('ensureSpaceInbox is missing');
177189
},
190+
redirectToConnect(params: {
191+
storage: Identity.Storage;
192+
successUrl: string;
193+
appId: string;
194+
connectUrl: string;
195+
redirectFn: (url: URL) => void;
196+
}) {
197+
throw new Error('redirectToConnect is missing');
198+
},
199+
processConnectAuthSuccess() {
200+
throw new Error('processConnectAuthSuccess is missing');
201+
},
178202
});
179203

180204
export function useHypergraphApp() {
@@ -862,7 +886,7 @@ export function HypergraphAppProvider({
862886
try {
863887
if (smartSessionClient?.account) {
864888
const result = await Graph.createSpace({
865-
editorAddress: smartSessionClient.account?.address,
889+
editorAddress: smartSessionClient.account.address,
866890
name,
867891
network: smartSessionClient.chain.id === Connect.GEO_TESTNET.id ? 'TESTNET' : 'MAINNET',
868892
});
@@ -1337,6 +1361,77 @@ export function HypergraphAppProvider({
13371361
[createSpaceInboxForContext],
13381362
);
13391363

1364+
const redirectToConnectForContext = useCallback(
1365+
(params: {
1366+
storage: Identity.Storage;
1367+
successUrl: string;
1368+
appId: string;
1369+
connectUrl: string;
1370+
redirectFn: (url: URL) => void;
1371+
}) => {
1372+
const { storage, successUrl, redirectFn, appId, connectUrl } = params;
1373+
const { url, nonce, expiry, secretKey, publicKey } = Connect.createAuthUrl({
1374+
connectUrl: `${connectUrl}/authenticate`,
1375+
redirectUrl: successUrl,
1376+
appId,
1377+
});
1378+
storage.setItem('geo-connect-auth-nonce', nonce);
1379+
storage.setItem('geo-connect-auth-expiry', expiry.toString());
1380+
storage.setItem('geo-connect-auth-secret-key', secretKey);
1381+
storage.setItem('geo-connect-auth-public-key', publicKey);
1382+
redirectFn(url);
1383+
},
1384+
[],
1385+
);
1386+
1387+
const processConnectAuthSuccessForContext = useCallback(
1388+
(params: { storage: Identity.Storage; ciphertext: string; nonce: string }) => {
1389+
const { storage, ciphertext, nonce } = params;
1390+
const storedNonce = storage.getItem('geo-connect-auth-nonce');
1391+
const storedExpiry = Number.parseInt(storage.getItem('geo-connect-auth-expiry') ?? '0', 10);
1392+
const storedSecretKey = storage.getItem('geo-connect-auth-secret-key');
1393+
const storedPublicKey = storage.getItem('geo-connect-auth-public-key');
1394+
if (!storedNonce || !storedExpiry || !storedSecretKey || !storedPublicKey) {
1395+
alert('Failed to authenticate due missing data in the local storage');
1396+
return;
1397+
}
1398+
1399+
try {
1400+
const parsedAuthParams = Effect.runSync(
1401+
Connect.parseCallbackParams({
1402+
ciphertext,
1403+
nonce,
1404+
storedNonce,
1405+
storedExpiry,
1406+
storedSecretKey,
1407+
storedPublicKey,
1408+
}),
1409+
);
1410+
1411+
setIdentity({
1412+
address: parsedAuthParams.appIdentityAddress,
1413+
addressPrivateKey: parsedAuthParams.appIdentityAddressPrivateKey,
1414+
accountAddress: parsedAuthParams.accountAddress,
1415+
permissionId: parsedAuthParams.permissionId,
1416+
signaturePublicKey: parsedAuthParams.signaturePublicKey,
1417+
signaturePrivateKey: parsedAuthParams.signaturePrivateKey,
1418+
encryptionPublicKey: parsedAuthParams.encryptionPublicKey,
1419+
encryptionPrivateKey: parsedAuthParams.encryptionPrivateKey,
1420+
sessionToken: parsedAuthParams.sessionToken,
1421+
sessionTokenExpires: parsedAuthParams.sessionTokenExpires,
1422+
});
1423+
storage.removeItem('geo-connect-auth-nonce');
1424+
storage.removeItem('geo-connect-auth-expiry');
1425+
storage.removeItem('geo-connect-auth-secret-key');
1426+
storage.removeItem('geo-connect-auth-public-key');
1427+
} catch (error) {
1428+
console.error(error);
1429+
alert('Failed to authenticate due to invalid callback');
1430+
}
1431+
},
1432+
[setIdentity],
1433+
);
1434+
13401435
useEffect(() => {
13411436
const setupRepo = async () => {
13421437
await automerge.next.initializeBase64Wasm(automergeWasmBase64);
@@ -1358,6 +1453,7 @@ export function HypergraphAppProvider({
13581453
setIdentity,
13591454
invitations,
13601455
createSpace: createSpaceForContext,
1456+
getSmartSessionClient: getSmartSessionClientForContext,
13611457
createSpaceInbox: createSpaceInboxForContext,
13621458
getLatestSpaceInboxMessages: getLatestSpaceInboxMessagesForContext,
13631459
listPublicSpaceInboxes: listPublicSpaceInboxesForContext,
@@ -1378,6 +1474,8 @@ export function HypergraphAppProvider({
13781474
isConnecting,
13791475
isLoadingSpaces,
13801476
ensureSpaceInbox: ensureSpaceInboxForContext,
1477+
redirectToConnect: redirectToConnectForContext,
1478+
processConnectAuthSuccess: processConnectAuthSuccessForContext,
13811479
}}
13821480
>
13831481
<QueryClientProvider client={queryClient}>

0 commit comments

Comments
 (0)