@@ -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
108120export 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
180204export 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