import { Fragment, useState, useEffect } from 'react'; import { useNavigate } from 'react-router'; import { Button, Card, CardContent, Dialog, DialogActions, DialogContent, DialogTitle, Paper, Stack, Typography } from'@mui/material'; import { Device, LinkDeviceOffer } from '@hyper-hyper-space/home'; import { Identity, MemoryBackend, Mesh, Resources, RNGImpl, RSAKeyPair, Store, WordCode } from '@hyper-hyper-space/core'; import { HyperBrowserConfig } from '../../../model/HyperBrowserConfig'; import LinkDeviceDialog from './LinkDeviceDialog'; import { DateUtils } from '../../../model/DateUtils'; function CreateLinkDeviceOfferDialog() { const navigate = useNavigate(); const [wordCode, setWordCode] = useState(); const [offer, setOffer] = useState(); const [reply, setReply] = useState<{id: Identity, remoteDevice: Device}>(); useEffect(() => { let offer : LinkDeviceOffer | undefined; let resources : Resources | undefined; const createOffer = async () => { await new Promise(r => setTimeout(r, 0)); const backend = new MemoryBackend(new RNGImpl().randomHexString(128)); await backend.ready(); const store = new Store(backend); const mesh = new Mesh(); resources = await Resources.create({mesh: mesh, store: store}); const code = new RNGImpl().randomHexString(48); const today = DateUtils.getCurrentDay(); offer = new LinkDeviceOffer(code + DateUtils.dayToHex(today)); setOffer(offer); store.setResources(resources); await store.save(offer); //offer.setResources(resources); let gotReply = false; offer.reply?.addObserver(() => { if (!gotReply) { offer?.decodeReply().then(async (reply: {id: Identity, remoteDevice: Device} |undefined) => { if (reply === undefined) { alert('Error receiving your Home Space info.') offer?.replyReceivingStatus?.setValue('error'); } else { reply.id.forgetResources(); reply.remoteDevice.forgetResources(); setReply(reply); gotReply = true; offer?.replyReceivingStatus?.setValue('success'); } offer?.replyReceivingStatus?.saveQueuedOps(); }); } }); setWordCode(WordCode.english.encode(code)); offer.startSync(true); } createOffer(); return () => { console.log('cleaning up offer...'); if (offer !== undefined) { offer.stopSync(); } if (resources !== undefined) { resources.store?.close(); resources.mesh?.pod?.shutdown(); } }; }, []); const cancel = () => { navigate('/start'); } return ( {reply === undefined && Link this device to your Home Space {/* If you've already set up a Home Space, you can import your Home Space here. It will be kept synchronized automatically! */} {wordCode !== undefined && Open your Home Space in your other device, go to Settings > Linked Devices on the upper right corner and then click on add device. Use the following device code: {wordCode[0]} {wordCode[1]} {wordCode[2]} {wordCode[3]} Once you've done it, you'll need to come back here to complete the process. } {wordCode === undefined && Preparing to link this device... } } {reply !== undefined && } ); } export default CreateLinkDeviceOfferDialog;