import React, { useCallback, useState, useEffect, useMemo } from 'react'; import cn from 'classnames'; import { Grid, Button, SelectInput, Flex } from 'indigo-react'; import * as ob from 'urbit-ob'; import { azimuth } from 'azimuth-js'; import { usePointCursor } from 'store/pointCursor'; import { usePointCache } from 'store/pointCache'; import useCurrentPointName from 'lib/useCurrentPointName'; import useKeyfileGenerator from 'lib/useKeyfileGenerator'; import * as need from 'lib/need'; import { OutButton, ForwardButton } from 'components/Buttons'; import { CopyButtonWide } from 'components/CopyButton'; import NetworkingKeys from 'components/NetworkingKeys'; import ProgressButton from 'components/ProgressButton'; import LoginButton from 'components/LoginButton'; import BridgeForm from 'form/BridgeForm'; import { useLocalRouter } from 'lib/LocalRouter'; import { useHosting } from 'store/hosting'; import DownloadKeyfileButton from 'components/DownloadKeyfileButton'; import useLifecycle from 'lib/useLifecycle'; import useLocalHosting from 'lib/useLocalHosting'; export default function UrbitOSHome({ manualNetworkSeed }) { const { pointCursor } = usePointCursor(); const { getDetails } = usePointCache(); const { push, names } = useLocalRouter(); const point = need.point(pointCursor); const details = need.details(getDetails(point)); const sponsor = ob.patp(details.sponsor); const [showKeys, setShowKeys] = useState(false); const showSponsor = azimuth.getPointSize(point) !== azimuth.PointSize.Galaxy; const toggleShowKeys = useCallback(() => setShowKeys(s => !s), [setShowKeys]); const goNetworkingKeys = useCallback(() => push(names.NETWORKING_KEYS), [ names, push, ]); const goChangeSponsor = useCallback(() => push(names.CHANGE_SPONSOR), [ push, names, ]); return ( <> Network {showSponsor && ( <> Change} onClick={goChangeSponsor}> {sponsor} SPONSOR )} Reset Networking Keys View Networking Keys {showKeys && } ); } // eslint-disable-next-line function Hosting({ manualNetworkSeed }) { const bind = useKeyfileGenerator(manualNetworkSeed); const { keyfile, code } = bind; const ship = useHosting(); const { syncStatus, url, unknown, bootProgress, bootMessage, disabled, } = ship; const { running: localRunning, url: localUrl } = useLocalHosting(); let running = useMemo(() => localRunning || ship.running, [ ship, localRunning, ]); useLifecycle(() => { syncStatus(); }); const createShip = useCallback(() => ship.create(keyfile), [keyfile, ship]); const name = useCurrentPointName(); const options = [{ text: 'Tlon', value: 'tlon' }]; const renderMain = useCallback(() => { if (localRunning) { return ( Open OS ); } if (ship.running) { return ( <> Open OS {/* Unsupported for now */} {/* */} {/* Disconnect */} {/* */} ); } if (ship.missing) { return ( Connect ); } if (ship.pending) { return ( {bootMessage || 'Connecting'} ); } }, [ localRunning, ship.running, ship.missing, ship.pending, localUrl, code, url, keyfile, createShip, bootProgress, bootMessage, ]); const renderDetails = useCallback(() => { if (ship.running) { return ( <> {name} is connected to Tlon ); } if (!keyfile && ship.missing) { return ( Please reset your networking keys in order to use hosting ); } }, [name, ship, keyfile]); return ( <> {disabled && ( Urbit OS )} {!disabled && ( Urbit OS {running ? 'Connected' : 'Disconnected'} {() => ( <> {renderDetails()} {renderMain()} {!localRunning && ( )} )} )} {code && ( Login Code )} ); }