import React, { useCallback, useState, useEffect } 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 CopyButton from 'components/CopyButton'; import NetworkingKeys from 'components/NetworkingKeys'; import ProgressButton from 'components/ProgressButton'; import BridgeForm from 'form/BridgeForm'; import { useLocalRouter } from 'lib/LocalRouter'; import { useHosting } from 'store/hosting'; import DownloadKeyfileButton from 'components/DownloadKeyfileButton'; export default function UrbitOSHome() { 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(!showKeys), [ setShowKeys, showKeys, ]); 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() { const bind = useKeyfileGenerator(); const { keyfile, code, notice } = bind; const ship = useHosting(); const { syncStatus, url, unknown, running, sysEvents, runEvents, newEvents, bootProgress, bootMessage, } = ship; const [synced, setSynced] = useState(false); useEffect(() => { if (unknown && !synced) { syncStatus(); setSynced(true); } }, [syncStatus, unknown, setSynced, synced]); const createShip = useCallback(() => ship.create(keyfile), [keyfile, ship]); const name = useCurrentPointName(); const options = [{ text: 'Tlon', value: 'tlon' }]; const props = { name, options, ship }; const renderMain = useCallback(() => { if (ship.running) { return ( <> Open OS Disconnect ); } if (ship.missing) { return ( Connect ); } if (ship.pending) { return ( {bootMessage || 'Connecting'} ); } }, [ ship.missing, ship.running, ship.pending, bootProgress, bootMessage, keyfile, createShip, url, ]); const renderDetails = useCallback(() => { if (ship.running) { return ( <> {name} is connected to Tlon ); } if (ship.missing) { return ( <> Status: Disconnected
Last connected: 4m ago
); } }, [name, ship]); return ( <> Urbit OS {ship.running ? 'Connected' : 'Disconnected'} {() => ( <> {renderDetails()} {renderMain()} )} } detail={code || notice} disabled={!code} detailClassName="mono"> Login Code ); }