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