import { Dialog, DialogContent, DialogTitle, Stack, Typography, TextField, Card, CardContent, DialogActions, Button, Paper, IconButton, DialogContentText } from '@mui/material'; import InfoIcon from '@mui/icons-material/Info'; import { useState, useEffect, useRef, Fragment } from 'react'; import { useNavigate, useParams } from 'react-router'; import { Hash, Identity, MutableSet, RSAKeyPair, Space } from '@hyper-hyper-space/core'; import { HyperBrowserConfig } from '../../../model/HyperBrowserConfig'; import { DeviceInfo } from '../../../model/DeviceInfo'; import { useHyperBrowserEnv } from '../../../context/HyperBrowserContext'; import { Home, SpaceLink } from '@hyper-hyper-space/home'; import { TextSpace } from '../../../model/text/TextSpace'; // import { WikiSpace } from '@hyper-hyper-space/wiki-collab'; function CreateHomeDialog() { const navigate = useNavigate(); const cancel = () => { navigate('/start'); } const [showInfoDialog, setShowInfoDialog] = useState(false); const closeInfoDialog = () => { setShowInfoDialog(false); }; const openInfoDialog = () => { setShowInfoDialog(true); } const [showConfirmDialog, setShowConfirmDialog] = useState(false); const closeConfirmDialog = () => { setShowConfirmDialog(false); } const env = useHyperBrowserEnv(); const [showCreatingDialog, setShowCreatingDialog] = useState(false); const [name, setName] = useState(''); const [deviceName, setDeviceName] = useState(DeviceInfo.constructDeviceName('My first device')); const nameInput = useRef(null); const deviceNameInput = useRef(null); const [nameError, setNameError] = useState(false); const [deviceNameError, setDeviceNameError] = useState(false); const { next } = useParams(); const createHome = () => { let go = true; const nameError = name.trim() === ''; setNameError(nameError); go = go && !nameError; const deviceNameError = deviceName.trim() === ''; setDeviceNameError(deviceNameError); go = go && !deviceNameError; if (go) { setShowConfirmDialog(true); } }; const confirmCreateHome = () => { setShowConfirmDialog(false); setShowCreatingDialog(true); HyperBrowserConfig.createHome({name: name, type: 'Person'}, deviceName, env.homes.value as MutableSet, keypair).then(async (home: Home) => { // create a "My Notes" space and place it on the desktop const store = await HyperBrowserConfig.initHomeStore(home.getLastHash(), (err: string) => { throw(err); }) const myNotes = new TextSpace(); myNotes.setAuthor((home.getAuthor()) as Identity); const link = new SpaceLink(home.getAuthor() as Identity, myNotes); await link.name?.setValue('My Notes'); await store.save(link); home.desktop?.root?.items?.setStore(store); await home.desktop?.root?.items?.push(link); await home.desktop?.root?.items?.saveQueuedOps(); await store.close(); if (next === undefined) { navigate('/'); } else { navigate('/' + next); } }); } const handleNameChange = (event: React.ChangeEvent) => { setName(event.target.value); }; 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(); createHome(); } }; const [code, setCode] = useState(''); const [keypair, setKeypair] = useState(); useEffect(() => { RSAKeyPair.generate(2048).then((kp: RSAKeyPair) => { setKeypair(kp); }); }, []); const shuffle = () => { if (keypair !== undefined) { setKeypair(undefined); RSAKeyPair.generate(2048).then((kp: RSAKeyPair) => { setKeypair(kp); }); } }; useEffect(() => { if (keypair !== undefined) { setCode(Space.getWordCodingForHash(Identity.fromKeyPair({type: 'Person', name: name}, keypair).hash()).join(' ')); } else { setCode('...') } }, [name, keypair]); return ( Create a Home Space A Home Space enables you to use your web browser to host your spaces, and keeps them in sync. 🏠 Home Info: About your information The information you enter will be stored on your own device. It will be used to identify yourself when you connect and share spaces with other people. It doesn't have to be your real name, but it'd be helpful if your friends can easily associate this name with you. For security reasons your name cannot be changed later. The device name cannot be seen by others, and is used to help you link / unlink devices. Confirm your information For security reasons, the name you just entered can't be changed later. Creating {name}'s Home Space You will be redirected to your new Home Space in a few seconds... ); } export default CreateHomeDialog;