on master help sign in
qol: Address PR feedback

- remove Hosting component and associated store - rename PointDetailsType --> L1Point - remove extraneous accessors from L1Point

commitf878f3d48123458e1616218e9a671632c26e17ed authortomholford <tomholford@users.noreply.github.com> dateWed 21 Jul 2021, 15:13 (5 years ago) parent8bc3748
5 files changed+4−487
src/store/hosting.js−37 src/store/lib/useHostingStore.js−244 src/types/PointDetailsType.ts → src/types/L1Point.ts+2−12 src/views/UrbitOS/Home.tsx+2−2 src/views/UrbitOS/Hosting.tsx−192
src/store/hosting.jsdeleted−37
@@ -1,37 +0,0 @@
1−import React, { createContext, useContext, forwardRef } from 'react';
2−
3−import useHostingStore from './lib/useHostingStore';
4−
5−import { NETWORK_TYPES } from '../lib/network';
6−
7−import { useNetwork } from 'store/network';
8−
9−export const HostingContext = createContext(null);
10−
11−const HOSTING_DETAILS = {
12− DEV: { url: '', domain: 'liam.tlon.network', disabled: true },
13− MAINNET: { url: '', domain: '', disabled: true },
14−};
15−
16−export function HostingProvider({ children }) {
17− const { networkType } = useNetwork();
18− const { url, domain, disabled } =
19− networkType === NETWORK_TYPES.MAINNET
20− ? HOSTING_DETAILS.MAINNET
21− : HOSTING_DETAILS.DEV;
22− const store = useHostingStore(url, domain, disabled);
23− return (
24− <HostingContext.Provider value={store}>{children}</HostingContext.Provider>
25− );
26−}
27−
28−export function useHosting() {
29− return useContext(HostingContext);
30−}
31−
32−export const withHosting = Component =>
33− forwardRef((props, ref) => (
34− <HostingContext.Consumer>
35− {store => <Component ref={ref} {...store} {...props} />}
36− </HostingContext.Consumer>
37− ));
src/store/lib/useHostingStore.jsdeleted−244
@@ -1,244 +0,0 @@
1−import { useState, useCallback, useMemo } from 'react';
2−import { Nothing } from 'folktale/maybe';
3−import * as ob from 'urbit-ob';
4−
5−import { getVaneName, getVaneNumber } from 'lib/hosting';
6−import SolarisClient from 'lib/SolarisClient';
7−
8−import { usePointCursor } from 'store/pointCursor';
9−
10−const STATE = {
11− UNKNOWN: 'UNKNOWN',
12− MISSING: 'MISSING',
13− RUNNING: 'RUNNING',
14− PENDING: 'PENDING',
15−};
16−
17−function useHostingStore(url, domain, disabled) {
18− const client = new SolarisClient(url);
19−
20− const { pointCursor } = usePointCursor();
21−
22− const [bootProgress, setBootProgress] = useState(0);
23− const [bootMessage, setBootMessage] = useState('Assembling Urbit');
24− const [startTime] = useState(Date.now());
25−
26− const [status, _setStatus] = useState(STATE.UNKNOWN);
27− const setStatus = useCallback(
28− s => {
29− _setStatus(s);
30− },
31− [_setStatus]
32− );
33−
34− const [sysEvents, setSysEvents] = useState([]);
35− const [newEvents, setNewEvents] = useState([]);
36− const [runEvents, setRunEvents] = useState([]);
37−
38− const [error, _setError] = useState();
39− const setError = useCallback(
40− error => {
41− _setError(error);
42− if (error) {
43− setStatus(STATE.UNKNOWN);
44− console.error(error);
45− }
46− },
47− [_setError, setStatus]
48− );
49−
50− const unknown = status === STATE.UNKNOWN;
51− const missing = status === STATE.MISSING;
52− const running = status === STATE.RUNNING;
53− const pending = status === STATE.PENDING;
54−
55− let syncStatus;
56−
57− const resetEvents = useCallback(() => {
58− setSysEvents([]);
59− setNewEvents([]);
60− setRunEvents([]);
61− }, [setSysEvents, setNewEvents, setRunEvents]);
62−
63− const newSource = useCallback(
64− (url, retry = 0) => {
65− let source = new EventSource(url);
66−
67− source.addEventListener('sys', event => {
68− const sysEvent = JSON.parse(event.data);
69− const time = new Date(sysEvent.object.firstTimestamp).getTime();
70− if (time > startTime) {
71− setSysEvents(previous => [...previous, sysEvent]);
72− }
73− });
74−
75− source.addEventListener('new', event => {
76− if (event.data !== '') {
77− setNewEvents(previous => [...previous, event.data]);
78− }
79− if (event.data === '1-b') {
80− setBootMessage('Compiling Hoon');
81− setBootProgress(0.2);
82− } else if (event.data === '1-c') {
83− setBootProgress(0.25);
84− } else if (event.data === '%arvo-assembly') {
85− setBootMessage('Compiling Urbit OS');
86− setBootProgress(0.3);
87− } else if (event.data.startsWith('[%vane %')) {
88− const vane = getVaneName(event.data.slice(8, 9));
89− setBootMessage(`Compiling vane: ${vane}`);
90− setBootProgress(0.3 + 0.05 * getVaneNumber(event.data.slice(8, 9)));
91− } else if (event.data === 'pier: boot complete') {
92− setBootMessage('Ship starting');
93− setBootProgress(0.85);
94− }
95− });
96−
97− source.addEventListener('run', event => {
98− if (event.data === 'goad: recompiling all apps') {
99− setBootProgress(1.0);
100− setBootMessage('Ship Launched');
101− syncStatus();
102− }
103− if (event.data !== '') {
104− setRunEvents(previous => [...previous, event.data]);
105− }
106− });
107−
108− source.addEventListener(
109− 'error',
110− error => {
111− if (source.readyState === EventSource.CLOSED) {
112− if (retry < 5) {
113− newSource(url, retry + 1);
114− return;
115− }
116− setError(error);
117− }
118− },
119− false
120− );
121− },
122− [setError, startTime, syncStatus]
123− );
124−
125− const getEvents = useCallback(() => {
126− try {
127− if (Nothing.hasInstance(pointCursor) || disabled) {
128− return;
129− }
130− const patp = ob.patp(pointCursor.value);
131− setError(undefined);
132−
133− resetEvents();
134−
135− const url = client.getShipsByPatpUrl(patp) + '/events';
136− newSource(url);
137− } catch (error) {
138− setError(error);
139− }
140− }, [setError, disabled, resetEvents, client, pointCursor, newSource]);
141−
142− syncStatus = useCallback(async () => {
143− try {
144− if (Nothing.hasInstance(pointCursor) || disabled) {
145− return;
146− }
147− const patp = ob.patp(pointCursor.value);
148− setError(undefined);
149−
150− resetEvents();
151−
152− const response = await client.getShipsByPatp(patp);
153−
154− if (response.status === 404) {
155− setStatus(STATE.MISSING);
156− } else if (!response.ok) {
157− setError(response.statusText);
158− } else {
159− const ship = await response.json();
160−
161− if (ship.status === 'Pending') {
162− setStatus(STATE.PENDING);
163− getEvents();
164− } else if (ship.status === 'Running') {
165− setStatus(STATE.RUNNING);
166− } else {
167− setError(ship);
168− }
169− }
170− } catch (error) {
171− setError(error);
172− }
173− }, [
174− client,
175− getEvents,
176− pointCursor,
177− resetEvents,
178− setError,
179− setStatus,
180− disabled,
181− ]);
182−
183− const hostedShipUrl = useMemo(
184− () => `http://${ob.patp(pointCursor.getOrElse('')).slice(1)}.${domain}`,
185− [pointCursor, domain]
186− );
187−
188− const create = useCallback(
189− async keyfile => {
190− try {
191− if (Nothing.hasInstance(pointCursor) || disabled) {
192− return;
193− }
194− const patp = ob.patp(pointCursor.value).slice(1);
195− setError(undefined);
196−
197− setStatus(STATE.PENDING);
198− setBootProgress(0.1);
199−
200− const response = await client.postShips({
201− patp,
202− key: keyfile,
203− debug: true,
204− fake: false,
205− });
206−
207− if (!response.ok) {
208− setError(response.statusText);
209− } else {
210− getEvents();
211− }
212− } catch (error) {
213− setError(error);
214− }
215− },
216− [pointCursor, setError, setStatus, client, getEvents, disabled]
217− );
218−
219− return {
220− error,
221− unknown,
222− missing,
223− running,
224− pending,
225− url: hostedShipUrl,
226−
227− sysEvents,
228− newEvents,
229− runEvents,
230−
231− syncStatus,
232− getEvents,
233− create,
234−
235− bootProgress,
236− bootMessage,
237−
238− disabled,
239− // debugging
240− status,
241− };
242−}
243−
244−export default useHostingStore;
src/types/PointDetailsType.ts → src/types/L1Point.tsrenamed+2−12
@@ -1,15 +1,5 @@
1−// Response returned by azimuth#getPoint
2−export type PointDetails = {
3− 0: string;
4− 1: string;
5− 2: string;
6− 3: string;
7− 4: string;
8− 5: string;
9− 6: string;
10− 7: string;
11− 8: string;
12− 9: string;
1+// Response returned by L1's azimuth#getPoint
2+export type L1Point = {
133 active: boolean;
144 authenticationKey: string;
155 continuityNumber: string;
src/views/UrbitOS/Home.tsx+2−2
@@ -12,7 +12,7 @@ import { ForwardButton } from 'components/Buttons';
1212import NetworkingKeys from 'components/NetworkingKeys';
1313
1414import { useLocalRouter } from 'lib/LocalRouter';
15−import { PointDetails } from 'types/pointDetailsType';
15+import { L1Point } from 'types/L1Point';
1616import AlertBox from 'components/AlertBox';
1717import DownloadKeyfileButton from 'components/DownloadKeyfileButton';
1818import useKeyfileGenerator from 'lib/useKeyfileGenerator';
@@ -24,7 +24,7 @@ export default function UrbitOSHome({ manualNetworkSeed }) {
2424 const { push, names } = useLocalRouter();
2525
2626 const point = need.point(pointCursor);
27− const details: PointDetails = need.details(getDetails(point));
27+ const details: L1Point = need.details(getDetails(point));
2828
2929 const sponsor = ob.patp(details.sponsor);
3030
src/views/UrbitOS/Hosting.tsxdeleted−192
@@ -1,192 +0,0 @@
1−import { useCallback, useMemo } from 'react';
2−import { Grid, SelectInput, Flex } from 'indigo-react';
3−
4−import { CopyButtonWide } from 'components/CopyButton';
5−import { ForwardButton } from 'components/Buttons';
6−import { useHosting } from 'store/hosting';
7−import DownloadKeyfileButton from 'components/DownloadKeyfileButton';
8−import LoginButton from 'components/LoginButton';
9−import ProgressButton from 'components/ProgressButton';
10−import useCurrentPointName from 'lib/useCurrentPointName';
11−import useKeyfileGenerator from 'lib/useKeyfileGenerator';
12−import useLifecycle from 'lib/useLifecycle';
13−import useLocalHosting from 'lib/useLocalHosting';
14−import BridgeForm from 'form/BridgeForm';
15−
16−export function Hosting({ manualNetworkSeed }) {
17− const bind = useKeyfileGenerator(manualNetworkSeed);
18− const { keyfile, code } = bind;
19− const ship = useHosting();
20−
21− const {
22− syncStatus,
23− url,
24− unknown,
25− bootProgress,
26− bootMessage,
27− disabled,
28− } = ship;
29−
30− const { running: localRunning, url: localUrl } = useLocalHosting();
31−
32− let running = useMemo(() => localRunning || ship.running, [
33− ship,
34− localRunning,
35− ]);
36−
37− useLifecycle(() => {
38− syncStatus();
39− });
40−
41− const createShip = useCallback(() => ship.create(keyfile), [keyfile, ship]);
42−
43− const name = useCurrentPointName();
44− const options = [{ text: 'Tlon', value: 'tlon' }];
45−
46− const renderMain = useCallback(() => {
47− if (localRunning) {
48− return (
49− <Grid.Item
50− full
51− as={LoginButton}
52− solid
53− success
54− url={localUrl}
55− code={code}>
56− Open OS
57− </Grid.Item>
58− );
59− }
60− if (ship.running) {
61− return (
62− <>
63− <Grid.Item
64− cols={[1, 9]}
65− as={LoginButton}
66− solid
67− success
68− url={url}
69− code={code}>
70− Open OS
71− </Grid.Item>
72− {/* Unsupported for now */}
73− {/* <Grid.Item cols={[9, 13]} as={Button} className="b-black b1" center> */}
74− {/* Disconnect */}
75− {/* </Grid.Item> */}
76− </>
77− );
78− }
79− if (ship.missing) {
80− return (
81− <Grid.Item
82− full
83− as={ForwardButton}
84− solid
85− disabled={!keyfile}
86− onClick={createShip}>
87− Connect
88− </Grid.Item>
89− );
90− }
91− if (ship.pending) {
92− return (
93− <Grid.Item
94− full
95− as={ProgressButton}
96− success
97− disabled
98− progress={bootProgress}>
99− {bootMessage || 'Connecting'}
100− </Grid.Item>
101− );
102− }
103− }, [
104− localRunning,
105− ship.running,
106− ship.missing,
107− ship.pending,
108− localUrl,
109− code,
110− url,
111− keyfile,
112− createShip,
113− bootProgress,
114− bootMessage,
115− ]);
116−
117− const renderDetails = useCallback(() => {
118− if (ship.running) {
119− return (
120− <>
121− <Grid.Item cols={[1, 9]} className="gray4">
122− <span className="mono">{name}</span> is connected to Tlon
123− </Grid.Item>
124− </>
125− );
126− }
127− if (!keyfile && ship.missing) {
128− return (
129− <Grid.Item full className="gray4">
130− Please reset your networking keys in order to use hosting
131− </Grid.Item>
132− );
133− }
134− }, [name, ship, keyfile]);
135−
136− return (
137− <>
138− {disabled && (
139− <Grid gap={4}>
140− <Grid.Item full className="f5">
141− Urbit OS
142− </Grid.Item>
143− <Grid.Divider />
144− </Grid>
145− )}
146− {!disabled && (
147− <Grid gap={4}>
148− <Grid.Item full className="f5" as={Flex}>
149− <Flex.Item>Urbit OS </Flex.Item>
150− <Flex.Item
151− className={cn({ green3: running, gray4: !running }, 'ml3')}>
152− {running ? 'Connected' : 'Disconnected'}
153− </Flex.Item>
154− </Grid.Item>
155− <BridgeForm initialValues={{ provider: 'tlon' }}>
156− {() => (
157− <>
158− {renderDetails()}
159− {renderMain()}
160− {!localRunning && (
161− <Grid.Item
162− full
163− as={SelectInput}
164− name="provider"
165− label="Host Provider"
166− options={options}
167− disabled
168− />
169− )}
170− </>
171− )}
172− </BridgeForm>
173− </Grid>
174− )}
175− <Grid>
176− <Grid.Item
177− full
178− as={DownloadKeyfileButton}
179− {...bind}
180− className="mt2"
181− detail="A keyfile authenticates your Urbit ID to Urbit OS"
182− />
183− <Grid.Divider />
184− {code && (
185− <Grid.Item full className="mt2" as={CopyButtonWide} text={code}>
186− Login Code
187− </Grid.Item>
188− )}
189− </Grid>
190− </>
191− );
192−}