import { Dialog, DialogContent, DialogTitle, Stack, Typography, TextField, Card, CardContent, DialogActions, Button, Paper, IconButton, DialogContentText } from '@mui/material'; import { useState, useRef, Fragment } from 'react'; import { useNavigate, useParams } from 'react-router'; import { Hash, Identity, MutableSet } from '@hyper-hyper-space/core'; import { Device, Home, LinkDeviceOffer } from '@hyper-hyper-space/home'; import { HyperBrowserConfig } from '../../../model/HyperBrowserConfig'; import { DeviceInfo } from '../../../model/DeviceInfo'; import { useHyperBrowserEnv } from '../../../context/HyperBrowserContext'; function LinkDeviceDialog(params: {id: Identity, offer: LinkDeviceOffer, remoteDevice: Device}) { const navigate = useNavigate(); const cancel = () => { navigate('/start'); } const env = useHyperBrowserEnv(); const [showLinkingDialog, setShowLinkingDialog] = useState(false); const [deviceName, setDeviceName] = useState(DeviceInfo.constructDeviceName()); const deviceNameInput = useRef(null); const [deviceNameError, setDeviceNameError] = useState(false); const { next } = useParams(); const replicateHome = () => { let go = true; const deviceNameError = deviceName.trim() === ''; setDeviceNameError(deviceNameError); go = go && !deviceNameError; if (go) { setShowLinkingDialog(true); HyperBrowserConfig.createHome(params.id.info, deviceName, env.homes.value as MutableSet, params.id.getKeyPairIfExists()) .then(async (home: Home) => { console.log('created home') console.log(home); const store = params.offer.getStore(); await store.save(params.offer); console.log('saved offer') const resources = await HyperBrowserConfig.initHomeResources(home.hash(), (err: string) => { console.log('error verifying sync:') console.log(err); }); home.setResources(resources); const remoteDevice = params.remoteDevice.clone(); remoteDevice.setResources(resources); console.log(home.getAuthor() as Identity); await home.addDevice(/*params.*/remoteDevice); console.log('added remote device, starting sync...') await home.startSync(true); console.log('sync started') const localDevice = (await home.findLocalDevice()) as Device; localDevice.forgetResources(); localDevice.setAuthor(home.getAuthor() as Identity); localDevice.name?.setAuthor(home.getAuthor() as Identity); localDevice.name?.addWriter(home.getAuthor() as Identity); await params.offer.newDevice?.setValue(localDevice); await params.offer.newDevice?.saveQueuedOps(); console.log('added local device, waiting for remote...') const replRemoteDevice = home.devices?.get(params.remoteDevice.hash()) as Device; console.log('remote device is:') console.log(replRemoteDevice); while (replRemoteDevice.name?.getValue() === undefined) { console.log('waiting for sync...') await new Promise(r => setTimeout(r, 500)); } console.log('verified sync!'); await new Promise(r => setTimeout(r, 1000)); // Give it a little while to try to complete sync // of devices, will be finished after reload if not. await home.stopSync(); resources.store?.close(); resources.mesh?.pod?.shutdown(); }) .then(() => { if (next === undefined) { navigate('/'); } else { navigate('/' + next); } }); } }; const handleDeviceNameChange = (event: React.ChangeEvent) => { setDeviceName(event.target.value); }; const handleNameKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); deviceNameInput.current?.focus(); } }; const handleDeviceNameKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); replicateHome(); } }; return ( Link Device to your Home Space The contents of your Home Space will be replicated automatically to this device, and they will be kept in sync. 🏠 Home Info: Linking to {params.id.info?.name}'s Home Space You will be redirected to your Home Space in a few seconds... ); } export default LinkDeviceDialog;