@@ -0,0 +1,188 @@
1+import { useState, useEffect, useCallback } from 'react';
2+import { Nothing } from 'folktale/maybe';
3+import * as ob from 'urbit-ob';
5+import SolarisClient from 'lib/SolarisClient';
6+import { usePointCursor } from 'store/pointCursor';
14+ QUERYING: 'QUERYING',
16+ CONNECTING: 'CONNECTING',
18+ CONNECTED: 'CONNECTED',
21+function useHostingStore(url) {
22+ const client = new SolarisClient(url);
24+ const { pointCursor } = usePointCursor();
26+ const [state, _setState] = useState(STATE.UNKNOWN);
27+ const setState = useCallback(
35+ const [sysEvents, setSysEvents] = useState([]);
36+ const [newEvents, setNewEvents] = useState([]);
37+ const [runEvents, setRunEvents] = useState([]);
39+ const [error, _setError] = useState();
40+ const setError = useCallback(
44+ setState(STATE.UNKNOWN);
45+ console.error(error);
48+ [_setError, setState]
51+ const unknown = state === STATE.UNKNOWN;
52+ const missing = state === STATE.MISSING;
53+ const running = state === STATE.RUNNING;
54+ const pending = state === STATE.PENDING;
55+ const querying = state === STATE.QUERYING;
56+ const booting = state === STATE.BOOTING;
57+ const connecting = state === STATE.CONNECTING;
58+ const connected = state === STATE.CONNECTED;
60+ const resetEvents = useCallback(() => {
66+ const syncStatus = useCallback(async () => {
68+ if (Nothing.hasInstance(pointCursor)) {
71+ const patp = ob.patp(pointCursor.value);
76+ setState(STATE.QUERYING);
78+ const response = await client.getShipsByPatp(patp);
80+ if (response.status === 404) {
81+ setState(STATE.MISSING);
82+ } else if (!response.ok) {
83+ setError(response.statusText);
85+ const ship = await response.json();
87+ if (ship.status === 'Pending') {
88+ setState(STATE.PENDING);
89+ } else if (ship.status === 'Running') {
90+ setState(STATE.RUNNING);
98+ }, [client, pointCursor, resetEvents, setError, setState]);
100+ const getEvents = useCallback(() => {
102+ if (Nothing.hasInstance(pointCursor)) {
105+ const patp = ob.patp(pointCursor.value);
106+ setError(undefined);
110+ setState(STATE.CONNECTING);
112+ const url = client.getShipsByPatpUrl(patp) + '/events';
113+ const source = new EventSource(url);
115+ source.onopen = () => setState(STATE.CONNECTED);
116+ // source.onerror = () => setState(STATE.UNKNOWN);
117+ // source.onmessage = console.log;
119+ source.addEventListener('sys', event => {
120+ setSysEvents(previous => [...previous, JSON.parse(event.data)]);
123+ source.addEventListener('new', event => {
124+ if (event.data !== '') {
125+ setNewEvents(previous => [...previous, event.data]);
129+ source.addEventListener('run', event => {
130+ if (event.data !== '') {
131+ setRunEvents(previous => [...previous, event.data]);
137+ }, [setError, resetEvents, client, pointCursor, setState]);
139+ const create = useCallback(async () => {
141+ if (Nothing.hasInstance(pointCursor)) {
144+ const patp = ob.patp(pointCursor.value);
145+ setError(undefined);
147+ setState(STATE.BOOTING);
149+ const response = await client.postShips({
155+ setError(response.statusText);
162+ }, [pointCursor, setError, setState, client, getEvents]);
188+export default useHostingStore;