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
>
);
}